diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3cdfee9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+**/bin/
+**/target/
+**.java._trace
+**git.properties
+**/.antlr-generator-*.jar
+**/target/
+**/.metadata/
+
+**/emf-gen/**/.gitignore
+**/src-gen/**/.gitignore
+**/git.properties
+**/*.java._trace
+**/*.log
+**/*.log.properties
+
+**/bin/
+**/build/
+*.class
+*.ctrl
+**/Debug/
+.DS_Store
+*.ear
+*.war
+
+**/*.actionbin
+**/*.blipbin
+**/*.chartbin
+**/*.cubebin
+**/*.datatypebin
+**/*.dtobin
+**/*.entitybin
+**/*.servicebin
+**/*.tablebin
+**/*.uibin
+**/*.uisemanticbin
+**/*.xtendbin
+
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 6988bb3..cfa7356 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -15,16 +15,19 @@
 <jenkins>
 	<!-- DO NOT EDIT BELOW THIS LINE -->
         <jenkins.build.dependencies>
+                <jenkins.build.dependency>org.eclipse.osbp.blob</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.core.api</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.datainterchange.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ecview.addons</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.persistence</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.utils.blob</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.addons</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.datainterchange</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.entitymock.common</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.i18n</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.xtext.oxtype</jenkins.build.dependency>
         </jenkins.build.dependencies>
 </jenkins>
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.classpath b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.classpath
new file mode 100644
index 0000000..43b9862
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.gitignore b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..f29e940
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.utils.entitymock.dbfill.ui/META-INF/MANIFEST.MF
index 6529952..5dd4585 100644
--- a/org.eclipse.osbp.utils.entitymock.dbfill.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/META-INF/MANIFEST.MF
@@ -5,20 +5,23 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-Vendor: Eclipse OSBP
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Require-Bundle: org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.dsl.dto.lib;bundle-version="[0.9.0,0.10.0)",
+Require-Bundle: org.eclipse.osbp.dsl.dto.lib;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.core.runtime;bundle-version="3.10.0",
  org.eclipse.osgi.services,
  javax.persistence,
- org.eclipse.persistence.core
+ javax.validation.api;bundle-version="1.1.0.Final",
+ org.eclipse.persistence.core,
+ org.eclipse.osbp.gitinfo;bundle-version="0.9.0"
 Bundle-ActivationPolicy: lazy
 OSBP-RuntimeBuilder-BundleSpace: 
 OSBP-ECView-I18nProvider: 
 Service-Component: OSGI-INF/*.xml
 Bundle-Activator: org.eclipse.osbp.utils.entitymock.dbfill.ui.Activator
 Export-Package: org.eclipse.osbp.utils.entitymock.dbfill.ui;version="0.9.0"
-Import-Package: javax.validation,
- org.eclipse.osbp.persistence;version="0.9.0",
+Import-Package: org.eclipse.osbp.core.api.persistence;version="0.9.0",
+ org.eclipse.osbp.datainterchange.api,
  org.eclipse.osbp.preferences;version="0.9.0",
+ org.eclipse.osbp.ui.api.customfields;version="0.9.0",
  org.eclipse.osbp.ui.initialization;version="0.9.0",
+ org.eclipse.osbp.xtext.entitymock.common;version="0.9.0",
  org.slf4j;resolution:=optional
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/OSGI-INF/org.eclipse.osbp.utils.entitymock.dbfill.ui.EntityMockGeneratorConsumer.xml b/org.eclipse.osbp.utils.entitymock.dbfill.ui/OSGI-INF/org.eclipse.osbp.utils.entitymock.dbfill.ui.EntityMockGeneratorConsumer.xml
index 40352da..17a8a25 100644
--- a/org.eclipse.osbp.utils.entitymock.dbfill.ui/OSGI-INF/org.eclipse.osbp.utils.entitymock.dbfill.ui.EntityMockGeneratorConsumer.xml
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/OSGI-INF/org.eclipse.osbp.utils.entitymock.dbfill.ui.EntityMockGeneratorConsumer.xml
@@ -3,7 +3,10 @@
    <service>
       <provide interface="org.eclipse.osbp.ui.initialization.IInitializationProvider"/>
    </service>
-   <reference bind="bindMockDataGenerator" cardinality="0..n" interface="org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator" name="MockDataGenerator" policy="dynamic" unbind="unbindMockDataGenerator"/>
-   <reference bind="bindPersistenceService" cardinality="1..1" interface="org.eclipse.osbp.persistence.IPersistenceService" name="PersistenceService" policy="static" unbind="unbindPersistenceService"/>
+   <reference bind="bindBlobService" cardinality="1..1" interface="org.eclipse.osbp.ui.api.customfields.IBlobService" name="BlobService" policy="static" unbind="unbindBlobService"/>
+   <reference bind="bindDataInterchange" cardinality="0..1" interface="org.eclipse.osbp.datainterchange.api.IDataInterchange" name="DataInterchange" policy="dynamic" unbind="unbindDataInterchange"/>
+   <reference bind="bindEventDispatcher" cardinality="0..1" interface="org.eclipse.osbp.runtime.common.event.IEventDispatcher" name="EventDispatcher" policy="dynamic" unbind="unbindEventDispatcher"/>
+   <reference bind="bindMockDataGenerator" cardinality="0..n" interface="org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataGenerator" name="MockDataGenerator" policy="dynamic" unbind="unbindMockDataGenerator"/>
+   <reference bind="bindPersistenceService" cardinality="1..1" interface="org.eclipse.osbp.core.api.persistence.IPersistenceService" name="PersistenceService" policy="static" unbind="unbindPersistenceService"/>
    <implementation class="org.eclipse.osbp.utils.entitymock.dbfill.ui.EntityMockGeneratorConsumer"/>
 </scr:component>
\ No newline at end of file
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/Activator.java b/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/Activator.java
index 8892903..d011bea 100644
--- a/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/Activator.java
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/Activator.java
@@ -12,20 +12,15 @@
  */
 package org.eclipse.osbp.utils.entitymock.dbfill.ui;
 
-import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osbp.gitinfo.Loginfo;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
-public class Activator extends Plugin implements BundleActivator {
+public class Activator implements BundleActivator {
 
 	private static BundleContext context;
 
-	public Activator() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public static BundleContext getContext() {
+	static BundleContext getContext() {
 		return context;
 	}
 
@@ -34,9 +29,9 @@
 	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
 	 */
 	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
+		Loginfo li = new Loginfo();
+		li.print( Activator.class.getCanonicalName(), Activator.class.getClassLoader());
 		Activator.context = bundleContext;
-		System.err.println(Activator.class.getCanonicalName()+": started");
 	}
 
 	/*
@@ -44,9 +39,7 @@
 	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
 	 */
 	public void stop(BundleContext bundleContext) throws Exception {
-		super.stop(bundleContext);
 		Activator.context = null;
-		System.err.println(Activator.class.getCanonicalName()+": stopped");
 	}
 
 }
diff --git a/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/EntityMockGeneratorConsumer.java b/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/EntityMockGeneratorConsumer.java
index a9a5805..0d64582 100644
--- a/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/EntityMockGeneratorConsumer.java
+++ b/org.eclipse.osbp.utils.entitymock.dbfill.ui/src/org/eclipse/osbp/utils/entitymock/dbfill/ui/EntityMockGeneratorConsumer.java
@@ -14,30 +14,37 @@
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.sql.BatchUpdateException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.TreeMap;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.RollbackException;
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 
+import org.eclipse.osbp.core.api.persistence.IPersistenceService;
+import org.eclipse.osbp.datainterchange.api.IDataInterchange;
 import org.eclipse.osbp.dsl.dto.lib.impl.DtoServiceAccess;
-import org.eclipse.osbp.dsl.dto.lib.services.IDTOService;
-import org.eclipse.osbp.dsl.dto.lib.services.IDTOServiceWithMutablePersistence;
-import org.eclipse.osbp.persistence.IPersistenceService;
 import org.eclipse.osbp.preferences.ProductConfiguration;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.runtime.common.filter.IDTOService;
+import org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence;
+import org.eclipse.osbp.ui.api.customfields.IBlobService;
 import org.eclipse.osbp.ui.initialization.AbstractInitializationListener;
 import org.eclipse.osbp.ui.initialization.AbstractInitializationProvider;
 import org.eclipse.osbp.ui.initialization.IInitializationProvider;
 import org.eclipse.osbp.ui.initialization.InitializationNotification;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataDbFiller;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator;
-import org.eclipse.osbp.utils.entitymock.MockedEntityDto;
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller;
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataGenerator;
+import org.eclipse.osbp.xtext.entitymock.common.MockedEntityDto;
 import org.eclipse.persistence.config.PessimisticLock;
 import org.eclipse.persistence.config.QueryHints;
 import org.osgi.service.component.ComponentContext;
@@ -51,6 +58,10 @@
 @Component(service = IInitializationProvider.class, immediate = true)
 public class EntityMockGeneratorConsumer extends AbstractInitializationProvider implements IEntityMockDataDbFiller {
 
+	private static final String NULL = "<null>";
+
+	private static final String PERSIST = "persist ";
+
 	/**
 	 * Map using the generator as index and a boolean as a value.<br>
 	 * The index (generator) defines the position inside the map by
@@ -59,7 +70,8 @@
 	 * <li>the simple class name for identical run priorities</li>
 	 * </ul>
 	 */
-	public final class PriorityGeneratorMap extends TreeMap<IEntityMockDataGenerator, Boolean> implements Comparator<IEntityMockDataGenerator> {
+	public final class PriorityGeneratorMap extends TreeMap<IEntityMockDataGenerator, Boolean>
+			implements Comparator<IEntityMockDataGenerator> {
 
 		private static final long serialVersionUID = 1951758628543477475L;
 
@@ -68,19 +80,21 @@
 			return arg0.compareTo(arg1);
 		}
 	}
-	
-	private final static Logger log = LoggerFactory
-			.getLogger(EntityMockGeneratorConsumer.class);
+
+	private static final Logger log = LoggerFactory.getLogger("mock");
 
 	/**
 	 * map of existing generators. The boolean value defines
 	 * <ul>
 	 * <li><code>false</code> if the generator must run</li>
 	 * <li><code>true</code> if the generator has been done already</li>
-	 * </ul>  
+	 * </ul>
 	 */
 	private final PriorityGeneratorMap generatorDoneStates = new PriorityGeneratorMap();
 	private IPersistenceService persistenceService;
+	private IDataInterchange dataInterchange;
+	private IEventDispatcher eventDispatcher;
+	private IBlobService blobService;
 	private String mockDataGeneratorFilter = null;
 	private boolean alreadyRun = false;
 	private int totalSteps = 0;
@@ -97,12 +111,14 @@
 
 	@Override
 	public void setMockDataGeneratorFilter(String filter) {
-		if (filter == null) {
-			mockDataGeneratorFilter = "";
-		} else {
-			mockDataGeneratorFilter = filter;
+		if (mockDataGeneratorFilter == null || (mockDataGeneratorFilter != null && !mockDataGeneratorFilter.equals(filter)) ) {
+			if (filter == null) {
+				mockDataGeneratorFilter = "";
+			} else {
+				mockDataGeneratorFilter = filter;
+			}
+			triggerAllKnownFills();
 		}
-		triggerAllKnownFills();
 	}
 
 	public EntityMockGeneratorConsumer() {
@@ -110,12 +126,10 @@
 	}
 
 	@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
-	public synchronized void bindMockDataGenerator(
-			final IEntityMockDataGenerator generator) {
+	public synchronized void bindMockDataGenerator(final IEntityMockDataGenerator generator) {
 		generatorDoneStates.put(generator, false);
-		calculateInitializationTotalSteps();		
-		log.debug("IEntityMockDataGenerator '{}' bound", generator.getClass()
-				.getCanonicalName());
+		calculateInitializationTotalSteps();
+		log.debug("IEntityMockDataGenerator '{}' bound", generator.getClass().getCanonicalName());
 		if (context != null) {
 			try {
 				triggerSingleFill(generator);
@@ -125,44 +139,64 @@
 		}
 	}
 
-	public synchronized void unbindMockDataGenerator(
-			final IEntityMockDataGenerator generator) {
+	public synchronized void unbindMockDataGenerator(final IEntityMockDataGenerator generator) {
 		generatorDoneStates.remove(generator);
-		calculateInitializationTotalSteps();		
-		log.debug("IEntityMockDataGenerator '{}' unbound", generator.getClass()
-				.getCanonicalName());
+		calculateInitializationTotalSteps();
+		log.debug("IEntityMockDataGenerator '{}' unbound", generator.getClass().getCanonicalName());
 	}
 
 	@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
 	public synchronized void bindPersistenceService(final IPersistenceService persistenceService) {
-		setMockDataGeneratorFilter(System
-				.getProperty("mockDataGeneratorFilter"));
+		setMockDataGeneratorFilter(System.getProperty("mockDataGeneratorFilter"));
 		this.persistenceService = persistenceService;
 		log.debug("PersistenceService '{}' bound", persistenceService.getClass().getCanonicalName());
 	}
 
+	public synchronized void unbindPersistenceService(final IPersistenceService persistenceService) { // NOSONAR
+		this.persistenceService = null;
+	}
+
+	@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
+	public synchronized void bindDataInterchange(final IDataInterchange dataInterchange) {
+		this.dataInterchange = dataInterchange;
+		log.debug("DataInterchange '{}' bound", dataInterchange.getClass().getCanonicalName());
+	}
+
+	public synchronized void unbindDataInterchange(final IDataInterchange dataInterchange) { // NOSONAR
+		this.dataInterchange = null;
+	}
+
+	@Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
+	public synchronized void bindEventDispatcher(final IEventDispatcher eventDispatcher) {
+		this.eventDispatcher = eventDispatcher;
+		log.debug("EventDispatcher '{}' bound", eventDispatcher.getClass().getCanonicalName());
+	}
+
+	public synchronized void unbindEventDispatcher(final IEventDispatcher eventDispatcher) { // NOSONAR
+		this.eventDispatcher = null;
+	}
+
+	@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
+	public synchronized void bindBlobService(final IBlobService blobService) {
+		this.blobService = blobService;
+		log.debug("BlobService '{}' bound", blobService.getClass().getCanonicalName());
+	}
+
+	public synchronized void unbindBlobService(final IBlobService blobService) { // NOSONAR
+		this.blobService = null;
+	}
+
 	@Override
 	public void addInitializationListener(AbstractInitializationListener listener) {
 		super.addInitializationListener(listener);
-		try {
-			triggerAllKnownFills();
-		} catch (Exception e) {
-			log.error(e.toString());
-		}
 	}
 
 	public void activate(ComponentContext context) {
 		this.context = context;
 	}
 
-	public synchronized void unbindPersistenceService(
-			final IPersistenceService persistenceService) {
-		this.persistenceService = null;
-		log.debug("PersistenceService '{}' unbound", persistenceService.getClass().getCanonicalName());
-	}
-
 	private static ArrayList<Method> findGetters(Class<?> c) {
-		ArrayList<Method> list = new ArrayList<Method>();
+		ArrayList<Method> list = new ArrayList<>();
 		Method[] methods = c.getDeclaredMethods();
 		for (Method method : methods) {
 			if (isGetter(method)) {
@@ -173,14 +207,11 @@
 	}
 
 	private static boolean isGetter(Method method) {
-		if (Modifier.isPublic(method.getModifiers())
-				&& method.getParameterTypes().length == 0) {
-			if (method.getName().matches("^get[A-Z].*")
-					&& !method.getReturnType().equals(void.class)) {
+		if (Modifier.isPublic(method.getModifiers()) && method.getParameterTypes().length == 0) {
+			if (method.getName().matches("^get[A-Z].*") && !method.getReturnType().equals(void.class)) {
 				return true;
 			}
-			if (method.getName().matches("^is[A-Z].*")
-					&& method.getReturnType().equals(boolean.class)) {
+			if (method.getName().matches("^is[A-Z].*") && method.getReturnType().equals(boolean.class)) {
 				return true;
 			}
 		}
@@ -194,250 +225,173 @@
 				log.info("ignore, because it has been running already");
 			} else {
 				alreadyRun = true;
-				log.info("MockDataGenerator Filter=" + mockDataGeneratorFilter);
+				log.info("MockDataGenerator Filter={}", mockDataGeneratorFilter);
 				triggerAllKnownFills();
 			}
 		}
 	}
 
 	protected void triggerAllKnownFills() {
-		if	(persistenceService != null) {
-			Thread thread = new Thread() {
-				@Override
-				public synchronized void run() {
-					int countFillRuns = 0;
-					int totalDone = 0;
-					do {
-						log.info("STEP START...");
-						countFillRuns = 0;
-						for (IEntityMockDataGenerator generator : generatorDoneStates.keySet()) {
-							boolean run = triggerSingleFill(generator);
-							log.info(generator.getClass().getCanonicalName()+" -> "+run);
-							if	(run) {
-								countFillRuns += 1;
-								totalDone += 1;
-							}
+		Thread thread = new Thread() {
+			@Override
+			public synchronized void run() {
+				int countFillRuns = 0;
+				int totalDone = 0;
+				do {
+					log.info("STEP START...");
+					countFillRuns = 0;
+					for (IEntityMockDataGenerator generator : generatorDoneStates.keySet()) {
+						boolean run = triggerSingleFill(generator);
+						log.info("{} -> {}", generator.getClass().getCanonicalName(), run);
+						if (run) {
+							countFillRuns += 1;
+							totalDone += 1;
 						}
-						log.info("STEP done with "+countFillRuns+" done");
-					} while (countFillRuns > 0);
-					if	(totalDone > 0) {
-						notifyInitializationDone();
 					}
-					log.info("TRIGGER DONE...");
+					log.info("STEP done with {} done", countFillRuns);
+				} while (countFillRuns > 0);
+				if (totalDone > 0) {
+					notifyInitializationDone();
 				}
-			};
-			thread.start();
-		}
+				log.info("TRIGGER DONE...");
+			}
+		};
+		thread.start();
 	}
 
 	protected boolean triggerSingleFill(IEntityMockDataGenerator generator) {
 		boolean singleFillRun = false;
 		try {
 			singleFillRun = _triggerSingleFill(generator);
-		}
-		catch (Exception e) {
+		} catch (Exception e) {
 			log.error("triggerSingleFill: " + generator.getClass().getCanonicalName(), e);
 		}
 		return singleFillRun;
 	}
-	
-	private boolean _triggerSingleFill(IEntityMockDataGenerator generator) {
-		boolean singleFillDone;
+
+	private boolean _triggerSingleFill(IEntityMockDataGenerator generator) { // NOSONAR
+		boolean singleFillDone = false;
 		if ((mockDataGeneratorFilter != null) && (persistenceService != null)
-				&& generatorDoneStates.containsKey(generator)
-				&& !generatorDoneStates.get(generator)) {
-			if (mockDataGeneratorFilter.contains("*")
-					|| mockDataGeneratorFilter.contains(generator.getClass()
-							.getCanonicalName())) {
-
-				String lastDone = ProductConfiguration
-						.isMockDataGeneratorDone(generator);
-
-				if (mockDataGeneratorFilter.contains("NEVER-*")
-						|| mockDataGeneratorFilter.contains("NEVER-"
-								+ generator.getClass().getCanonicalName())) {
-					lastDone = "NEVER " + lastDone;
-				}
-
-				if (mockDataGeneratorFilter.contains("FORCE-*")
-						|| mockDataGeneratorFilter.contains("FORCE-"
-								+ generator.getClass().getCanonicalName())) {
-					if (lastDone != null && !lastDone.isEmpty()) {
-						log.debug("force   generator: "
-								+ generator.getClass().getCanonicalName()
-								+ " even already done at " + lastDone
-								+ " because of option FORCE");
-					}
-					lastDone = null;
-				}
-
-				if (lastDone != null && !lastDone.isEmpty()) {
-					log.debug("ignore  generator: "
-							+ generator.getClass().getCanonicalName()
-							+ " because already done at " + lastDone);
-					generatorDoneStates.put(generator, true);
-					singleFillDone = false;
-				} else {
-					log.debug("running generator: "
-							+ generator.getClass().getCanonicalName());
-					log.debug("run data interchanges");
-					generator.runDataInterchanges(persistenceService, this);
-
-					log.debug("generate mock data");
-					Map<MockedEntityDto, List<Object>> result = generator
-							.getMockData(this);
-
-					// --- just preview of mock data ---
-					if (log.isTraceEnabled()) {
-						for (MockedEntityDto mockedEntityDto : result.keySet()) {
-							List<Object> resultEntities = result
-									.get(mockedEntityDto);
-							Class<?> resultClass = mockedEntityDto
-									.getEntityDtoClass();
-							String persistenceUnit = mockedEntityDto
-									.getPersistenceUnit();
-							log.trace("--> " + resultClass.getCanonicalName()
-									+ " @ " + persistenceUnit + ": "
-									+ resultEntities.size() + " entities");
-						}
+				&& generatorDoneStates.containsKey(generator) && !generatorDoneStates.get(generator)) {
+			List<String> mocks = Arrays.asList(mockDataGeneratorFilter.split(","));
+			for (String mock : mocks) {
+				if (mock.contains("*") || generator.getClass().getCanonicalName()
+						.contains(mock.replace("FORCE-", "").replace("NEVER-", ""))) {
+					StringBuilder lastDone = new StringBuilder();
+					lastDone.append(ProductConfiguration.isMockDataGeneratorDone(generator));
+					if (mock.startsWith("NEVER-")) {
+						lastDone.insert(0, "NEVER ");
 					}
 
-					// ---
-					for (MockedEntityDto mockedEntityDto : result.keySet()) {
+					if (mock.startsWith("FORCE-")) {
+						log.debug("force generator: {} even already done at {} because of option FORCE",
+								generator.getClass().getCanonicalName(), lastDone.toString()); // NOSONAR
+						lastDone.setLength(0);
+					}
+					if (lastDone.length() > 0) {
+						log.debug("ignore  generator: {}  because already done at  {}",
+								generator.getClass().getCanonicalName(), lastDone.toString()); // NOSONAR
+						generatorDoneStates.put(generator, true);
+					} else {
+						log.debug("running generator: {}", generator.getClass().getCanonicalName());
+						log.debug("run data interchanges");
+						generator.runDataInterchanges(persistenceService, dataInterchange, eventDispatcher, blobService, this);
 
-						List<Object> resultEntities = result
-								.get(mockedEntityDto);
-						Class<?> resultClass = mockedEntityDto
-								.getEntityDtoClass();
-						String persistenceUnit = mockedEntityDto
-								.getPersistenceUnit();
-						log.trace("------ " + resultClass.getCanonicalName()
-								+ " @ " + persistenceUnit + ": "
-								+ resultEntities.size() + " entities");
-						String[] tokens = resultClass.getName().replace("Dto", "").split("\\.");
-						String shortClassName = "";
-						for	(int i = 0; i < tokens.length-1; i++) {
-							shortClassName += tokens[i].charAt(0)+".";
+						log.debug("generate mock data");
+						Map<MockedEntityDto, List<Object>> result = generator.getMockData(this, persistenceService, blobService);
+
+						// --- just preview of mock data ---
+						if (log.isTraceEnabled()) {
+							for (Entry<MockedEntityDto, List<Object>> entrySet : result.entrySet()) {
+								List<Object> resultEntities = entrySet.getValue();
+								Class<?> resultClass = entrySet.getKey().getEntityDtoClass();
+								String persistenceUnit = entrySet.getKey().getPersistenceUnit();
+								log.trace("--> {} @ {} :{} entities", resultClass.getCanonicalName(), persistenceUnit,
+										resultEntities.size());
+							}
 						}
-						shortClassName += tokens[tokens.length-1];
-						notifyInitializationStep("persist "+shortClassName, 1, 0.3);
-						IDTOService dtoService = null;
-						EntityManager em = null;
-						try {
-							persistenceService.registerPersistenceUnit(persistenceUnit, resultClass);
-							EntityManagerFactory emf = persistenceService.getEntityManagerFactory(persistenceUnit);
-							if	(emf == null) {
-								log.error(
-										"maybe EMF is not set?!? - while updating instance of "
-												+ resultClass.getCanonicalName()
-												+ " in persistence "
-												+ persistenceUnit);
-							}
-							em = emf.createEntityManager();
-				    		em.getTransaction().begin();
-				    		em.setProperty(QueryHints.PESSIMISTIC_LOCK, PessimisticLock.Lock);
-							// IDTOServiceWithMutablePersistence<Object>
-							// dtoService =
-							// (IDTOServiceWithMutablePersistence<Object>)
-							// DtoServiceAccess.getService(resultClass);
-							dtoService = (IDTOService) DtoServiceAccess
-									.getService(resultClass);
-							if (dtoService instanceof IDTOServiceWithMutablePersistence) {
-								((IDTOServiceWithMutablePersistence) dtoService)
-										.setPersistenceId(persistenceUnit);
-							}
-							// TODO hint! as of 20.05.2015 in the model services
-							// file, EVERY dtoservice has to contain 'mutable
-							// persistenceID foodmart'
-							else {
-								log.error(resultClass.getCanonicalName()
-										+ " in persistence "
-										+ persistenceUnit
-										+ ": as of 20.05.2015 in the model services file, EVERY dtoservice has to contain 'mutable persistenceID foodmart'");
-							}
 
-							if (dtoService == null) {
-								log.error("NO DTO SERVICE FOUND for "
-										+ resultClass.getCanonicalName()
-										+ " in persistence " + persistenceUnit);
-							} else {
-								int total = resultEntities.size();
-								int count = 0;
-								long lastStep = System.currentTimeMillis();
-								notifyInitializationStep("persist "+shortClassName, 0, 0.4, count, total);
-								for (Object dtoObject : resultEntities) {
-									try {
-										dtoService.update(resultClass
-												.cast(dtoObject));
-									}
-									catch (ConstraintViolationException cve) {
-										log.error(shortClassName+" #"+(count+1)+"/"+total+": "+cve.getLocalizedMessage());
-										for	(ConstraintViolation violation : cve.getConstraintViolations()) {
-											Object value = violation.getInvalidValue();
-											if	(value == null) {
-												value = "<null>";
-											}
-											log.error("- property:"
-												+violation.getLeafBean().toString()+"."+violation.getPropertyPath().toString()
-												+" value:'"+value.toString()
-												+" violation:"+violation.getMessage());
-										}
-									}
-									count++;
-									long thisStep = System.currentTimeMillis();
-									if	((count % getInitializationSubStepNotifySize() == 0) || (thisStep-lastStep > 2500)) {
-										lastStep = System.currentTimeMillis();
-										notifyInitializationStep("persist "+shortClassName, 0.4, 0.5, count, total);
-									}
+						// ---
+						for (Entry<MockedEntityDto, List<Object>> entrySet : result.entrySet()) {
+							List<Object> resultEntities = entrySet.getValue();
+							Class<?> resultClass = entrySet.getKey().getEntityDtoClass();
+							String persistenceUnit = entrySet.getKey().getPersistenceUnit();
+							log.trace("------ {} @ {} :{} entities", resultClass.getCanonicalName(), persistenceUnit,
+									resultEntities.size());
+							String[] tokens = resultClass.getName().replace("Dto", "").split("\\.");
+							StringBuilder shortClassName = new StringBuilder();
+							for (int i = 0; i < tokens.length - 1; i++) {
+								shortClassName.append(tokens[i].charAt(0) + ".");
+							}
+							shortClassName.append(tokens[tokens.length - 1]);
+							notifyInitializationStep(PERSIST + shortClassName, 1, 0.3);
+							IDTOService<?> dtoService = DtoServiceAccess.getService(resultClass);
+							((IDTOServiceWithMutablePersistence<?>) dtoService).setPersistenceId(persistenceUnit);
+							int total = resultEntities.size();
+							int count = 0;
+							long lastStep = System.currentTimeMillis();
+							notifyInitializationStep(PERSIST + shortClassName, 0, 0.4, count, total);
+							for (Object dtoObject : resultEntities) {
+								updateResults(resultClass, shortClassName.toString(), dtoService, total, count,
+										dtoObject);
+								count++;
+								long thisStep = System.currentTimeMillis();
+								if ((count % getInitializationSubStepNotifySize() == 0)
+										|| (thisStep - lastStep > 2500)) {
+									lastStep = System.currentTimeMillis();
+									notifyInitializationStep(PERSIST + shortClassName, 0.4, 0.5, count, total);
 								}
-								notifyInitializationStep("persist "+shortClassName, 0, 0.9, count, total);
 							}
-				    		em.getTransaction().commit();
-				    		
+							notifyInitializationStep(PERSIST + shortClassName, 0, 0.9, count, total);
 							logTraceEntities(resultEntities, resultClass);
-				    		
-						} catch (NullPointerException npe) {
-							if	(em != null) {
-								em.getTransaction().rollback();
-							}
-							log.error(
-									"maybe EMF is not set?!? - while updating instance of "
-											+ resultClass.getCanonicalName()
-											+ " in persistence "
-											+ persistenceUnit, npe);
-						} catch (Exception e) {
-							if	(em != null) {
-								em.getTransaction().rollback();
-							}
-							log.error("while updating instance of "
-									+ resultClass.getCanonicalName()
-									+ " in persistence " + persistenceUnit, e);
 						}
-						if	(em != null) {
-				    		em.close();
-						}
+						generatorDoneStates.put(generator, true);
+						ProductConfiguration.setMockDataGeneratorDone(generator);
+						singleFillDone = true;
 					}
-					generatorDoneStates.put(generator, true);
-					ProductConfiguration.setMockDataGeneratorDone(generator);
-					singleFillDone = true;
+				} else {
+					log.info("ignore  generator: " + generator.getClass().getCanonicalName());
 				}
-			} else {
-				log.info("ignore  generator: "
-						+ generator.getClass().getCanonicalName());
-				singleFillDone = false;
 			}
 		}
-		else {
-			singleFillDone = false;
-		}
 		return singleFillDone;
 	}
 
-	private void logTraceEntities(List<Object> resultEntities,
-			Class<?> resultClass) {
+	@SuppressWarnings("unchecked")
+	private void updateResults(Class<?> resultClass, String shortClassName, IDTOService dtoService, int total,
+			int count, Object dtoObject) {
+		try {
+			dtoService.update(resultClass.cast(dtoObject));
+		} catch (Exception e) { // NOSONAR
+			// NOSONAR
+		}
+		// } catch (ConstraintViolationException e) {
+		// log.error(shortClassName + " #" + (count + 1) + "/" + total + ": " +
+		// e.getLocalizedMessage());
+		// for (ConstraintViolation<?> violation : e.getConstraintViolations())
+		// {
+		// Object value = violation.getInvalidValue();
+		// if (value == null) {
+		// value = NULL;
+		// }
+		// log.error("- property:" + violation.getLeafBean().toString() + "." +
+		// violation.getPropertyPath().toString() + " value:'"
+		// + value.toString() + " violation:" + violation.getMessage());
+		// }
+		// } catch (RollbackException e) {
+		// //log.error(shortClassName + " #" + (count + 1) + "/" + total + ": "
+		// + e.getLocalizedMessage());
+		// } catch (BatchUpdateException e) {
+		// //log.error(shortClassName + " #" + (count + 1) + "/" + total + ": "
+		// + e.getLocalizedMessage());
+		// }
+
+	}
+
+	private void logTraceEntities(List<Object> resultEntities, Class<?> resultClass) { // NOSONAR
 		if (log.isTraceEnabled()) {
 			List<Method> getters = findGetters(resultClass);
-			Map<String, Integer> columns = new HashMap<String, Integer>();
+			Map<String, Integer> columns = new HashMap<>();
 			for (Method getter : getters) {
 				String column = getter.getName().substring(3);
 				columns.put(column, column.length());
@@ -447,46 +401,48 @@
 					try {
 						String column = getter.getName().substring(3);
 						Object value = getter.invoke(entity, (Object[]) null);
-						String text = (value == null ? "<null>" : value.toString());
+						String text = (value == null ? NULL : value.toString());
 						text = text.replace("\n", "\\n");
 						if (text.length() > columns.get(column)) {
 							columns.put(column, text.length());
 						}
-					} catch (Exception e) {
+					} catch (Exception e) { // NOSONAR
 					}
 				}
 			}
-			{
-				String line = "ID  ";
-				for (Method getter : getters) {
-					String column = getter.getName().substring(3);
-					line += "|" + String.format("%-" + columns.get(column) + "s", column);
-				}
-				log.trace(line);
+			StringBuilder line = new StringBuilder();
+			line.append("ID  ");
+			for (Method getter : getters) {
+				String column = getter.getName().substring(3);
+				String formatter = "%-" + columns.get(column) + "s";
+				line.append("|").append(String.format(formatter, column));
 			}
+			log.trace(line.toString());
 			int id = 0;
 			for (Object entity : resultEntities) {
 				id += 1;
-				String line = String.format("%-4d", id);
+				StringBuilder line2 = new StringBuilder();
+				line2.append(String.format("%-4d", id));
 				for (Method getter : getters) {
 					try {
 						String column = getter.getName().substring(3);
-						Object value = getter.invoke(entity,(Object[]) null);
-						String text = (value == null ? "<null>" : value.toString());
+						Object value = getter.invoke(entity, (Object[]) null);
+						String text = (value == null ? NULL : value.toString());
 						text = text.replace("\n", "\\n");
-						line += "|" + String.format("%-"+ columns.get(column)+ "s", text);
-					} catch (Exception e) {
+						String formatter = "%-" + columns.get(column) + "s";
+						line2.append("|").append(String.format(formatter, text));
+					} catch (Exception e) { // NOSONAR
 					}
 				}
-				log.trace(line);
+				log.trace(line2.toString());
 			}
 		}
 	}
 
 	@Override
 	public boolean hasInitializationToBeDone() {
-		for (IEntityMockDataGenerator generator : generatorDoneStates.keySet()) {
-			if	(!generatorDoneStates.get(generator)) {
+		for (Entry<IEntityMockDataGenerator, Boolean> entrySet : generatorDoneStates.entrySet()) {
+			if (!entrySet.getValue()) {
 				return true;
 			}
 		}
@@ -496,21 +452,21 @@
 	private void calculateInitializationTotalSteps() {
 		totalSteps = 0;
 		stepsDone = 0;
-		for (IEntityMockDataGenerator generator : generatorDoneStates.keySet()) {
+		for (Entry<IEntityMockDataGenerator, Boolean> entrySet : generatorDoneStates.entrySet()) {
 			int steps =
-				// --- each data interchange
-				generator.getDataInterchangeSteps()
-				// --- each entity mock generating
-				+ generator.getEntityMockSteps()
-				// --- each entity persisting
-				+ generator.getEntityMockSteps();
+					// --- each data interchange
+					entrySet.getKey().getDataInterchangeSteps()
+							// --- each entity mock generating
+							+ entrySet.getKey().getEntityMockSteps()
+							// --- each entity persisting
+							+ entrySet.getKey().getEntityMockSteps();
 			totalSteps += steps;
-			if	(generatorDoneStates.get(generator)) {
+			if (entrySet.getValue()) {
 				stepsDone += steps;
 			}
 		}
 	}
-	
+
 	@Override
 	public int getInitializationTotalSteps() {
 		return totalSteps;
@@ -523,21 +479,28 @@
 
 	@Override
 	public void notifyInitializationDone() {
-		if	(log.isDebugEnabled()) { log.debug("initialization done"); }
+		if (log.isDebugEnabled()) {
+			log.debug("initialization done");
+		}
 		super.notifyInitializationDone();
 	}
 
 	@Override
 	public void notifyInitializationStep(String stepTitle, int addSteps, double progressOfStep) {
 		stepsDone += addSteps;
-		InitializationNotification notification = new InitializationNotification(this, stepTitle, stepsDone, progressOfStep);
-		if	(log.isDebugEnabled()) { log.debug("initialization: "+notification.getRecommendedProgressTitle(true)); }
+		InitializationNotification notification = new InitializationNotification(this, stepTitle, stepsDone,
+				progressOfStep);
+		if (log.isDebugEnabled()) {
+			log.debug("initialization: " + notification.getRecommendedProgressTitle(true));
+		}
 		notifyInitializationStep(notification);
 	}
 
 	@Override
-	public void notifyInitializationStep(String stepTitle, double progressOfStep, double sizeOfSubProgress, int count, int total) {
-		notifyInitializationStep(stepTitle+" "+count+"/"+total, 0, (progressOfStep + sizeOfSubProgress*(double)count/(double)total));
+	public void notifyInitializationStep(String stepTitle, double progressOfStep, double sizeOfSubProgress, int count,
+			int total) {
+		notifyInitializationStep(stepTitle + " " + count + "/" + total, 0,
+				(progressOfStep + sizeOfSubProgress * (double) count / (double) total));
 	}
 
 	@Override
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/.gitignore b/org.eclipse.osbp.xtext.entitymock.feature/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.feature/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/feature.xml b/org.eclipse.osbp.xtext.entitymock.feature/feature.xml
index 47d88be..52efc10 100644
--- a/org.eclipse.osbp.xtext.entitymock.feature/feature.xml
+++ b/org.eclipse.osbp.xtext.entitymock.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.xtext.entitymock.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.xtext.entitymock">
         
     <description>
         %description
@@ -43,6 +44,13 @@
         unpack="false"/>
         
     <plugin
+        id="org.eclipse.osbp.xtext.entitymock.ide"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
         id="org.eclipse.osbp.xtext.entitymock.ui"
         download-size="0"
         install-size="0"
diff --git a/org.eclipse.osbp.xtext.entitymock.feature/pom.xml b/org.eclipse.osbp.xtext.entitymock.feature/pom.xml
index 7f60d84..bba774c 100644
--- a/org.eclipse.osbp.xtext.entitymock.feature/pom.xml
+++ b/org.eclipse.osbp.xtext.entitymock.feature/pom.xml
@@ -87,6 +87,13 @@
             <artifactId>org.eclipse.osbp.xtext.entitymock.tests</artifactId>
             <version>0.9.0-SNAPSHOT</version>
         </dependency>
+		<dependency>
+			<groupId>org.eclipse.osbp.dependencies</groupId>
+			<artifactId>
+				org.eclipse.osbp.dependencies.bundle.activemq.all.osgi
+			</artifactId>
+			<version>5.14.5-SNAPSHOT</version>
+		</dependency>
     </dependencies>
 
 </project>
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.classpath b/org.eclipse.osbp.xtext.entitymock.ide/.classpath
new file mode 100644
index 0000000..5903347
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.project b/org.eclipse.osbp.xtext.entitymock.ide/.project
new file mode 100644
index 0000000..1ddf80d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.entitymock.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.babel.editor.rbeBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.babel.editor.rbeNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..5da8aa3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,10 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.entitymock.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..14472ac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.entitymock.ide
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.entitymock.ide;singleton:=true
+Bundle-Classpath: .,src/,src-gen/
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.antlr.runtime,
+ org.eclipse.xtext.xbase.ide,
+ org.eclipse.xtext.ide,
+ org.eclipse.osbp.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.entitymock;bundle-version="[0.9.0,0.10.0)"
+Export-Package: org.eclipse.osbp.xtext.entitymock.ide,
+ org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr,
+ org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal
+
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/build.properties b/org.eclipse.osbp.xtext.entitymock.ide/build.properties
new file mode 100644
index 0000000..6ef1a59
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+				.,\
+               src/,\
+               src-gen/
+source.. = src/,src-gen/
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/pom.xml b/org.eclipse.osbp.xtext.entitymock.ide/pom.xml
new file mode 100644
index 0000000..e741f20
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--#======================================================================= -->
+<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) -->
+<!--# All rights reserved. This program and the accompanying materials -->
+<!--# are made available under the terms of the Eclipse Public License v1.0 -->
+<!--# which accompanies this distribution, and is available at -->
+<!--# http://www.eclipse.org/legal/epl-v10.html -->
+<!--# -->
+<!--# Contributors: -->
+<!--#     Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation -->
+<!--#======================================================================= -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eclipse.osbp.xtext.entitymock</groupId>
+        <artifactId>org.eclipse.osbp.xtext.entitymock.aggregator</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>org.eclipse.osbp.xtext.entitymock.ide</artifactId>
+    <packaging>eclipse-plugin</packaging>
+
+</project>
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup
new file mode 100644
index 0000000..4ff5dcb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup
@@ -0,0 +1 @@
+org.eclipse.osbp.xtext.entitymock.ide.EntityMockDSLIdeSetup
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/AbstractEntityMockDSLIdeModule.java b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/AbstractEntityMockDSLIdeModule.java
new file mode 100644
index 0000000..2f9de23
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/AbstractEntityMockDSLIdeModule.java
@@ -0,0 +1,60 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.ide;
+
+import com.google.inject.Binder;
+import com.google.inject.name.Names;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.EntityMockDSLParser;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal.InternalEntityMockDSLLexer;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher;
+import org.eclipse.xtext.ide.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.xbase.ide.DefaultXbaseIdeModule;
+
+/**
+ * Manual modifications go to {@link EntityMockDSLIdeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractEntityMockDSLIdeModule extends DefaultXbaseIdeModule {
+
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalEntityMockDSLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return EntityMockDSLParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends IPrefixMatcher> bindIPrefixMatcher() {
+		return FQNPrefixMatcher.class;
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/EntityMockDSLParser.java b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/EntityMockDSLParser.java
new file mode 100644
index 0000000..bac3132
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/EntityMockDSLParser.java
@@ -0,0 +1,707 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal.InternalEntityMockDSLParser;
+import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+
+public class EntityMockDSLParser extends AbstractContentAssistParser {
+
+	@Inject
+	private EntityMockDSLGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalEntityMockDSLParser createParser() {
+		InternalEntityMockDSLParser result = new InternalEntityMockDSLParser(null);
+		result.setGrammarAccess(grammarAccess);
+		return result;
+	}
+
+	@Override
+	protected String getRuleName(AbstractElement element) {
+		if (nameMappings == null) {
+			nameMappings = new HashMap<AbstractElement, String>() {
+				private static final long serialVersionUID = 1L;
+				{
+					put(grammarAccess.getIEntityMockObjectUsableAccess().getAlternatives(), "rule__IEntityMockObjectUsable__Alternatives");
+					put(grammarAccess.getIEntityMockObjectAttributeAccess().getAlternatives(), "rule__IEntityMockObjectAttribute__Alternatives");
+					put(grammarAccess.getPropertyFillerTypeAccess().getAlternatives(), "rule__PropertyFillerType__Alternatives");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_0(), "rule__PropertyFillerSignedDoubleRange__Alternatives_2_0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_2(), "rule__PropertyFillerSignedDoubleRange__Alternatives_2_2");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_0(), "rule__PropertyFillerSignedIntegerRange__Alternatives_3_0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_2(), "rule__PropertyFillerSignedIntegerRange__Alternatives_3_2");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_0(), "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_2(), "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_0(), "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_2(), "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2");
+					put(grammarAccess.getEntityMockEntityAccess().getAlternatives_4(), "rule__EntityMockEntity__Alternatives_4");
+					put(grammarAccess.getIIterateAccess().getAlternatives(), "rule__IIterate__Alternatives");
+					put(grammarAccess.getDateAccess().getAlternatives(), "rule__Date__Alternatives");
+					put(grammarAccess.getIEntityMockEntityUsableAccess().getAlternatives(), "rule__IEntityMockEntityUsable__Alternatives");
+					put(grammarAccess.getIEntityMockAttributeAccess().getAlternatives(), "rule__IEntityMockAttribute__Alternatives");
+					put(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAlternatives(), "rule__EntityMockEntityFunctionParameter__Alternatives");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getAlternatives(), "rule__EntityMockAttributeByObject__Alternatives");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getAlternatives_3(), "rule__EntityMockAttributeByReference__Alternatives_3");
+					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_2(), "rule__XImportDeclaration__Alternatives_2");
+					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3(), "rule__XImportDeclaration__Alternatives_2_0_3");
+					put(grammarAccess.getXAnnotationAccess().getAlternatives_3_1(), "rule__XAnnotation__Alternatives_3_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives(), "rule__XAnnotationElementValueOrCommaList__Alternatives");
+					put(grammarAccess.getXAnnotationElementValueAccess().getAlternatives(), "rule__XAnnotationElementValue__Alternatives");
+					put(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives(), "rule__XAnnotationOrExpression__Alternatives");
+					put(grammarAccess.getXAssignmentAccess().getAlternatives(), "rule__XAssignment__Alternatives");
+					put(grammarAccess.getOpMultiAssignAccess().getAlternatives(), "rule__OpMultiAssign__Alternatives");
+					put(grammarAccess.getOpEqualityAccess().getAlternatives(), "rule__OpEquality__Alternatives");
+					put(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1(), "rule__XRelationalExpression__Alternatives_1");
+					put(grammarAccess.getOpCompareAccess().getAlternatives(), "rule__OpCompare__Alternatives");
+					put(grammarAccess.getOpOtherAccess().getAlternatives(), "rule__OpOther__Alternatives");
+					put(grammarAccess.getOpOtherAccess().getAlternatives_5_1(), "rule__OpOther__Alternatives_5_1");
+					put(grammarAccess.getOpOtherAccess().getAlternatives_6_1(), "rule__OpOther__Alternatives_6_1");
+					put(grammarAccess.getOpAddAccess().getAlternatives(), "rule__OpAdd__Alternatives");
+					put(grammarAccess.getOpMultiAccess().getAlternatives(), "rule__OpMulti__Alternatives");
+					put(grammarAccess.getXUnaryOperationAccess().getAlternatives(), "rule__XUnaryOperation__Alternatives");
+					put(grammarAccess.getOpUnaryAccess().getAlternatives(), "rule__OpUnary__Alternatives");
+					put(grammarAccess.getOpPostfixAccess().getAlternatives(), "rule__OpPostfix__Alternatives");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1(), "rule__XMemberFeatureCall__Alternatives_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1(), "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1(), "rule__XMemberFeatureCall__Alternatives_1_1_3_1");
+					put(grammarAccess.getXPrimaryExpressionAccess().getAlternatives(), "rule__XPrimaryExpression__Alternatives");
+					put(grammarAccess.getXLiteralAccess().getAlternatives(), "rule__XLiteral__Alternatives");
+					put(grammarAccess.getXCollectionLiteralAccess().getAlternatives(), "rule__XCollectionLiteral__Alternatives");
+					put(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2(), "rule__XSwitchExpression__Alternatives_2");
+					put(grammarAccess.getXCasePartAccess().getAlternatives_3(), "rule__XCasePart__Alternatives_3");
+					put(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives(), "rule__XExpressionOrVarDeclaration__Alternatives");
+					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1(), "rule__XVariableDeclaration__Alternatives_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2(), "rule__XVariableDeclaration__Alternatives_2");
+					put(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1(), "rule__XFeatureCall__Alternatives_3_1");
+					put(grammarAccess.getFeatureCallIDAccess().getAlternatives(), "rule__FeatureCallID__Alternatives");
+					put(grammarAccess.getIdOrSuperAccess().getAlternatives(), "rule__IdOrSuper__Alternatives");
+					put(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1(), "rule__XConstructorCall__Alternatives_4_1");
+					put(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1(), "rule__XBooleanLiteral__Alternatives_1");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3(), "rule__XTryCatchFinallyExpression__Alternatives_3");
+					put(grammarAccess.getNumberAccess().getAlternatives(), "rule__Number__Alternatives");
+					put(grammarAccess.getNumberAccess().getAlternatives_1_0(), "rule__Number__Alternatives_1_0");
+					put(grammarAccess.getNumberAccess().getAlternatives_1_1_1(), "rule__Number__Alternatives_1_1_1");
+					put(grammarAccess.getJvmTypeReferenceAccess().getAlternatives(), "rule__JvmTypeReference__Alternatives");
+					put(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives(), "rule__JvmArgumentTypeReference__Alternatives");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2(), "rule__JvmWildcardTypeReference__Alternatives_2");
+					put(grammarAccess.getEDateStepTypeAccess().getAlternatives(), "rule__EDateStepType__Alternatives");
+					put(grammarAccess.getEntityMockModelAccess().getGroup(), "rule__EntityMockModel__Group__0");
+					put(grammarAccess.getEntityMockPackageAccess().getGroup(), "rule__EntityMockPackage__Group__0");
+					put(grammarAccess.getEntityMockPackageAccess().getGroup_3(), "rule__EntityMockPackage__Group_3__0");
+					put(grammarAccess.getEntityMockAccess().getGroup(), "rule__EntityMock__Group__0");
+					put(grammarAccess.getEntityMockAccess().getGroup_3(), "rule__EntityMock__Group_3__0");
+					put(grammarAccess.getEntityMockAccess().getGroup_4(), "rule__EntityMock__Group_4__0");
+					put(grammarAccess.getEntityMockAccess().getGroup_4_1_0(), "rule__EntityMock__Group_4_1_0__0");
+					put(grammarAccess.getRunningDataInterchangesAccess().getGroup(), "rule__RunningDataInterchanges__Group__0");
+					put(grammarAccess.getRunningDataInterchangeAccess().getGroup(), "rule__RunningDataInterchange__Group__0");
+					put(grammarAccess.getEntityMockResourcesAccess().getGroup(), "rule__EntityMockResources__Group__0");
+					put(grammarAccess.getEntityMockResourceAccess().getGroup(), "rule__EntityMockResource__Group__0");
+					put(grammarAccess.getEntityMockResourceAccess().getGroup_3(), "rule__EntityMockResource__Group_3__0");
+					put(grammarAccess.getEntityMockResourceAccess().getGroup_3_2(), "rule__EntityMockResource__Group_3_2__0");
+					put(grammarAccess.getEntityMockResourceAttributeAccess().getGroup(), "rule__EntityMockResourceAttribute__Group__0");
+					put(grammarAccess.getEntityMockResourceDataRowAccess().getGroup(), "rule__EntityMockResourceDataRow__Group__0");
+					put(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2(), "rule__EntityMockResourceDataRow__Group_2__0");
+					put(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2_1(), "rule__EntityMockResourceDataRow__Group_2_1__0");
+					put(grammarAccess.getEntityMockObjectsAccess().getGroup(), "rule__EntityMockObjects__Group__0");
+					put(grammarAccess.getEntityMockObjectAccess().getGroup(), "rule__EntityMockObject__Group__0");
+					put(grammarAccess.getEntityMockObjectEnumAccess().getGroup(), "rule__EntityMockObjectEnum__Group__0");
+					put(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup(), "rule__EntityMockObjectPlainValue__Group__0");
+					put(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup_3(), "rule__EntityMockObjectPlainValue__Group_3__0");
+					put(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup(), "rule__EntityMockObjectResourceValue__Group__0");
+					put(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup_4(), "rule__EntityMockObjectResourceValue__Group_4__0");
+					put(grammarAccess.getEntityMockObjectArrayValueAccess().getGroup(), "rule__EntityMockObjectArrayValue__Group__0");
+					put(grammarAccess.getEntityMockObjectItemValueAccess().getGroup(), "rule__EntityMockObjectItemValue__Group__0");
+					put(grammarAccess.getEntityMockObjectItemValueAccess().getGroup_3(), "rule__EntityMockObjectItemValue__Group_3__0");
+					put(grammarAccess.getEntityMockObjectEmbedAccess().getGroup(), "rule__EntityMockObjectEmbed__Group__0");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getGroup(), "rule__EntityMockObjectFunction__Group__0");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6(), "rule__EntityMockObjectFunction__Group_6__0");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6_1(), "rule__EntityMockObjectFunction__Group_6_1__0");
+					put(grammarAccess.getEntityMockObjectFunctionParameterAccess().getGroup(), "rule__EntityMockObjectFunctionParameter__Group__0");
+					put(grammarAccess.getEntityMockObjectFillAccess().getGroup(), "rule__EntityMockObjectFill__Group__0");
+					put(grammarAccess.getPropertyFillerDateFutureAccess().getGroup(), "rule__PropertyFillerDateFuture__Group__0");
+					put(grammarAccess.getPropertyFillerDatePastAccess().getGroup(), "rule__PropertyFillerDatePast__Group__0");
+					put(grammarAccess.getPropertyFillerBooleanAccess().getGroup(), "rule__PropertyFillerBoolean__Group__0");
+					put(grammarAccess.getPropertyFillerDateRangeAccess().getGroup(), "rule__PropertyFillerDateRange__Group__0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup(), "rule__PropertyFillerSignedDoubleRange__Group__0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_2(), "rule__PropertyFillerSignedDoubleRange__Group_2__0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_6(), "rule__PropertyFillerSignedDoubleRange__Group_6__0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getGroup(), "rule__PropertyFillerSignedDoubleRandom__Group__0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup(), "rule__PropertyFillerSignedIntegerRange__Group__0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_3(), "rule__PropertyFillerSignedIntegerRange__Group_3__0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_4(), "rule__PropertyFillerSignedIntegerRange__Group_4__0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getGroup(), "rule__PropertyFillerSignedIntegerRandom__Group__0");
+					put(grammarAccess.getPropertyFillerTextRandomAccess().getGroup(), "rule__PropertyFillerTextRandom__Group__0");
+					put(grammarAccess.getPropertyFillerTextParagraphsAccess().getGroup(), "rule__PropertyFillerTextParagraphs__Group__0");
+					put(grammarAccess.getPropertyFillerTextSentencesAccess().getGroup(), "rule__PropertyFillerTextSentences__Group__0");
+					put(grammarAccess.getPropertyFillerTextWordsAccess().getGroup(), "rule__PropertyFillerTextWords__Group__0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup(), "rule__PropertyFillerUnsignedDoubleRange__Group__0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_2(), "rule__PropertyFillerUnsignedDoubleRange__Group_2__0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_6(), "rule__PropertyFillerUnsignedDoubleRange__Group_6__0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getGroup(), "rule__PropertyFillerUnsignedDoubleRandom__Group__0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup(), "rule__PropertyFillerUnsignedIntegerRange__Group__0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_3(), "rule__PropertyFillerUnsignedIntegerRange__Group_3__0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_4(), "rule__PropertyFillerUnsignedIntegerRange__Group_4__0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getGroup(), "rule__PropertyFillerUnsignedIntegerRandom__Group__0");
+					put(grammarAccess.getEntityMockEntitiesAccess().getGroup(), "rule__EntityMockEntities__Group__0");
+					put(grammarAccess.getEntityMockEntityAccess().getGroup(), "rule__EntityMockEntity__Group__0");
+					put(grammarAccess.getEntityMockEntityAccess().getGroup_4_0(), "rule__EntityMockEntity__Group_4_0__0");
+					put(grammarAccess.getEntityMockEntityAccess().getGroup_4_1(), "rule__EntityMockEntity__Group_4_1__0");
+					put(grammarAccess.getEntityMockEntityAccess().getGroup_4_2(), "rule__EntityMockEntity__Group_4_2__0");
+					put(grammarAccess.getIntegerIterateAccess().getGroup(), "rule__IntegerIterate__Group__0");
+					put(grammarAccess.getDateIterateAccess().getGroup(), "rule__DateIterate__Group__0");
+					put(grammarAccess.getDateAccess().getGroup_3(), "rule__Date__Group_3__0");
+					put(grammarAccess.getEntityMockByResourceAttributeAccess().getGroup(), "rule__EntityMockByResourceAttribute__Group__0");
+					put(grammarAccess.getEntityMockTemplateAccess().getGroup(), "rule__EntityMockTemplate__Group__0");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getGroup(), "rule__EntityMockEntityFunction__Group__0");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4(), "rule__EntityMockEntityFunction__Group_4__0");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4_1(), "rule__EntityMockEntityFunction__Group_4_1__0");
+					put(grammarAccess.getEntityMockEntityNestedAttributeAccess().getGroup(), "rule__EntityMockEntityNestedAttribute__Group__0");
+					put(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup(), "rule__EntityMockReferencedObjectAttribute__Group__0");
+					put(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup_2(), "rule__EntityMockReferencedObjectAttribute__Group_2__0");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0(), "rule__EntityMockAttributeByObject__Group_0__0");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0_2(), "rule__EntityMockAttributeByObject__Group_0_2__0");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_1(), "rule__EntityMockAttributeByObject__Group_1__0");
+					put(grammarAccess.getEntityMockAttributeFillerAccess().getGroup(), "rule__EntityMockAttributeFiller__Group__0");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup(), "rule__EntityMockAttributeByReference__Group__0");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup_4(), "rule__EntityMockAttributeByReference__Group_4__0");
+					put(grammarAccess.getSignedNumberAccess().getGroup(), "rule__SignedNumber__Group__0");
+					put(grammarAccess.getUnsignedNumberAccess().getGroup(), "rule__UnsignedNumber__Group__0");
+					put(grammarAccess.getUnsignedNumberAccess().getGroup_1(), "rule__UnsignedNumber__Group_1__0");
+					put(grammarAccess.getSINTAccess().getGroup(), "rule__SINT__Group__0");
+					put(grammarAccess.getXImportDeclarationAccess().getGroup(), "rule__XImportDeclaration__Group__0");
+					put(grammarAccess.getXImportDeclarationAccess().getGroup_2_0(), "rule__XImportDeclaration__Group_2_0__0");
+					put(grammarAccess.getXImportDeclarationAccess().getGroup_2_3(), "rule__XImportDeclaration__Group_2_3__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup(), "rule__XAnnotation__Group__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3(), "rule__XAnnotation__Group_3__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0(), "rule__XAnnotation__Group_3_1_0__0");
+					put(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1(), "rule__XAnnotation__Group_3_1_0_1__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup(), "rule__XAnnotationElementValuePair__Group__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0(), "rule__XAnnotationElementValuePair__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0(), "rule__XAnnotationElementValuePair__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0(), "rule__XAnnotationElementValueOrCommaList__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0(), "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1(), "rule__XAnnotationElementValueOrCommaList__Group_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1(), "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0(), "rule__XAnnotationElementValue__Group_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0(), "rule__XAnnotationElementValue__Group_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0(), "rule__XAnnotationElementValue__Group_0_0_0__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1(), "rule__XAnnotationElementValue__Group_0_1__0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1(), "rule__XAnnotationElementValue__Group_0_1_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_0(), "rule__XAssignment__Group_0__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1(), "rule__XAssignment__Group_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1(), "rule__XAssignment__Group_1_1__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0(), "rule__XAssignment__Group_1_1_0__0");
+					put(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0(), "rule__XAssignment__Group_1_1_0_0__0");
+					put(grammarAccess.getOpMultiAssignAccess().getGroup_5(), "rule__OpMultiAssign__Group_5__0");
+					put(grammarAccess.getOpMultiAssignAccess().getGroup_6(), "rule__OpMultiAssign__Group_6__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup(), "rule__XOrExpression__Group__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1(), "rule__XOrExpression__Group_1__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0(), "rule__XOrExpression__Group_1_0__0");
+					put(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0(), "rule__XOrExpression__Group_1_0_0__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup(), "rule__XAndExpression__Group__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1(), "rule__XAndExpression__Group_1__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0(), "rule__XAndExpression__Group_1_0__0");
+					put(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0(), "rule__XAndExpression__Group_1_0_0__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup(), "rule__XEqualityExpression__Group__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1(), "rule__XEqualityExpression__Group_1__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0(), "rule__XEqualityExpression__Group_1_0__0");
+					put(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0(), "rule__XEqualityExpression__Group_1_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup(), "rule__XRelationalExpression__Group__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0(), "rule__XRelationalExpression__Group_1_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0(), "rule__XRelationalExpression__Group_1_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0(), "rule__XRelationalExpression__Group_1_0_0_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1(), "rule__XRelationalExpression__Group_1_1__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0(), "rule__XRelationalExpression__Group_1_1_0__0");
+					put(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0(), "rule__XRelationalExpression__Group_1_1_0_0__0");
+					put(grammarAccess.getOpCompareAccess().getGroup_1(), "rule__OpCompare__Group_1__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup(), "rule__XOtherOperatorExpression__Group__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1(), "rule__XOtherOperatorExpression__Group_1__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0(), "rule__XOtherOperatorExpression__Group_1_0__0");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0(), "rule__XOtherOperatorExpression__Group_1_0_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_2(), "rule__OpOther__Group_2__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5(), "rule__OpOther__Group_5__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0(), "rule__OpOther__Group_5_1_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0(), "rule__OpOther__Group_5_1_0_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6(), "rule__OpOther__Group_6__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0(), "rule__OpOther__Group_6_1_0__0");
+					put(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0(), "rule__OpOther__Group_6_1_0_0__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup(), "rule__XAdditiveExpression__Group__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1(), "rule__XAdditiveExpression__Group_1__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0(), "rule__XAdditiveExpression__Group_1_0__0");
+					put(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0(), "rule__XAdditiveExpression__Group_1_0_0__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup(), "rule__XMultiplicativeExpression__Group__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1(), "rule__XMultiplicativeExpression__Group_1__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0(), "rule__XMultiplicativeExpression__Group_1_0__0");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0(), "rule__XMultiplicativeExpression__Group_1_0_0__0");
+					put(grammarAccess.getXUnaryOperationAccess().getGroup_0(), "rule__XUnaryOperation__Group_0__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup(), "rule__XCastedExpression__Group__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1(), "rule__XCastedExpression__Group_1__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0(), "rule__XCastedExpression__Group_1_0__0");
+					put(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0(), "rule__XCastedExpression__Group_1_0_0__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup(), "rule__XPostfixOperation__Group__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup_1(), "rule__XPostfixOperation__Group_1__0");
+					put(grammarAccess.getXPostfixOperationAccess().getGroup_1_0(), "rule__XPostfixOperation__Group_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup(), "rule__XMemberFeatureCall__Group__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0(), "rule__XMemberFeatureCall__Group_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0(), "rule__XMemberFeatureCall__Group_1_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0(), "rule__XMemberFeatureCall__Group_1_0_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1(), "rule__XMemberFeatureCall__Group_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0(), "rule__XMemberFeatureCall__Group_1_1_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0(), "rule__XMemberFeatureCall__Group_1_1_0_0__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2(), "rule__XMemberFeatureCall__Group_1_1_1_2__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3(), "rule__XMemberFeatureCall__Group_1_1_3__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1__0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1(), "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup(), "rule__XSetLiteral__Group__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup_3(), "rule__XSetLiteral__Group_3__0");
+					put(grammarAccess.getXSetLiteralAccess().getGroup_3_1(), "rule__XSetLiteral__Group_3_1__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup(), "rule__XListLiteral__Group__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup_3(), "rule__XListLiteral__Group_3__0");
+					put(grammarAccess.getXListLiteralAccess().getGroup_3_1(), "rule__XListLiteral__Group_3_1__0");
+					put(grammarAccess.getXClosureAccess().getGroup(), "rule__XClosure__Group__0");
+					put(grammarAccess.getXClosureAccess().getGroup_0(), "rule__XClosure__Group_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_0_0(), "rule__XClosure__Group_0_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1(), "rule__XClosure__Group_1__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0(), "rule__XClosure__Group_1_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0_0(), "rule__XClosure__Group_1_0_0__0");
+					put(grammarAccess.getXClosureAccess().getGroup_1_0_0_1(), "rule__XClosure__Group_1_0_0_1__0");
+					put(grammarAccess.getXExpressionInClosureAccess().getGroup(), "rule__XExpressionInClosure__Group__0");
+					put(grammarAccess.getXExpressionInClosureAccess().getGroup_1(), "rule__XExpressionInClosure__Group_1__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup(), "rule__XShortClosure__Group__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0(), "rule__XShortClosure__Group_0__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0(), "rule__XShortClosure__Group_0_0__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1(), "rule__XShortClosure__Group_0_0_1__0");
+					put(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1(), "rule__XShortClosure__Group_0_0_1_1__0");
+					put(grammarAccess.getXParenthesizedExpressionAccess().getGroup(), "rule__XParenthesizedExpression__Group__0");
+					put(grammarAccess.getXIfExpressionAccess().getGroup(), "rule__XIfExpression__Group__0");
+					put(grammarAccess.getXIfExpressionAccess().getGroup_6(), "rule__XIfExpression__Group_6__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup(), "rule__XSwitchExpression__Group__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0(), "rule__XSwitchExpression__Group_2_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0(), "rule__XSwitchExpression__Group_2_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0(), "rule__XSwitchExpression__Group_2_0_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1(), "rule__XSwitchExpression__Group_2_1__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0(), "rule__XSwitchExpression__Group_2_1_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0(), "rule__XSwitchExpression__Group_2_1_0_0__0");
+					put(grammarAccess.getXSwitchExpressionAccess().getGroup_5(), "rule__XSwitchExpression__Group_5__0");
+					put(grammarAccess.getXCasePartAccess().getGroup(), "rule__XCasePart__Group__0");
+					put(grammarAccess.getXCasePartAccess().getGroup_2(), "rule__XCasePart__Group_2__0");
+					put(grammarAccess.getXCasePartAccess().getGroup_3_0(), "rule__XCasePart__Group_3_0__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup(), "rule__XForLoopExpression__Group__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0(), "rule__XForLoopExpression__Group_0__0");
+					put(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0(), "rule__XForLoopExpression__Group_0_0__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup(), "rule__XBasicForLoopExpression__Group__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3(), "rule__XBasicForLoopExpression__Group_3__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1(), "rule__XBasicForLoopExpression__Group_3_1__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7(), "rule__XBasicForLoopExpression__Group_7__0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1(), "rule__XBasicForLoopExpression__Group_7_1__0");
+					put(grammarAccess.getXWhileExpressionAccess().getGroup(), "rule__XWhileExpression__Group__0");
+					put(grammarAccess.getXDoWhileExpressionAccess().getGroup(), "rule__XDoWhileExpression__Group__0");
+					put(grammarAccess.getXBlockExpressionAccess().getGroup(), "rule__XBlockExpression__Group__0");
+					put(grammarAccess.getXBlockExpressionAccess().getGroup_2(), "rule__XBlockExpression__Group_2__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup(), "rule__XVariableDeclaration__Group__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0(), "rule__XVariableDeclaration__Group_2_0__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0(), "rule__XVariableDeclaration__Group_2_0_0__0");
+					put(grammarAccess.getXVariableDeclarationAccess().getGroup_3(), "rule__XVariableDeclaration__Group_3__0");
+					put(grammarAccess.getJvmFormalParameterAccess().getGroup(), "rule__JvmFormalParameter__Group__0");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getGroup(), "rule__FullJvmFormalParameter__Group__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup(), "rule__XFeatureCall__Group__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_1(), "rule__XFeatureCall__Group_1__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_1_2(), "rule__XFeatureCall__Group_1_2__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3(), "rule__XFeatureCall__Group_3__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1(), "rule__XFeatureCall__Group_3_1_1__0");
+					put(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1(), "rule__XFeatureCall__Group_3_1_1_1__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup(), "rule__XConstructorCall__Group__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_3(), "rule__XConstructorCall__Group_3__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_3_2(), "rule__XConstructorCall__Group_3_2__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4(), "rule__XConstructorCall__Group_4__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1(), "rule__XConstructorCall__Group_4_1_1__0");
+					put(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1(), "rule__XConstructorCall__Group_4_1_1_1__0");
+					put(grammarAccess.getXBooleanLiteralAccess().getGroup(), "rule__XBooleanLiteral__Group__0");
+					put(grammarAccess.getXNullLiteralAccess().getGroup(), "rule__XNullLiteral__Group__0");
+					put(grammarAccess.getXNumberLiteralAccess().getGroup(), "rule__XNumberLiteral__Group__0");
+					put(grammarAccess.getXStringLiteralAccess().getGroup(), "rule__XStringLiteral__Group__0");
+					put(grammarAccess.getXTypeLiteralAccess().getGroup(), "rule__XTypeLiteral__Group__0");
+					put(grammarAccess.getXThrowExpressionAccess().getGroup(), "rule__XThrowExpression__Group__0");
+					put(grammarAccess.getXReturnExpressionAccess().getGroup(), "rule__XReturnExpression__Group__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup(), "rule__XTryCatchFinallyExpression__Group__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0(), "rule__XTryCatchFinallyExpression__Group_3_0__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1(), "rule__XTryCatchFinallyExpression__Group_3_0_1__0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1(), "rule__XTryCatchFinallyExpression__Group_3_1__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup(), "rule__XSynchronizedExpression__Group__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0(), "rule__XSynchronizedExpression__Group_0__0");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0(), "rule__XSynchronizedExpression__Group_0_0__0");
+					put(grammarAccess.getXCatchClauseAccess().getGroup(), "rule__XCatchClause__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumberAccess().getGroup_1(), "rule__Number__Group_1__0");
+					put(grammarAccess.getNumberAccess().getGroup_1_1(), "rule__Number__Group_1_1__0");
+					put(grammarAccess.getStaticQualifierAccess().getGroup(), "rule__StaticQualifier__Group__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0(), "rule__JvmTypeReference__Group_0__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1(), "rule__JvmTypeReference__Group_0_1__0");
+					put(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0(), "rule__JvmTypeReference__Group_0_1_0__0");
+					put(grammarAccess.getArrayBracketsAccess().getGroup(), "rule__ArrayBrackets__Group__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup(), "rule__XFunctionTypeRef__Group__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0(), "rule__XFunctionTypeRef__Group_0__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1(), "rule__XFunctionTypeRef__Group_0_1__0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1(), "rule__XFunctionTypeRef__Group_0_1_1__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup(), "rule__JvmParameterizedTypeReference__Group__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1(), "rule__JvmParameterizedTypeReference__Group_1__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2(), "rule__JvmParameterizedTypeReference__Group_1_2__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4(), "rule__JvmParameterizedTypeReference__Group_1_4__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0(), "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2__0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2(), "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup(), "rule__JvmWildcardTypeReference__Group__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0(), "rule__JvmWildcardTypeReference__Group_2_0__0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1(), "rule__JvmWildcardTypeReference__Group_2_1__0");
+					put(grammarAccess.getJvmUpperBoundAccess().getGroup(), "rule__JvmUpperBound__Group__0");
+					put(grammarAccess.getJvmUpperBoundAndedAccess().getGroup(), "rule__JvmUpperBoundAnded__Group__0");
+					put(grammarAccess.getJvmLowerBoundAccess().getGroup(), "rule__JvmLowerBound__Group__0");
+					put(grammarAccess.getJvmLowerBoundAndedAccess().getGroup(), "rule__JvmLowerBoundAnded__Group__0");
+					put(grammarAccess.getJvmTypeParameterAccess().getGroup(), "rule__JvmTypeParameter__Group__0");
+					put(grammarAccess.getJvmTypeParameterAccess().getGroup_1(), "rule__JvmTypeParameter__Group_1__0");
+					put(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup(), "rule__QualifiedNameWithWildcard__Group__0");
+					put(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup(), "rule__QualifiedNameInStaticImport__Group__0");
+					put(grammarAccess.getEntityMockModelAccess().getImportSectionAssignment_0(), "rule__EntityMockModel__ImportSectionAssignment_0");
+					put(grammarAccess.getEntityMockModelAccess().getPackagesAssignment_1(), "rule__EntityMockModel__PackagesAssignment_1");
+					put(grammarAccess.getEntityMockPackageAccess().getNameAssignment_2(), "rule__EntityMockPackage__NameAssignment_2");
+					put(grammarAccess.getEntityMockPackageAccess().getMocksAssignment_3_1(), "rule__EntityMockPackage__MocksAssignment_3_1");
+					put(grammarAccess.getEntityMockAccess().getNameAssignment_2(), "rule__EntityMock__NameAssignment_2");
+					put(grammarAccess.getEntityMockAccess().getDescriptionAssignment_3_0(), "rule__EntityMock__DescriptionAssignment_3_0");
+					put(grammarAccess.getEntityMockAccess().getDescriptionValueAssignment_3_1(), "rule__EntityMock__DescriptionValueAssignment_3_1");
+					put(grammarAccess.getEntityMockAccess().getRunPriorityAssignment_4_1_0_1(), "rule__EntityMock__RunPriorityAssignment_4_1_0_1");
+					put(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1(), "rule__EntityMock__DatainterchangesAssignment_4_1_1");
+					put(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2(), "rule__EntityMock__ResourcesAssignment_4_1_2");
+					put(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3(), "rule__EntityMock__ObjectsAssignment_4_1_3");
+					put(grammarAccess.getEntityMockAccess().getEntitiesAssignment_4_1_4(), "rule__EntityMock__EntitiesAssignment_4_1_4");
+					put(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesAssignment_3(), "rule__RunningDataInterchanges__DatainterchangesAssignment_3");
+					put(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefAssignment_2(), "rule__RunningDataInterchange__DatainterchangeRefAssignment_2");
+					put(grammarAccess.getRunningDataInterchangeAccess().getFileURLAssignment_4(), "rule__RunningDataInterchange__FileURLAssignment_4");
+					put(grammarAccess.getEntityMockResourcesAccess().getResourcesAssignment_3(), "rule__EntityMockResources__ResourcesAssignment_3");
+					put(grammarAccess.getEntityMockResourceAccess().getNameAssignment_1(), "rule__EntityMockResource__NameAssignment_1");
+					put(grammarAccess.getEntityMockResourceAccess().getAttributesAssignment_3_2_0(), "rule__EntityMockResource__AttributesAssignment_3_2_0");
+					put(grammarAccess.getEntityMockResourceAccess().getDatarowsAssignment_6(), "rule__EntityMockResource__DatarowsAssignment_6");
+					put(grammarAccess.getEntityMockResourceAttributeAccess().getNameAssignment_1(), "rule__EntityMockResourceAttribute__NameAssignment_1");
+					put(grammarAccess.getEntityMockResourceDataRowAccess().getNameAssignment_1(), "rule__EntityMockResourceDataRow__NameAssignment_1");
+					put(grammarAccess.getEntityMockResourceDataRowAccess().getValuesAssignment_2_1_0(), "rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0");
+					put(grammarAccess.getEntityMockObjectsAccess().getObjectsAssignment_3(), "rule__EntityMockObjects__ObjectsAssignment_3");
+					put(grammarAccess.getEntityMockObjectAccess().getNameAssignment_1(), "rule__EntityMockObject__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectAccess().getEnumerationsAssignment_3(), "rule__EntityMockObject__EnumerationsAssignment_3");
+					put(grammarAccess.getEntityMockObjectAccess().getAttributesAssignment_4(), "rule__EntityMockObject__AttributesAssignment_4");
+					put(grammarAccess.getEntityMockObjectAccess().getCalculationsAssignment_5(), "rule__EntityMockObject__CalculationsAssignment_5");
+					put(grammarAccess.getEntityMockObjectEnumAccess().getNameAssignment_1(), "rule__EntityMockObjectEnum__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceAssignment_3(), "rule__EntityMockObjectEnum__UsingResourceAssignment_3");
+					put(grammarAccess.getEntityMockObjectPlainValueAccess().getNameAssignment_1(), "rule__EntityMockObjectPlainValue__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesAssignment_3_0(), "rule__EntityMockObjectPlainValue__ValuesAssignment_3_0");
+					put(grammarAccess.getEntityMockObjectResourceValueAccess().getNameAssignment_1(), "rule__EntityMockObjectResourceValue__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumAssignment_3(), "rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3");
+					put(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeAssignment_4_1(), "rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1");
+					put(grammarAccess.getEntityMockObjectArrayValueAccess().getNameAssignment_1(), "rule__EntityMockObjectArrayValue__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationAssignment_3(), "rule__EntityMockObjectArrayValue__EnumerationAssignment_3");
+					put(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsAssignment_5(), "rule__EntityMockObjectArrayValue__ItemsAssignment_5");
+					put(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowAssignment_1(), "rule__EntityMockObjectItemValue__DatarowAssignment_1");
+					put(grammarAccess.getEntityMockObjectItemValueAccess().getValuesAssignment_3_0(), "rule__EntityMockObjectItemValue__ValuesAssignment_3_0");
+					put(grammarAccess.getEntityMockObjectEmbedAccess().getNameAssignment_2(), "rule__EntityMockObjectEmbed__NameAssignment_2");
+					put(grammarAccess.getEntityMockObjectEmbedAccess().getObjectAssignment_4(), "rule__EntityMockObjectEmbed__ObjectAssignment_4");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getNameAssignment_1(), "rule__EntityMockObjectFunction__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeAssignment_3(), "rule__EntityMockObjectFunction__OftypeAssignment_3");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_0(), "rule__EntityMockObjectFunction__ParamsAssignment_6_0");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_1_1(), "rule__EntityMockObjectFunction__ParamsAssignment_6_1_1");
+					put(grammarAccess.getEntityMockObjectFunctionAccess().getBodyAssignment_8(), "rule__EntityMockObjectFunction__BodyAssignment_8");
+					put(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeAssignment_0(), "rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0");
+					put(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameAssignment_1(), "rule__EntityMockObjectFunctionParameter__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectFillAccess().getNameAssignment_1(), "rule__EntityMockObjectFill__NameAssignment_1");
+					put(grammarAccess.getEntityMockObjectFillAccess().getFillerTypeAssignment_3(), "rule__EntityMockObjectFill__FillerTypeAssignment_3");
+					put(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsAssignment_1(), "rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1");
+					put(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsAssignment_1(), "rule__PropertyFillerDatePast__DatePastYearsAssignment_1");
+					put(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsAssignment_2(), "rule__PropertyFillerDateRange__DateBeginYearsAssignment_2");
+					put(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsAssignment_4(), "rule__PropertyFillerDateRange__DateEndYearsAssignment_4");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0(), "rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1(), "rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeAssignment_2_2_0(), "rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1(), "rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsAssignment_4(), "rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4");
+					put(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedAssignment_6_1(), "rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1");
+					put(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2(), "rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0(), "rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1(), "rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeAssignment_3_2_0(), "rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1(), "rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1");
+					put(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedAssignment_4_1(), "rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1");
+					put(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2(), "rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2");
+					put(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2(), "rule__PropertyFillerTextRandom__ItemsAssignment_2");
+					put(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountAssignment_2(), "rule__PropertyFillerTextParagraphs__CountAssignment_2");
+					put(grammarAccess.getPropertyFillerTextSentencesAccess().getCountAssignment_2(), "rule__PropertyFillerTextSentences__CountAssignment_2");
+					put(grammarAccess.getPropertyFillerTextWordsAccess().getCountAssignment_2(), "rule__PropertyFillerTextWords__CountAssignment_2");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0(), "rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1(), "rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeAssignment_2_2_0(), "rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1(), "rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsAssignment_4(), "rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedAssignment_6_1(), "rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1");
+					put(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2(), "rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0(), "rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1(), "rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeAssignment_3_2_0(), "rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1(), "rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedAssignment_4_1(), "rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1");
+					put(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2(), "rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2");
+					put(grammarAccess.getEntityMockEntitiesAccess().getEntitiesAssignment_3(), "rule__EntityMockEntities__EntitiesAssignment_3");
+					put(grammarAccess.getEntityMockEntityAccess().getNameAssignment_1(), "rule__EntityMockEntity__NameAssignment_1");
+					put(grammarAccess.getEntityMockEntityAccess().getEntityRefAssignment_3(), "rule__EntityMockEntity__EntityRefAssignment_3");
+					put(grammarAccess.getEntityMockEntityAccess().getMinRowsAssignment_4_0_1(), "rule__EntityMockEntity__MinRowsAssignment_4_0_1");
+					put(grammarAccess.getEntityMockEntityAccess().getMaxRowsAssignment_4_0_3(), "rule__EntityMockEntity__MaxRowsAssignment_4_0_3");
+					put(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_0_5(), "rule__EntityMockEntity__TemplatesAssignment_4_0_5");
+					put(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_0_6(), "rule__EntityMockEntity__AttributesAssignment_4_0_6");
+					put(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_0_7(), "rule__EntityMockEntity__CalculationsAssignment_4_0_7");
+					put(grammarAccess.getEntityMockEntityAccess().getByResourceAssignment_4_1_1(), "rule__EntityMockEntity__ByResourceAssignment_4_1_1");
+					put(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0(), "rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0");
+					put(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingAssignment_4_1_3_1(), "rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1");
+					put(grammarAccess.getEntityMockEntityAccess().getIteratorAssignment_4_2_1(), "rule__EntityMockEntity__IteratorAssignment_4_2_1");
+					put(grammarAccess.getEntityMockEntityAccess().getIterateAssignment_4_2_3(), "rule__EntityMockEntity__IterateAssignment_4_2_3");
+					put(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_2_5(), "rule__EntityMockEntity__TemplatesAssignment_4_2_5");
+					put(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_2_6(), "rule__EntityMockEntity__AttributesAssignment_4_2_6");
+					put(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_2_7(), "rule__EntityMockEntity__CalculationsAssignment_4_2_7");
+					put(grammarAccess.getIntegerIterateAccess().getFromAssignment_1(), "rule__IntegerIterate__FromAssignment_1");
+					put(grammarAccess.getIntegerIterateAccess().getUntilAssignment_3(), "rule__IntegerIterate__UntilAssignment_3");
+					put(grammarAccess.getIntegerIterateAccess().getStepAssignment_5(), "rule__IntegerIterate__StepAssignment_5");
+					put(grammarAccess.getDateIterateAccess().getFromAssignment_1(), "rule__DateIterate__FromAssignment_1");
+					put(grammarAccess.getDateIterateAccess().getUntilAssignment_3(), "rule__DateIterate__UntilAssignment_3");
+					put(grammarAccess.getDateIterateAccess().getStepCountAssignment_5(), "rule__DateIterate__StepCountAssignment_5");
+					put(grammarAccess.getDateIterateAccess().getStepTypeAssignment_6(), "rule__DateIterate__StepTypeAssignment_6");
+					put(grammarAccess.getDateAccess().getYesterdayAssignment_0(), "rule__Date__YesterdayAssignment_0");
+					put(grammarAccess.getDateAccess().getTodayAssignment_1(), "rule__Date__TodayAssignment_1");
+					put(grammarAccess.getDateAccess().getTomorrowAssignment_2(), "rule__Date__TomorrowAssignment_2");
+					put(grammarAccess.getDateAccess().getYearAssignment_3_0(), "rule__Date__YearAssignment_3_0");
+					put(grammarAccess.getDateAccess().getMonthAssignment_3_2(), "rule__Date__MonthAssignment_3_2");
+					put(grammarAccess.getDateAccess().getDayAssignment_3_4(), "rule__Date__DayAssignment_3_4");
+					put(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefAssignment_2(), "rule__EntityMockByResourceAttribute__AttributeRefAssignment_2");
+					put(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeAssignment_4(), "rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4");
+					put(grammarAccess.getEntityMockTemplateAccess().getNameAssignment_1(), "rule__EntityMockTemplate__NameAssignment_1");
+					put(grammarAccess.getEntityMockTemplateAccess().getObjectAssignment_3(), "rule__EntityMockTemplate__ObjectAssignment_3");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefAssignment_1(), "rule__EntityMockEntityFunction__AttributeRefAssignment_1");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_0(), "rule__EntityMockEntityFunction__ParamsAssignment_4_0");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_1_1(), "rule__EntityMockEntityFunction__ParamsAssignment_4_1_1");
+					put(grammarAccess.getEntityMockEntityFunctionAccess().getBodyAssignment_6(), "rule__EntityMockEntityFunction__BodyAssignment_6");
+					put(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefAssignment_0(), "rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0");
+					put(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeAssignment_1(), "rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1");
+					put(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceAssignment_0(), "rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0");
+					put(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeAssignment_2(), "rule__EntityMockEntityNestedAttribute__AttributeAssignment_2");
+					put(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateAssignment_1(), "rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1");
+					put(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedAssignment_2_1(), "rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1");
+					put(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeAssignment_4(), "rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefAssignment_0_1(), "rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceAssignment_0_2_1(), "rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumAssignment_1_1(), "rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1");
+					put(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeAssignment_1_3(), "rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3");
+					put(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefAssignment_1(), "rule__EntityMockAttributeFiller__AttributeRefAssignment_1");
+					put(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypeAssignment_3(), "rule__EntityMockAttributeFiller__FillerTypeAssignment_3");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefAssignment_1(), "rule__EntityMockAttributeByReference__AttributeRefAssignment_1");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityAssignment_3_1(), "rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1");
+					put(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForAssignment_4_1(), "rule__EntityMockAttributeByReference__OptionalForAssignment_4_1");
+					put(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0(), "rule__XImportDeclaration__StaticAssignment_2_0_0");
+					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1(), "rule__XImportDeclaration__ExtensionAssignment_2_0_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2");
+					put(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0(), "rule__XImportDeclaration__WildcardAssignment_2_0_3_0");
+					put(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1(), "rule__XImportDeclaration__MemberNameAssignment_2_0_3_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1(), "rule__XImportDeclaration__ImportedTypeAssignment_2_1");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2(), "rule__XImportDeclaration__ImportedNamespaceAssignment_2_2");
+					put(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0(), "rule__XImportDeclaration__FqnImportAssignment_2_3_0");
+					put(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1(), "rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1");
+					put(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2(), "rule__XAnnotation__AnnotationTypeAssignment_2");
+					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0");
+					put(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1(), "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1");
+					put(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1(), "rule__XAnnotation__ValueAssignment_3_1_1");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0(), "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0");
+					put(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1(), "rule__XAnnotationElementValuePair__ValueAssignment_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1");
+					put(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1(), "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1");
+					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_0");
+					put(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1(), "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1");
+					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1(), "rule__XAssignment__FeatureAssignment_0_1");
+					put(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3(), "rule__XAssignment__ValueAssignment_0_3");
+					put(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XAssignment__FeatureAssignment_1_1_0_0_1");
+					put(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1(), "rule__XAssignment__RightOperandAssignment_1_1_1");
+					put(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOrExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOrExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAndExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAndExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XEqualityExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1(), "rule__XEqualityExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1(), "rule__XRelationalExpression__TypeAssignment_1_0_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1(), "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1");
+					put(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1(), "rule__XRelationalExpression__RightOperandAssignment_1_1_1");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1(), "rule__XOtherOperatorExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1(), "rule__XAdditiveExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1(), "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1");
+					put(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1(), "rule__XMultiplicativeExpression__RightOperandAssignment_1_1");
+					put(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1(), "rule__XUnaryOperation__FeatureAssignment_0_1");
+					put(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2(), "rule__XUnaryOperation__OperandAssignment_0_2");
+					put(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1(), "rule__XCastedExpression__TypeAssignment_1_1");
+					put(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1(), "rule__XPostfixOperation__FeatureAssignment_1_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1(), "rule__XMemberFeatureCall__ValueAssignment_1_0_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1(), "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2(), "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1(), "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2(), "rule__XMemberFeatureCall__FeatureAssignment_1_1_2");
+					put(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0(), "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1");
+					put(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4(), "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4");
+					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0(), "rule__XSetLiteral__ElementsAssignment_3_0");
+					put(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1(), "rule__XSetLiteral__ElementsAssignment_3_1_1");
+					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0(), "rule__XListLiteral__ElementsAssignment_3_0");
+					put(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1(), "rule__XListLiteral__ElementsAssignment_3_1_1");
+					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0");
+					put(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1(), "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1");
+					put(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1(), "rule__XClosure__ExplicitSyntaxAssignment_1_0_1");
+					put(grammarAccess.getXClosureAccess().getExpressionAssignment_2(), "rule__XClosure__ExpressionAssignment_2");
+					put(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0(), "rule__XExpressionInClosure__ExpressionsAssignment_1_0");
+					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0");
+					put(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1(), "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1");
+					put(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2(), "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2");
+					put(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1(), "rule__XShortClosure__ExpressionAssignment_1");
+					put(grammarAccess.getXIfExpressionAccess().getIfAssignment_3(), "rule__XIfExpression__IfAssignment_3");
+					put(grammarAccess.getXIfExpressionAccess().getThenAssignment_5(), "rule__XIfExpression__ThenAssignment_5");
+					put(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1(), "rule__XIfExpression__ElseAssignment_6_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1(), "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1(), "rule__XSwitchExpression__SwitchAssignment_2_0_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0(), "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0");
+					put(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1(), "rule__XSwitchExpression__SwitchAssignment_2_1_1");
+					put(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4(), "rule__XSwitchExpression__CasesAssignment_4");
+					put(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2(), "rule__XSwitchExpression__DefaultAssignment_5_2");
+					put(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1(), "rule__XCasePart__TypeGuardAssignment_1");
+					put(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1(), "rule__XCasePart__CaseAssignment_2_1");
+					put(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1(), "rule__XCasePart__ThenAssignment_3_0_1");
+					put(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1(), "rule__XCasePart__FallThroughAssignment_3_1");
+					put(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3(), "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3");
+					put(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1(), "rule__XForLoopExpression__ForExpressionAssignment_1");
+					put(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3(), "rule__XForLoopExpression__EachExpressionAssignment_3");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1(), "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5(), "rule__XBasicForLoopExpression__ExpressionAssignment_5");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1(), "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1");
+					put(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9(), "rule__XBasicForLoopExpression__EachExpressionAssignment_9");
+					put(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3(), "rule__XWhileExpression__PredicateAssignment_3");
+					put(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5(), "rule__XWhileExpression__BodyAssignment_5");
+					put(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2(), "rule__XDoWhileExpression__BodyAssignment_2");
+					put(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5(), "rule__XDoWhileExpression__PredicateAssignment_5");
+					put(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0(), "rule__XBlockExpression__ExpressionsAssignment_2_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0(), "rule__XVariableDeclaration__WriteableAssignment_1_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0(), "rule__XVariableDeclaration__TypeAssignment_2_0_0_0");
+					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1(), "rule__XVariableDeclaration__NameAssignment_2_0_0_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1(), "rule__XVariableDeclaration__NameAssignment_2_1");
+					put(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1(), "rule__XVariableDeclaration__RightAssignment_3_1");
+					put(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__JvmFormalParameter__ParameterTypeAssignment_0");
+					put(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1(), "rule__JvmFormalParameter__NameAssignment_1");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0(), "rule__FullJvmFormalParameter__ParameterTypeAssignment_0");
+					put(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1(), "rule__FullJvmFormalParameter__NameAssignment_1");
+					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_1");
+					put(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1(), "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2(), "rule__XFeatureCall__FeatureAssignment_2");
+					put(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0(), "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1");
+					put(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4(), "rule__XFeatureCall__FeatureCallArgumentsAssignment_4");
+					put(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2(), "rule__XConstructorCall__ConstructorAssignment_2");
+					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_1");
+					put(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1(), "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1");
+					put(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0(), "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1(), "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1");
+					put(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5(), "rule__XConstructorCall__ArgumentsAssignment_5");
+					put(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1(), "rule__XBooleanLiteral__IsTrueAssignment_1_1");
+					put(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1(), "rule__XNumberLiteral__ValueAssignment_1");
+					put(grammarAccess.getXStringLiteralAccess().getValueAssignment_1(), "rule__XStringLiteral__ValueAssignment_1");
+					put(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3(), "rule__XTypeLiteral__TypeAssignment_3");
+					put(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4(), "rule__XTypeLiteral__ArrayDimensionsAssignment_4");
+					put(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2(), "rule__XThrowExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2(), "rule__XReturnExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2(), "rule__XTryCatchFinallyExpression__ExpressionAssignment_2");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0(), "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1");
+					put(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1(), "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1(), "rule__XSynchronizedExpression__ParamAssignment_1");
+					put(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3(), "rule__XSynchronizedExpression__ExpressionAssignment_3");
+					put(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2(), "rule__XCatchClause__DeclaredParamAssignment_2");
+					put(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4(), "rule__XCatchClause__ExpressionAssignment_4");
+					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0");
+					put(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1(), "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1");
+					put(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2(), "rule__XFunctionTypeRef__ReturnTypeAssignment_2");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0(), "rule__JvmParameterizedTypeReference__TypeAssignment_0");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1(), "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1");
+					put(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1(), "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0");
+					put(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1(), "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1");
+					put(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBound__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBound__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1(), "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1");
+					put(grammarAccess.getJvmTypeParameterAccess().getNameAssignment_0(), "rule__JvmTypeParameter__NameAssignment_0");
+					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_0(), "rule__JvmTypeParameter__ConstraintsAssignment_1_0");
+					put(grammarAccess.getJvmTypeParameterAccess().getConstraintsAssignment_1_1(), "rule__JvmTypeParameter__ConstraintsAssignment_1_1");
+					put(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment(), "rule__XImportSection__ImportDeclarationsAssignment");
+					put(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), "rule__EntityMock__UnorderedGroup_4_1");
+					put(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), "rule__EntityMockEntity__UnorderedGroup_4_1_3");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+			
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public EntityMockDSLGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(EntityMockDSLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/PartialEntityMockDSLContentAssistParser.java b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/PartialEntityMockDSLContentAssistParser.java
new file mode 100644
index 0000000..3514778
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/PartialEntityMockDSLContentAssistParser.java
@@ -0,0 +1,47 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialEntityMockDSLContentAssistParser extends EntityMockDSLParser implements IPartialEditingContentAssistParser {
+
+	private AbstractRule rule;
+
+	@Override
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.g b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.g
new file mode 100644
index 0000000..2b92eb0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.g
@@ -0,0 +1,31937 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+grammar InternalEntityMockDSL;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+
+}
+@parser::members {
+	private EntityMockDSLGrammarAccess grammarAccess;
+
+	public void setGrammarAccess(EntityMockDSLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+
+	@Override
+	protected Grammar getGrammar() {
+		return grammarAccess.getGrammar();
+	}
+
+	@Override
+	protected String getValueForTokenName(String tokenName) {
+		return tokenName;
+	}
+}
+
+// Entry rule entryRuleEntityMockModel
+entryRuleEntityMockModel
+:
+{ before(grammarAccess.getEntityMockModelRule()); }
+	 ruleEntityMockModel
+{ after(grammarAccess.getEntityMockModelRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockModel
+ruleEntityMockModel 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockModelAccess().getGroup()); }
+		(rule__EntityMockModel__Group__0)
+		{ after(grammarAccess.getEntityMockModelAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockPackage
+entryRuleEntityMockPackage
+:
+{ before(grammarAccess.getEntityMockPackageRule()); }
+	 ruleEntityMockPackage
+{ after(grammarAccess.getEntityMockPackageRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockPackage
+ruleEntityMockPackage 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockPackageAccess().getGroup()); }
+		(rule__EntityMockPackage__Group__0)
+		{ after(grammarAccess.getEntityMockPackageAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMock
+entryRuleEntityMock
+:
+{ before(grammarAccess.getEntityMockRule()); }
+	 ruleEntityMock
+{ after(grammarAccess.getEntityMockRule()); } 
+	 EOF 
+;
+
+// Rule EntityMock
+ruleEntityMock 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getGroup()); }
+		(rule__EntityMock__Group__0)
+		{ after(grammarAccess.getEntityMockAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRunningDataInterchanges
+entryRuleRunningDataInterchanges
+:
+{ before(grammarAccess.getRunningDataInterchangesRule()); }
+	 ruleRunningDataInterchanges
+{ after(grammarAccess.getRunningDataInterchangesRule()); } 
+	 EOF 
+;
+
+// Rule RunningDataInterchanges
+ruleRunningDataInterchanges 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRunningDataInterchangesAccess().getGroup()); }
+		(rule__RunningDataInterchanges__Group__0)
+		{ after(grammarAccess.getRunningDataInterchangesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRunningDataInterchange
+entryRuleRunningDataInterchange
+:
+{ before(grammarAccess.getRunningDataInterchangeRule()); }
+	 ruleRunningDataInterchange
+{ after(grammarAccess.getRunningDataInterchangeRule()); } 
+	 EOF 
+;
+
+// Rule RunningDataInterchange
+ruleRunningDataInterchange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRunningDataInterchangeAccess().getGroup()); }
+		(rule__RunningDataInterchange__Group__0)
+		{ after(grammarAccess.getRunningDataInterchangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockResources
+entryRuleEntityMockResources
+:
+{ before(grammarAccess.getEntityMockResourcesRule()); }
+	 ruleEntityMockResources
+{ after(grammarAccess.getEntityMockResourcesRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockResources
+ruleEntityMockResources 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockResourcesAccess().getGroup()); }
+		(rule__EntityMockResources__Group__0)
+		{ after(grammarAccess.getEntityMockResourcesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockResource
+entryRuleEntityMockResource
+:
+{ before(grammarAccess.getEntityMockResourceRule()); }
+	 ruleEntityMockResource
+{ after(grammarAccess.getEntityMockResourceRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockResource
+ruleEntityMockResource 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockResourceAccess().getGroup()); }
+		(rule__EntityMockResource__Group__0)
+		{ after(grammarAccess.getEntityMockResourceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockResourceAttribute
+entryRuleEntityMockResourceAttribute
+:
+{ before(grammarAccess.getEntityMockResourceAttributeRule()); }
+	 ruleEntityMockResourceAttribute
+{ after(grammarAccess.getEntityMockResourceAttributeRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockResourceAttribute
+ruleEntityMockResourceAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockResourceAttributeAccess().getGroup()); }
+		(rule__EntityMockResourceAttribute__Group__0)
+		{ after(grammarAccess.getEntityMockResourceAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockResourceDataRow
+entryRuleEntityMockResourceDataRow
+:
+{ before(grammarAccess.getEntityMockResourceDataRowRule()); }
+	 ruleEntityMockResourceDataRow
+{ after(grammarAccess.getEntityMockResourceDataRowRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockResourceDataRow
+ruleEntityMockResourceDataRow 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup()); }
+		(rule__EntityMockResourceDataRow__Group__0)
+		{ after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjects
+entryRuleEntityMockObjects
+:
+{ before(grammarAccess.getEntityMockObjectsRule()); }
+	 ruleEntityMockObjects
+{ after(grammarAccess.getEntityMockObjectsRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjects
+ruleEntityMockObjects 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectsAccess().getGroup()); }
+		(rule__EntityMockObjects__Group__0)
+		{ after(grammarAccess.getEntityMockObjectsAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObject
+entryRuleEntityMockObject
+:
+{ before(grammarAccess.getEntityMockObjectRule()); }
+	 ruleEntityMockObject
+{ after(grammarAccess.getEntityMockObjectRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObject
+ruleEntityMockObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectAccess().getGroup()); }
+		(rule__EntityMockObject__Group__0)
+		{ after(grammarAccess.getEntityMockObjectAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectEnum
+entryRuleEntityMockObjectEnum
+:
+{ before(grammarAccess.getEntityMockObjectEnumRule()); }
+	 ruleEntityMockObjectEnum
+{ after(grammarAccess.getEntityMockObjectEnumRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectEnum
+ruleEntityMockObjectEnum 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectEnumAccess().getGroup()); }
+		(rule__EntityMockObjectEnum__Group__0)
+		{ after(grammarAccess.getEntityMockObjectEnumAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIEntityMockObjectAttribute
+entryRuleIEntityMockObjectAttribute
+:
+{ before(grammarAccess.getIEntityMockObjectAttributeRule()); }
+	 ruleIEntityMockObjectAttribute
+{ after(grammarAccess.getIEntityMockObjectAttributeRule()); } 
+	 EOF 
+;
+
+// Rule IEntityMockObjectAttribute
+ruleIEntityMockObjectAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getAlternatives()); }
+		(rule__IEntityMockObjectAttribute__Alternatives)
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectPlainValue
+entryRuleEntityMockObjectPlainValue
+:
+{ before(grammarAccess.getEntityMockObjectPlainValueRule()); }
+	 ruleEntityMockObjectPlainValue
+{ after(grammarAccess.getEntityMockObjectPlainValueRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectPlainValue
+ruleEntityMockObjectPlainValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup()); }
+		(rule__EntityMockObjectPlainValue__Group__0)
+		{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectResourceValue
+entryRuleEntityMockObjectResourceValue
+:
+{ before(grammarAccess.getEntityMockObjectResourceValueRule()); }
+	 ruleEntityMockObjectResourceValue
+{ after(grammarAccess.getEntityMockObjectResourceValueRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectResourceValue
+ruleEntityMockObjectResourceValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup()); }
+		(rule__EntityMockObjectResourceValue__Group__0)
+		{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectArrayValue
+entryRuleEntityMockObjectArrayValue
+:
+{ before(grammarAccess.getEntityMockObjectArrayValueRule()); }
+	 ruleEntityMockObjectArrayValue
+{ after(grammarAccess.getEntityMockObjectArrayValueRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectArrayValue
+ruleEntityMockObjectArrayValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getGroup()); }
+		(rule__EntityMockObjectArrayValue__Group__0)
+		{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectItemValue
+entryRuleEntityMockObjectItemValue
+:
+{ before(grammarAccess.getEntityMockObjectItemValueRule()); }
+	 ruleEntityMockObjectItemValue
+{ after(grammarAccess.getEntityMockObjectItemValueRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectItemValue
+ruleEntityMockObjectItemValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectItemValueAccess().getGroup()); }
+		(rule__EntityMockObjectItemValue__Group__0)
+		{ after(grammarAccess.getEntityMockObjectItemValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectEmbed
+entryRuleEntityMockObjectEmbed
+:
+{ before(grammarAccess.getEntityMockObjectEmbedRule()); }
+	 ruleEntityMockObjectEmbed
+{ after(grammarAccess.getEntityMockObjectEmbedRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectEmbed
+ruleEntityMockObjectEmbed 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectEmbedAccess().getGroup()); }
+		(rule__EntityMockObjectEmbed__Group__0)
+		{ after(grammarAccess.getEntityMockObjectEmbedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectFunction
+entryRuleEntityMockObjectFunction
+:
+{ before(grammarAccess.getEntityMockObjectFunctionRule()); }
+	 ruleEntityMockObjectFunction
+{ after(grammarAccess.getEntityMockObjectFunctionRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectFunction
+ruleEntityMockObjectFunction 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup()); }
+		(rule__EntityMockObjectFunction__Group__0)
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectFunctionParameter
+entryRuleEntityMockObjectFunctionParameter
+:
+{ before(grammarAccess.getEntityMockObjectFunctionParameterRule()); }
+	 ruleEntityMockObjectFunctionParameter
+{ after(grammarAccess.getEntityMockObjectFunctionParameterRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectFunctionParameter
+ruleEntityMockObjectFunctionParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getGroup()); }
+		(rule__EntityMockObjectFunctionParameter__Group__0)
+		{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockObjectFill
+entryRuleEntityMockObjectFill
+:
+{ before(grammarAccess.getEntityMockObjectFillRule()); }
+	 ruleEntityMockObjectFill
+{ after(grammarAccess.getEntityMockObjectFillRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockObjectFill
+ruleEntityMockObjectFill 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockObjectFillAccess().getGroup()); }
+		(rule__EntityMockObjectFill__Group__0)
+		{ after(grammarAccess.getEntityMockObjectFillAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerType
+entryRulePropertyFillerType
+:
+{ before(grammarAccess.getPropertyFillerTypeRule()); }
+	 rulePropertyFillerType
+{ after(grammarAccess.getPropertyFillerTypeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerType
+rulePropertyFillerType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getAlternatives()); }
+		(rule__PropertyFillerType__Alternatives)
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerDateFuture
+entryRulePropertyFillerDateFuture
+:
+{ before(grammarAccess.getPropertyFillerDateFutureRule()); }
+	 rulePropertyFillerDateFuture
+{ after(grammarAccess.getPropertyFillerDateFutureRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerDateFuture
+rulePropertyFillerDateFuture 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerDateFutureAccess().getGroup()); }
+		(rule__PropertyFillerDateFuture__Group__0)
+		{ after(grammarAccess.getPropertyFillerDateFutureAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerDatePast
+entryRulePropertyFillerDatePast
+:
+{ before(grammarAccess.getPropertyFillerDatePastRule()); }
+	 rulePropertyFillerDatePast
+{ after(grammarAccess.getPropertyFillerDatePastRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerDatePast
+rulePropertyFillerDatePast 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerDatePastAccess().getGroup()); }
+		(rule__PropertyFillerDatePast__Group__0)
+		{ after(grammarAccess.getPropertyFillerDatePastAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerBoolean
+entryRulePropertyFillerBoolean
+:
+{ before(grammarAccess.getPropertyFillerBooleanRule()); }
+	 rulePropertyFillerBoolean
+{ after(grammarAccess.getPropertyFillerBooleanRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerBoolean
+rulePropertyFillerBoolean 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerBooleanAccess().getGroup()); }
+		(rule__PropertyFillerBoolean__Group__0)
+		{ after(grammarAccess.getPropertyFillerBooleanAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerDateRange
+entryRulePropertyFillerDateRange
+:
+{ before(grammarAccess.getPropertyFillerDateRangeRule()); }
+	 rulePropertyFillerDateRange
+{ after(grammarAccess.getPropertyFillerDateRangeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerDateRange
+rulePropertyFillerDateRange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerDateRangeAccess().getGroup()); }
+		(rule__PropertyFillerDateRange__Group__0)
+		{ after(grammarAccess.getPropertyFillerDateRangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerSignedDoubleRange
+entryRulePropertyFillerSignedDoubleRange
+:
+{ before(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); }
+	 rulePropertyFillerSignedDoubleRange
+{ after(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerSignedDoubleRange
+rulePropertyFillerSignedDoubleRange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup()); }
+		(rule__PropertyFillerSignedDoubleRange__Group__0)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerSignedDoubleRandom
+entryRulePropertyFillerSignedDoubleRandom
+:
+{ before(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); }
+	 rulePropertyFillerSignedDoubleRandom
+{ after(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerSignedDoubleRandom
+rulePropertyFillerSignedDoubleRandom 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getGroup()); }
+		(rule__PropertyFillerSignedDoubleRandom__Group__0)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerSignedIntegerRange
+entryRulePropertyFillerSignedIntegerRange
+:
+{ before(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); }
+	 rulePropertyFillerSignedIntegerRange
+{ after(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerSignedIntegerRange
+rulePropertyFillerSignedIntegerRange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup()); }
+		(rule__PropertyFillerSignedIntegerRange__Group__0)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerSignedIntegerRandom
+entryRulePropertyFillerSignedIntegerRandom
+:
+{ before(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); }
+	 rulePropertyFillerSignedIntegerRandom
+{ after(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerSignedIntegerRandom
+rulePropertyFillerSignedIntegerRandom 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getGroup()); }
+		(rule__PropertyFillerSignedIntegerRandom__Group__0)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerTextRandom
+entryRulePropertyFillerTextRandom
+:
+{ before(grammarAccess.getPropertyFillerTextRandomRule()); }
+	 rulePropertyFillerTextRandom
+{ after(grammarAccess.getPropertyFillerTextRandomRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerTextRandom
+rulePropertyFillerTextRandom 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerTextRandomAccess().getGroup()); }
+		(rule__PropertyFillerTextRandom__Group__0)
+		{ after(grammarAccess.getPropertyFillerTextRandomAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerTextParagraphs
+entryRulePropertyFillerTextParagraphs
+:
+{ before(grammarAccess.getPropertyFillerTextParagraphsRule()); }
+	 rulePropertyFillerTextParagraphs
+{ after(grammarAccess.getPropertyFillerTextParagraphsRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerTextParagraphs
+rulePropertyFillerTextParagraphs 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerTextParagraphsAccess().getGroup()); }
+		(rule__PropertyFillerTextParagraphs__Group__0)
+		{ after(grammarAccess.getPropertyFillerTextParagraphsAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerTextSentences
+entryRulePropertyFillerTextSentences
+:
+{ before(grammarAccess.getPropertyFillerTextSentencesRule()); }
+	 rulePropertyFillerTextSentences
+{ after(grammarAccess.getPropertyFillerTextSentencesRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerTextSentences
+rulePropertyFillerTextSentences 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerTextSentencesAccess().getGroup()); }
+		(rule__PropertyFillerTextSentences__Group__0)
+		{ after(grammarAccess.getPropertyFillerTextSentencesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerTextWords
+entryRulePropertyFillerTextWords
+:
+{ before(grammarAccess.getPropertyFillerTextWordsRule()); }
+	 rulePropertyFillerTextWords
+{ after(grammarAccess.getPropertyFillerTextWordsRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerTextWords
+rulePropertyFillerTextWords 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerTextWordsAccess().getGroup()); }
+		(rule__PropertyFillerTextWords__Group__0)
+		{ after(grammarAccess.getPropertyFillerTextWordsAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerUnsignedDoubleRange
+entryRulePropertyFillerUnsignedDoubleRange
+:
+{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); }
+	 rulePropertyFillerUnsignedDoubleRange
+{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerUnsignedDoubleRange
+rulePropertyFillerUnsignedDoubleRange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup()); }
+		(rule__PropertyFillerUnsignedDoubleRange__Group__0)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerUnsignedDoubleRandom
+entryRulePropertyFillerUnsignedDoubleRandom
+:
+{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); }
+	 rulePropertyFillerUnsignedDoubleRandom
+{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerUnsignedDoubleRandom
+rulePropertyFillerUnsignedDoubleRandom 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getGroup()); }
+		(rule__PropertyFillerUnsignedDoubleRandom__Group__0)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerUnsignedIntegerRange
+entryRulePropertyFillerUnsignedIntegerRange
+:
+{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); }
+	 rulePropertyFillerUnsignedIntegerRange
+{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerUnsignedIntegerRange
+rulePropertyFillerUnsignedIntegerRange 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup()); }
+		(rule__PropertyFillerUnsignedIntegerRange__Group__0)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyFillerUnsignedIntegerRandom
+entryRulePropertyFillerUnsignedIntegerRandom
+:
+{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); }
+	 rulePropertyFillerUnsignedIntegerRandom
+{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); } 
+	 EOF 
+;
+
+// Rule PropertyFillerUnsignedIntegerRandom
+rulePropertyFillerUnsignedIntegerRandom 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getGroup()); }
+		(rule__PropertyFillerUnsignedIntegerRandom__Group__0)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockEntities
+entryRuleEntityMockEntities
+:
+{ before(grammarAccess.getEntityMockEntitiesRule()); }
+	 ruleEntityMockEntities
+{ after(grammarAccess.getEntityMockEntitiesRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockEntities
+ruleEntityMockEntities 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockEntitiesAccess().getGroup()); }
+		(rule__EntityMockEntities__Group__0)
+		{ after(grammarAccess.getEntityMockEntitiesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockEntity
+entryRuleEntityMockEntity
+:
+{ before(grammarAccess.getEntityMockEntityRule()); }
+	 ruleEntityMockEntity
+{ after(grammarAccess.getEntityMockEntityRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockEntity
+ruleEntityMockEntity 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getGroup()); }
+		(rule__EntityMockEntity__Group__0)
+		{ after(grammarAccess.getEntityMockEntityAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIIterate
+entryRuleIIterate
+:
+{ before(grammarAccess.getIIterateRule()); }
+	 ruleIIterate
+{ after(grammarAccess.getIIterateRule()); } 
+	 EOF 
+;
+
+// Rule IIterate
+ruleIIterate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIIterateAccess().getAlternatives()); }
+		(rule__IIterate__Alternatives)
+		{ after(grammarAccess.getIIterateAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIntegerIterate
+entryRuleIntegerIterate
+:
+{ before(grammarAccess.getIntegerIterateRule()); }
+	 ruleIntegerIterate
+{ after(grammarAccess.getIntegerIterateRule()); } 
+	 EOF 
+;
+
+// Rule IntegerIterate
+ruleIntegerIterate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIntegerIterateAccess().getGroup()); }
+		(rule__IntegerIterate__Group__0)
+		{ after(grammarAccess.getIntegerIterateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDateIterate
+entryRuleDateIterate
+:
+{ before(grammarAccess.getDateIterateRule()); }
+	 ruleDateIterate
+{ after(grammarAccess.getDateIterateRule()); } 
+	 EOF 
+;
+
+// Rule DateIterate
+ruleDateIterate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDateIterateAccess().getGroup()); }
+		(rule__DateIterate__Group__0)
+		{ after(grammarAccess.getDateIterateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDate
+entryRuleDate
+:
+{ before(grammarAccess.getDateRule()); }
+	 ruleDate
+{ after(grammarAccess.getDateRule()); } 
+	 EOF 
+;
+
+// Rule Date
+ruleDate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDateAccess().getAlternatives()); }
+		(rule__Date__Alternatives)
+		{ after(grammarAccess.getDateAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockByResourceAttribute
+entryRuleEntityMockByResourceAttribute
+:
+{ before(grammarAccess.getEntityMockByResourceAttributeRule()); }
+	 ruleEntityMockByResourceAttribute
+{ after(grammarAccess.getEntityMockByResourceAttributeRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockByResourceAttribute
+ruleEntityMockByResourceAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getGroup()); }
+		(rule__EntityMockByResourceAttribute__Group__0)
+		{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockTemplate
+entryRuleEntityMockTemplate
+:
+{ before(grammarAccess.getEntityMockTemplateRule()); }
+	 ruleEntityMockTemplate
+{ after(grammarAccess.getEntityMockTemplateRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockTemplate
+ruleEntityMockTemplate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockTemplateAccess().getGroup()); }
+		(rule__EntityMockTemplate__Group__0)
+		{ after(grammarAccess.getEntityMockTemplateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIEntityMockAttribute
+entryRuleIEntityMockAttribute
+:
+{ before(grammarAccess.getIEntityMockAttributeRule()); }
+	 ruleIEntityMockAttribute
+{ after(grammarAccess.getIEntityMockAttributeRule()); } 
+	 EOF 
+;
+
+// Rule IEntityMockAttribute
+ruleIEntityMockAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIEntityMockAttributeAccess().getAlternatives()); }
+		(rule__IEntityMockAttribute__Alternatives)
+		{ after(grammarAccess.getIEntityMockAttributeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockEntityFunction
+entryRuleEntityMockEntityFunction
+:
+{ before(grammarAccess.getEntityMockEntityFunctionRule()); }
+	 ruleEntityMockEntityFunction
+{ after(grammarAccess.getEntityMockEntityFunctionRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockEntityFunction
+ruleEntityMockEntityFunction 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup()); }
+		(rule__EntityMockEntityFunction__Group__0)
+		{ after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockEntityFunctionParameter
+entryRuleEntityMockEntityFunctionParameter
+:
+{ before(grammarAccess.getEntityMockEntityFunctionParameterRule()); }
+	 ruleEntityMockEntityFunctionParameter
+{ after(grammarAccess.getEntityMockEntityFunctionParameterRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockEntityFunctionParameter
+ruleEntityMockEntityFunctionParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAlternatives()); }
+		(rule__EntityMockEntityFunctionParameter__Alternatives)
+		{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockEntityNestedAttribute
+entryRuleEntityMockEntityNestedAttribute
+:
+{ before(grammarAccess.getEntityMockEntityNestedAttributeRule()); }
+	 ruleEntityMockEntityNestedAttribute
+{ after(grammarAccess.getEntityMockEntityNestedAttributeRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockEntityNestedAttribute
+ruleEntityMockEntityNestedAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getGroup()); }
+		(rule__EntityMockEntityNestedAttribute__Group__0)
+		{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockReferencedObjectAttribute
+entryRuleEntityMockReferencedObjectAttribute
+:
+{ before(grammarAccess.getEntityMockReferencedObjectAttributeRule()); }
+	 ruleEntityMockReferencedObjectAttribute
+{ after(grammarAccess.getEntityMockReferencedObjectAttributeRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockReferencedObjectAttribute
+ruleEntityMockReferencedObjectAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup()); }
+		(rule__EntityMockReferencedObjectAttribute__Group__0)
+		{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockAttributeByObject
+entryRuleEntityMockAttributeByObject
+:
+{ before(grammarAccess.getEntityMockAttributeByObjectRule()); }
+	 ruleEntityMockAttributeByObject
+{ after(grammarAccess.getEntityMockAttributeByObjectRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockAttributeByObject
+ruleEntityMockAttributeByObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getAlternatives()); }
+		(rule__EntityMockAttributeByObject__Alternatives)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockAttributeFiller
+entryRuleEntityMockAttributeFiller
+:
+{ before(grammarAccess.getEntityMockAttributeFillerRule()); }
+	 ruleEntityMockAttributeFiller
+{ after(grammarAccess.getEntityMockAttributeFillerRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockAttributeFiller
+ruleEntityMockAttributeFiller 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockAttributeFillerAccess().getGroup()); }
+		(rule__EntityMockAttributeFiller__Group__0)
+		{ after(grammarAccess.getEntityMockAttributeFillerAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEntityMockAttributeByReference
+entryRuleEntityMockAttributeByReference
+:
+{ before(grammarAccess.getEntityMockAttributeByReferenceRule()); }
+	 ruleEntityMockAttributeByReference
+{ after(grammarAccess.getEntityMockAttributeByReferenceRule()); } 
+	 EOF 
+;
+
+// Rule EntityMockAttributeByReference
+ruleEntityMockAttributeByReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup()); }
+		(rule__EntityMockAttributeByReference__Group__0)
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignedNumber
+entryRuleSignedNumber
+:
+{ before(grammarAccess.getSignedNumberRule()); }
+	 ruleSignedNumber
+{ after(grammarAccess.getSignedNumberRule()); } 
+	 EOF 
+;
+
+// Rule SignedNumber
+ruleSignedNumber 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignedNumberAccess().getGroup()); }
+		(rule__SignedNumber__Group__0)
+		{ after(grammarAccess.getSignedNumberAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnsignedNumber
+entryRuleUnsignedNumber
+:
+{ before(grammarAccess.getUnsignedNumberRule()); }
+	 ruleUnsignedNumber
+{ after(grammarAccess.getUnsignedNumberRule()); } 
+	 EOF 
+;
+
+// Rule UnsignedNumber
+ruleUnsignedNumber 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnsignedNumberAccess().getGroup()); }
+		(rule__UnsignedNumber__Group__0)
+		{ after(grammarAccess.getUnsignedNumberAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSINT
+entryRuleSINT
+:
+{ before(grammarAccess.getSINTRule()); }
+	 ruleSINT
+{ after(grammarAccess.getSINTRule()); } 
+	 EOF 
+;
+
+// Rule SINT
+ruleSINT 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSINTAccess().getGroup()); }
+		(rule__SINT__Group__0)
+		{ after(grammarAccess.getSINTAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXImportDeclaration
+entryRuleXImportDeclaration
+:
+{ before(grammarAccess.getXImportDeclarationRule()); }
+	 ruleXImportDeclaration
+{ after(grammarAccess.getXImportDeclarationRule()); } 
+	 EOF 
+;
+
+// Rule XImportDeclaration
+ruleXImportDeclaration 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getGroup()); }
+		(rule__XImportDeclaration__Group__0)
+		{ after(grammarAccess.getXImportDeclarationAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAnnotation
+entryRuleXAnnotation
+:
+{ before(grammarAccess.getXAnnotationRule()); }
+	 ruleXAnnotation
+{ after(grammarAccess.getXAnnotationRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotation
+ruleXAnnotation 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getGroup()); }
+		(rule__XAnnotation__Group__0)
+		{ after(grammarAccess.getXAnnotationAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAnnotationElementValuePair
+entryRuleXAnnotationElementValuePair
+:
+{ before(grammarAccess.getXAnnotationElementValuePairRule()); }
+	 ruleXAnnotationElementValuePair
+{ after(grammarAccess.getXAnnotationElementValuePairRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValuePair
+ruleXAnnotationElementValuePair 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
+		(rule__XAnnotationElementValuePair__Group__0)
+		{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAnnotationElementValueOrCommaList
+entryRuleXAnnotationElementValueOrCommaList
+:
+{ before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
+	 ruleXAnnotationElementValueOrCommaList
+{ after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValueOrCommaList
+ruleXAnnotationElementValueOrCommaList 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
+		(rule__XAnnotationElementValueOrCommaList__Alternatives)
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAnnotationElementValue
+entryRuleXAnnotationElementValue
+:
+{ before(grammarAccess.getXAnnotationElementValueRule()); }
+	 ruleXAnnotationElementValue
+{ after(grammarAccess.getXAnnotationElementValueRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationElementValue
+ruleXAnnotationElementValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
+		(rule__XAnnotationElementValue__Alternatives)
+		{ after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAnnotationOrExpression
+entryRuleXAnnotationOrExpression
+:
+{ before(grammarAccess.getXAnnotationOrExpressionRule()); }
+	 ruleXAnnotationOrExpression
+{ after(grammarAccess.getXAnnotationOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAnnotationOrExpression
+ruleXAnnotationOrExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
+		(rule__XAnnotationOrExpression__Alternatives)
+		{ after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXExpression
+entryRuleXExpression
+:
+{ before(grammarAccess.getXExpressionRule()); }
+	 ruleXExpression
+{ after(grammarAccess.getXExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XExpression
+ruleXExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
+		ruleXAssignment
+		{ after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAssignment
+entryRuleXAssignment
+:
+{ before(grammarAccess.getXAssignmentRule()); }
+	 ruleXAssignment
+{ after(grammarAccess.getXAssignmentRule()); } 
+	 EOF 
+;
+
+// Rule XAssignment
+ruleXAssignment 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getAlternatives()); }
+		(rule__XAssignment__Alternatives)
+		{ after(grammarAccess.getXAssignmentAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpSingleAssign
+entryRuleOpSingleAssign
+:
+{ before(grammarAccess.getOpSingleAssignRule()); }
+	 ruleOpSingleAssign
+{ after(grammarAccess.getOpSingleAssignRule()); } 
+	 EOF 
+;
+
+// Rule OpSingleAssign
+ruleOpSingleAssign 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
+		'='
+		{ after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpMultiAssign
+entryRuleOpMultiAssign
+:
+{ before(grammarAccess.getOpMultiAssignRule()); }
+	 ruleOpMultiAssign
+{ after(grammarAccess.getOpMultiAssignRule()); } 
+	 EOF 
+;
+
+// Rule OpMultiAssign
+ruleOpMultiAssign 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
+		(rule__OpMultiAssign__Alternatives)
+		{ after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXOrExpression
+entryRuleXOrExpression
+:
+{ before(grammarAccess.getXOrExpressionRule()); }
+	 ruleXOrExpression
+{ after(grammarAccess.getXOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XOrExpression
+ruleXOrExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXOrExpressionAccess().getGroup()); }
+		(rule__XOrExpression__Group__0)
+		{ after(grammarAccess.getXOrExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpOr
+entryRuleOpOr
+:
+{ before(grammarAccess.getOpOrRule()); }
+	 ruleOpOr
+{ after(grammarAccess.getOpOrRule()); } 
+	 EOF 
+;
+
+// Rule OpOr
+ruleOpOr 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
+		'||'
+		{ after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAndExpression
+entryRuleXAndExpression
+:
+{ before(grammarAccess.getXAndExpressionRule()); }
+	 ruleXAndExpression
+{ after(grammarAccess.getXAndExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAndExpression
+ruleXAndExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAndExpressionAccess().getGroup()); }
+		(rule__XAndExpression__Group__0)
+		{ after(grammarAccess.getXAndExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpAnd
+entryRuleOpAnd
+:
+{ before(grammarAccess.getOpAndRule()); }
+	 ruleOpAnd
+{ after(grammarAccess.getOpAndRule()); } 
+	 EOF 
+;
+
+// Rule OpAnd
+ruleOpAnd 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
+		'&&'
+		{ after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXEqualityExpression
+entryRuleXEqualityExpression
+:
+{ before(grammarAccess.getXEqualityExpressionRule()); }
+	 ruleXEqualityExpression
+{ after(grammarAccess.getXEqualityExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XEqualityExpression
+ruleXEqualityExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
+		(rule__XEqualityExpression__Group__0)
+		{ after(grammarAccess.getXEqualityExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpEquality
+entryRuleOpEquality
+:
+{ before(grammarAccess.getOpEqualityRule()); }
+	 ruleOpEquality
+{ after(grammarAccess.getOpEqualityRule()); } 
+	 EOF 
+;
+
+// Rule OpEquality
+ruleOpEquality 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpEqualityAccess().getAlternatives()); }
+		(rule__OpEquality__Alternatives)
+		{ after(grammarAccess.getOpEqualityAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXRelationalExpression
+entryRuleXRelationalExpression
+:
+{ before(grammarAccess.getXRelationalExpressionRule()); }
+	 ruleXRelationalExpression
+{ after(grammarAccess.getXRelationalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XRelationalExpression
+ruleXRelationalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
+		(rule__XRelationalExpression__Group__0)
+		{ after(grammarAccess.getXRelationalExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpCompare
+entryRuleOpCompare
+:
+{ before(grammarAccess.getOpCompareRule()); }
+	 ruleOpCompare
+{ after(grammarAccess.getOpCompareRule()); } 
+	 EOF 
+;
+
+// Rule OpCompare
+ruleOpCompare 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpCompareAccess().getAlternatives()); }
+		(rule__OpCompare__Alternatives)
+		{ after(grammarAccess.getOpCompareAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXOtherOperatorExpression
+entryRuleXOtherOperatorExpression
+:
+{ before(grammarAccess.getXOtherOperatorExpressionRule()); }
+	 ruleXOtherOperatorExpression
+{ after(grammarAccess.getXOtherOperatorExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XOtherOperatorExpression
+ruleXOtherOperatorExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
+		(rule__XOtherOperatorExpression__Group__0)
+		{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpOther
+entryRuleOpOther
+:
+{ before(grammarAccess.getOpOtherRule()); }
+	 ruleOpOther
+{ after(grammarAccess.getOpOtherRule()); } 
+	 EOF 
+;
+
+// Rule OpOther
+ruleOpOther 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpOtherAccess().getAlternatives()); }
+		(rule__OpOther__Alternatives)
+		{ after(grammarAccess.getOpOtherAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXAdditiveExpression
+entryRuleXAdditiveExpression
+:
+{ before(grammarAccess.getXAdditiveExpressionRule()); }
+	 ruleXAdditiveExpression
+{ after(grammarAccess.getXAdditiveExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XAdditiveExpression
+ruleXAdditiveExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
+		(rule__XAdditiveExpression__Group__0)
+		{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpAdd
+entryRuleOpAdd
+:
+{ before(grammarAccess.getOpAddRule()); }
+	 ruleOpAdd
+{ after(grammarAccess.getOpAddRule()); } 
+	 EOF 
+;
+
+// Rule OpAdd
+ruleOpAdd 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpAddAccess().getAlternatives()); }
+		(rule__OpAdd__Alternatives)
+		{ after(grammarAccess.getOpAddAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXMultiplicativeExpression
+entryRuleXMultiplicativeExpression
+:
+{ before(grammarAccess.getXMultiplicativeExpressionRule()); }
+	 ruleXMultiplicativeExpression
+{ after(grammarAccess.getXMultiplicativeExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XMultiplicativeExpression
+ruleXMultiplicativeExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
+		(rule__XMultiplicativeExpression__Group__0)
+		{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpMulti
+entryRuleOpMulti
+:
+{ before(grammarAccess.getOpMultiRule()); }
+	 ruleOpMulti
+{ after(grammarAccess.getOpMultiRule()); } 
+	 EOF 
+;
+
+// Rule OpMulti
+ruleOpMulti 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpMultiAccess().getAlternatives()); }
+		(rule__OpMulti__Alternatives)
+		{ after(grammarAccess.getOpMultiAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXUnaryOperation
+entryRuleXUnaryOperation
+:
+{ before(grammarAccess.getXUnaryOperationRule()); }
+	 ruleXUnaryOperation
+{ after(grammarAccess.getXUnaryOperationRule()); } 
+	 EOF 
+;
+
+// Rule XUnaryOperation
+ruleXUnaryOperation 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
+		(rule__XUnaryOperation__Alternatives)
+		{ after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpUnary
+entryRuleOpUnary
+:
+{ before(grammarAccess.getOpUnaryRule()); }
+	 ruleOpUnary
+{ after(grammarAccess.getOpUnaryRule()); } 
+	 EOF 
+;
+
+// Rule OpUnary
+ruleOpUnary 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpUnaryAccess().getAlternatives()); }
+		(rule__OpUnary__Alternatives)
+		{ after(grammarAccess.getOpUnaryAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXCastedExpression
+entryRuleXCastedExpression
+:
+{ before(grammarAccess.getXCastedExpressionRule()); }
+	 ruleXCastedExpression
+{ after(grammarAccess.getXCastedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XCastedExpression
+ruleXCastedExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXCastedExpressionAccess().getGroup()); }
+		(rule__XCastedExpression__Group__0)
+		{ after(grammarAccess.getXCastedExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXPostfixOperation
+entryRuleXPostfixOperation
+:
+{ before(grammarAccess.getXPostfixOperationRule()); }
+	 ruleXPostfixOperation
+{ after(grammarAccess.getXPostfixOperationRule()); } 
+	 EOF 
+;
+
+// Rule XPostfixOperation
+ruleXPostfixOperation 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXPostfixOperationAccess().getGroup()); }
+		(rule__XPostfixOperation__Group__0)
+		{ after(grammarAccess.getXPostfixOperationAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOpPostfix
+entryRuleOpPostfix
+:
+{ before(grammarAccess.getOpPostfixRule()); }
+	 ruleOpPostfix
+{ after(grammarAccess.getOpPostfixRule()); } 
+	 EOF 
+;
+
+// Rule OpPostfix
+ruleOpPostfix 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOpPostfixAccess().getAlternatives()); }
+		(rule__OpPostfix__Alternatives)
+		{ after(grammarAccess.getOpPostfixAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXMemberFeatureCall
+entryRuleXMemberFeatureCall
+:
+{ before(grammarAccess.getXMemberFeatureCallRule()); }
+	 ruleXMemberFeatureCall
+{ after(grammarAccess.getXMemberFeatureCallRule()); } 
+	 EOF 
+;
+
+// Rule XMemberFeatureCall
+ruleXMemberFeatureCall 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
+		(rule__XMemberFeatureCall__Group__0)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXPrimaryExpression
+entryRuleXPrimaryExpression
+:
+{ before(grammarAccess.getXPrimaryExpressionRule()); }
+	 ruleXPrimaryExpression
+{ after(grammarAccess.getXPrimaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XPrimaryExpression
+ruleXPrimaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
+		(rule__XPrimaryExpression__Alternatives)
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXLiteral
+entryRuleXLiteral
+:
+{ before(grammarAccess.getXLiteralRule()); }
+	 ruleXLiteral
+{ after(grammarAccess.getXLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XLiteral
+ruleXLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXLiteralAccess().getAlternatives()); }
+		(rule__XLiteral__Alternatives)
+		{ after(grammarAccess.getXLiteralAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXCollectionLiteral
+entryRuleXCollectionLiteral
+:
+{ before(grammarAccess.getXCollectionLiteralRule()); }
+	 ruleXCollectionLiteral
+{ after(grammarAccess.getXCollectionLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XCollectionLiteral
+ruleXCollectionLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
+		(rule__XCollectionLiteral__Alternatives)
+		{ after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXSetLiteral
+entryRuleXSetLiteral
+:
+{ before(grammarAccess.getXSetLiteralRule()); }
+	 ruleXSetLiteral
+{ after(grammarAccess.getXSetLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XSetLiteral
+ruleXSetLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXSetLiteralAccess().getGroup()); }
+		(rule__XSetLiteral__Group__0)
+		{ after(grammarAccess.getXSetLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXListLiteral
+entryRuleXListLiteral
+:
+{ before(grammarAccess.getXListLiteralRule()); }
+	 ruleXListLiteral
+{ after(grammarAccess.getXListLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XListLiteral
+ruleXListLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXListLiteralAccess().getGroup()); }
+		(rule__XListLiteral__Group__0)
+		{ after(grammarAccess.getXListLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXClosure
+entryRuleXClosure
+:
+{ before(grammarAccess.getXClosureRule()); }
+	 ruleXClosure
+{ after(grammarAccess.getXClosureRule()); } 
+	 EOF 
+;
+
+// Rule XClosure
+ruleXClosure 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXClosureAccess().getGroup()); }
+		(rule__XClosure__Group__0)
+		{ after(grammarAccess.getXClosureAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXExpressionInClosure
+entryRuleXExpressionInClosure
+:
+{ before(grammarAccess.getXExpressionInClosureRule()); }
+	 ruleXExpressionInClosure
+{ after(grammarAccess.getXExpressionInClosureRule()); } 
+	 EOF 
+;
+
+// Rule XExpressionInClosure
+ruleXExpressionInClosure 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
+		(rule__XExpressionInClosure__Group__0)
+		{ after(grammarAccess.getXExpressionInClosureAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXShortClosure
+entryRuleXShortClosure
+:
+{ before(grammarAccess.getXShortClosureRule()); }
+	 ruleXShortClosure
+{ after(grammarAccess.getXShortClosureRule()); } 
+	 EOF 
+;
+
+// Rule XShortClosure
+ruleXShortClosure 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXShortClosureAccess().getGroup()); }
+		(rule__XShortClosure__Group__0)
+		{ after(grammarAccess.getXShortClosureAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXParenthesizedExpression
+entryRuleXParenthesizedExpression
+:
+{ before(grammarAccess.getXParenthesizedExpressionRule()); }
+	 ruleXParenthesizedExpression
+{ after(grammarAccess.getXParenthesizedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XParenthesizedExpression
+ruleXParenthesizedExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
+		(rule__XParenthesizedExpression__Group__0)
+		{ after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXIfExpression
+entryRuleXIfExpression
+:
+{ before(grammarAccess.getXIfExpressionRule()); }
+	 ruleXIfExpression
+{ after(grammarAccess.getXIfExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XIfExpression
+ruleXIfExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXIfExpressionAccess().getGroup()); }
+		(rule__XIfExpression__Group__0)
+		{ after(grammarAccess.getXIfExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXSwitchExpression
+entryRuleXSwitchExpression
+:
+{ before(grammarAccess.getXSwitchExpressionRule()); }
+	 ruleXSwitchExpression
+{ after(grammarAccess.getXSwitchExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XSwitchExpression
+ruleXSwitchExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
+		(rule__XSwitchExpression__Group__0)
+		{ after(grammarAccess.getXSwitchExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXCasePart
+entryRuleXCasePart
+:
+{ before(grammarAccess.getXCasePartRule()); }
+	 ruleXCasePart
+{ after(grammarAccess.getXCasePartRule()); } 
+	 EOF 
+;
+
+// Rule XCasePart
+ruleXCasePart 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getGroup()); }
+		(rule__XCasePart__Group__0)
+		{ after(grammarAccess.getXCasePartAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXForLoopExpression
+entryRuleXForLoopExpression
+:
+{ before(grammarAccess.getXForLoopExpressionRule()); }
+	 ruleXForLoopExpression
+{ after(grammarAccess.getXForLoopExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XForLoopExpression
+ruleXForLoopExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
+		(rule__XForLoopExpression__Group__0)
+		{ after(grammarAccess.getXForLoopExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXBasicForLoopExpression
+entryRuleXBasicForLoopExpression
+:
+{ before(grammarAccess.getXBasicForLoopExpressionRule()); }
+	 ruleXBasicForLoopExpression
+{ after(grammarAccess.getXBasicForLoopExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XBasicForLoopExpression
+ruleXBasicForLoopExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
+		(rule__XBasicForLoopExpression__Group__0)
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXWhileExpression
+entryRuleXWhileExpression
+:
+{ before(grammarAccess.getXWhileExpressionRule()); }
+	 ruleXWhileExpression
+{ after(grammarAccess.getXWhileExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XWhileExpression
+ruleXWhileExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXWhileExpressionAccess().getGroup()); }
+		(rule__XWhileExpression__Group__0)
+		{ after(grammarAccess.getXWhileExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXDoWhileExpression
+entryRuleXDoWhileExpression
+:
+{ before(grammarAccess.getXDoWhileExpressionRule()); }
+	 ruleXDoWhileExpression
+{ after(grammarAccess.getXDoWhileExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XDoWhileExpression
+ruleXDoWhileExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
+		(rule__XDoWhileExpression__Group__0)
+		{ after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXBlockExpression
+entryRuleXBlockExpression
+:
+{ before(grammarAccess.getXBlockExpressionRule()); }
+	 ruleXBlockExpression
+{ after(grammarAccess.getXBlockExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XBlockExpression
+ruleXBlockExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXBlockExpressionAccess().getGroup()); }
+		(rule__XBlockExpression__Group__0)
+		{ after(grammarAccess.getXBlockExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXExpressionOrVarDeclaration
+entryRuleXExpressionOrVarDeclaration
+:
+{ before(grammarAccess.getXExpressionOrVarDeclarationRule()); }
+	 ruleXExpressionOrVarDeclaration
+{ after(grammarAccess.getXExpressionOrVarDeclarationRule()); } 
+	 EOF 
+;
+
+// Rule XExpressionOrVarDeclaration
+ruleXExpressionOrVarDeclaration 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
+		(rule__XExpressionOrVarDeclaration__Alternatives)
+		{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXVariableDeclaration
+entryRuleXVariableDeclaration
+:
+{ before(grammarAccess.getXVariableDeclarationRule()); }
+	 ruleXVariableDeclaration
+{ after(grammarAccess.getXVariableDeclarationRule()); } 
+	 EOF 
+;
+
+// Rule XVariableDeclaration
+ruleXVariableDeclaration 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
+		(rule__XVariableDeclaration__Group__0)
+		{ after(grammarAccess.getXVariableDeclarationAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmFormalParameter
+entryRuleJvmFormalParameter
+:
+{ before(grammarAccess.getJvmFormalParameterRule()); }
+	 ruleJvmFormalParameter
+{ after(grammarAccess.getJvmFormalParameterRule()); } 
+	 EOF 
+;
+
+// Rule JvmFormalParameter
+ruleJvmFormalParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
+		(rule__JvmFormalParameter__Group__0)
+		{ after(grammarAccess.getJvmFormalParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFullJvmFormalParameter
+entryRuleFullJvmFormalParameter
+:
+{ before(grammarAccess.getFullJvmFormalParameterRule()); }
+	 ruleFullJvmFormalParameter
+{ after(grammarAccess.getFullJvmFormalParameterRule()); } 
+	 EOF 
+;
+
+// Rule FullJvmFormalParameter
+ruleFullJvmFormalParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
+		(rule__FullJvmFormalParameter__Group__0)
+		{ after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXFeatureCall
+entryRuleXFeatureCall
+:
+{ before(grammarAccess.getXFeatureCallRule()); }
+	 ruleXFeatureCall
+{ after(grammarAccess.getXFeatureCallRule()); } 
+	 EOF 
+;
+
+// Rule XFeatureCall
+ruleXFeatureCall 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getGroup()); }
+		(rule__XFeatureCall__Group__0)
+		{ after(grammarAccess.getXFeatureCallAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFeatureCallID
+entryRuleFeatureCallID
+:
+{ before(grammarAccess.getFeatureCallIDRule()); }
+	 ruleFeatureCallID
+{ after(grammarAccess.getFeatureCallIDRule()); } 
+	 EOF 
+;
+
+// Rule FeatureCallID
+ruleFeatureCallID 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
+		(rule__FeatureCallID__Alternatives)
+		{ after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIdOrSuper
+entryRuleIdOrSuper
+:
+{ before(grammarAccess.getIdOrSuperRule()); }
+	 ruleIdOrSuper
+{ after(grammarAccess.getIdOrSuperRule()); } 
+	 EOF 
+;
+
+// Rule IdOrSuper
+ruleIdOrSuper 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
+		(rule__IdOrSuper__Alternatives)
+		{ after(grammarAccess.getIdOrSuperAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXConstructorCall
+entryRuleXConstructorCall
+:
+{ before(grammarAccess.getXConstructorCallRule()); }
+	 ruleXConstructorCall
+{ after(grammarAccess.getXConstructorCallRule()); } 
+	 EOF 
+;
+
+// Rule XConstructorCall
+ruleXConstructorCall 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getGroup()); }
+		(rule__XConstructorCall__Group__0)
+		{ after(grammarAccess.getXConstructorCallAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXBooleanLiteral
+entryRuleXBooleanLiteral
+:
+{ before(grammarAccess.getXBooleanLiteralRule()); }
+	 ruleXBooleanLiteral
+{ after(grammarAccess.getXBooleanLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XBooleanLiteral
+ruleXBooleanLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
+		(rule__XBooleanLiteral__Group__0)
+		{ after(grammarAccess.getXBooleanLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXNullLiteral
+entryRuleXNullLiteral
+:
+{ before(grammarAccess.getXNullLiteralRule()); }
+	 ruleXNullLiteral
+{ after(grammarAccess.getXNullLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XNullLiteral
+ruleXNullLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXNullLiteralAccess().getGroup()); }
+		(rule__XNullLiteral__Group__0)
+		{ after(grammarAccess.getXNullLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXNumberLiteral
+entryRuleXNumberLiteral
+:
+{ before(grammarAccess.getXNumberLiteralRule()); }
+	 ruleXNumberLiteral
+{ after(grammarAccess.getXNumberLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XNumberLiteral
+ruleXNumberLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXNumberLiteralAccess().getGroup()); }
+		(rule__XNumberLiteral__Group__0)
+		{ after(grammarAccess.getXNumberLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXStringLiteral
+entryRuleXStringLiteral
+:
+{ before(grammarAccess.getXStringLiteralRule()); }
+	 ruleXStringLiteral
+{ after(grammarAccess.getXStringLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XStringLiteral
+ruleXStringLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXStringLiteralAccess().getGroup()); }
+		(rule__XStringLiteral__Group__0)
+		{ after(grammarAccess.getXStringLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXTypeLiteral
+entryRuleXTypeLiteral
+:
+{ before(grammarAccess.getXTypeLiteralRule()); }
+	 ruleXTypeLiteral
+{ after(grammarAccess.getXTypeLiteralRule()); } 
+	 EOF 
+;
+
+// Rule XTypeLiteral
+ruleXTypeLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXTypeLiteralAccess().getGroup()); }
+		(rule__XTypeLiteral__Group__0)
+		{ after(grammarAccess.getXTypeLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXThrowExpression
+entryRuleXThrowExpression
+:
+{ before(grammarAccess.getXThrowExpressionRule()); }
+	 ruleXThrowExpression
+{ after(grammarAccess.getXThrowExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XThrowExpression
+ruleXThrowExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXThrowExpressionAccess().getGroup()); }
+		(rule__XThrowExpression__Group__0)
+		{ after(grammarAccess.getXThrowExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXReturnExpression
+entryRuleXReturnExpression
+:
+{ before(grammarAccess.getXReturnExpressionRule()); }
+	 ruleXReturnExpression
+{ after(grammarAccess.getXReturnExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XReturnExpression
+ruleXReturnExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXReturnExpressionAccess().getGroup()); }
+		(rule__XReturnExpression__Group__0)
+		{ after(grammarAccess.getXReturnExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXTryCatchFinallyExpression
+entryRuleXTryCatchFinallyExpression
+:
+{ before(grammarAccess.getXTryCatchFinallyExpressionRule()); }
+	 ruleXTryCatchFinallyExpression
+{ after(grammarAccess.getXTryCatchFinallyExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XTryCatchFinallyExpression
+ruleXTryCatchFinallyExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
+		(rule__XTryCatchFinallyExpression__Group__0)
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXSynchronizedExpression
+entryRuleXSynchronizedExpression
+:
+{ before(grammarAccess.getXSynchronizedExpressionRule()); }
+	 ruleXSynchronizedExpression
+{ after(grammarAccess.getXSynchronizedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule XSynchronizedExpression
+ruleXSynchronizedExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
+		(rule__XSynchronizedExpression__Group__0)
+		{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXCatchClause
+entryRuleXCatchClause
+:
+{ before(grammarAccess.getXCatchClauseRule()); }
+	 ruleXCatchClause
+{ after(grammarAccess.getXCatchClauseRule()); } 
+	 EOF 
+;
+
+// Rule XCatchClause
+ruleXCatchClause 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXCatchClauseAccess().getGroup()); }
+		(rule__XCatchClause__Group__0)
+		{ after(grammarAccess.getXCatchClauseAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleQualifiedName
+entryRuleQualifiedName
+:
+{ before(grammarAccess.getQualifiedNameRule()); }
+	 ruleQualifiedName
+{ after(grammarAccess.getQualifiedNameRule()); } 
+	 EOF 
+;
+
+// Rule QualifiedName
+ruleQualifiedName 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getQualifiedNameAccess().getGroup()); }
+		(rule__QualifiedName__Group__0)
+		{ after(grammarAccess.getQualifiedNameAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNumber
+entryRuleNumber
+@init { 
+	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+}
+:
+{ before(grammarAccess.getNumberRule()); }
+	 ruleNumber
+{ after(grammarAccess.getNumberRule()); } 
+	 EOF 
+;
+finally {
+	myHiddenTokenState.restore();
+}
+
+// Rule Number
+ruleNumber 
+	@init {
+		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNumberAccess().getAlternatives()); }
+		(rule__Number__Alternatives)
+		{ after(grammarAccess.getNumberAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+	myHiddenTokenState.restore();
+}
+
+// Entry rule entryRuleJvmTypeReference
+entryRuleJvmTypeReference
+:
+{ before(grammarAccess.getJvmTypeReferenceRule()); }
+	 ruleJvmTypeReference
+{ after(grammarAccess.getJvmTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmTypeReference
+ruleJvmTypeReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
+		(rule__JvmTypeReference__Alternatives)
+		{ after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleArrayBrackets
+entryRuleArrayBrackets
+:
+{ before(grammarAccess.getArrayBracketsRule()); }
+	 ruleArrayBrackets
+{ after(grammarAccess.getArrayBracketsRule()); } 
+	 EOF 
+;
+
+// Rule ArrayBrackets
+ruleArrayBrackets 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getArrayBracketsAccess().getGroup()); }
+		(rule__ArrayBrackets__Group__0)
+		{ after(grammarAccess.getArrayBracketsAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXFunctionTypeRef
+entryRuleXFunctionTypeRef
+:
+{ before(grammarAccess.getXFunctionTypeRefRule()); }
+	 ruleXFunctionTypeRef
+{ after(grammarAccess.getXFunctionTypeRefRule()); } 
+	 EOF 
+;
+
+// Rule XFunctionTypeRef
+ruleXFunctionTypeRef 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
+		(rule__XFunctionTypeRef__Group__0)
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmParameterizedTypeReference
+entryRuleJvmParameterizedTypeReference
+:
+{ before(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
+	 ruleJvmParameterizedTypeReference
+{ after(grammarAccess.getJvmParameterizedTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmParameterizedTypeReference
+ruleJvmParameterizedTypeReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
+		(rule__JvmParameterizedTypeReference__Group__0)
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmArgumentTypeReference
+entryRuleJvmArgumentTypeReference
+:
+{ before(grammarAccess.getJvmArgumentTypeReferenceRule()); }
+	 ruleJvmArgumentTypeReference
+{ after(grammarAccess.getJvmArgumentTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmArgumentTypeReference
+ruleJvmArgumentTypeReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
+		(rule__JvmArgumentTypeReference__Alternatives)
+		{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmWildcardTypeReference
+entryRuleJvmWildcardTypeReference
+:
+{ before(grammarAccess.getJvmWildcardTypeReferenceRule()); }
+	 ruleJvmWildcardTypeReference
+{ after(grammarAccess.getJvmWildcardTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule JvmWildcardTypeReference
+ruleJvmWildcardTypeReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
+		(rule__JvmWildcardTypeReference__Group__0)
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmUpperBound
+entryRuleJvmUpperBound
+:
+{ before(grammarAccess.getJvmUpperBoundRule()); }
+	 ruleJvmUpperBound
+{ after(grammarAccess.getJvmUpperBoundRule()); } 
+	 EOF 
+;
+
+// Rule JvmUpperBound
+ruleJvmUpperBound 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
+		(rule__JvmUpperBound__Group__0)
+		{ after(grammarAccess.getJvmUpperBoundAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmUpperBoundAnded
+entryRuleJvmUpperBoundAnded
+:
+{ before(grammarAccess.getJvmUpperBoundAndedRule()); }
+	 ruleJvmUpperBoundAnded
+{ after(grammarAccess.getJvmUpperBoundAndedRule()); } 
+	 EOF 
+;
+
+// Rule JvmUpperBoundAnded
+ruleJvmUpperBoundAnded 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
+		(rule__JvmUpperBoundAnded__Group__0)
+		{ after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmLowerBound
+entryRuleJvmLowerBound
+:
+{ before(grammarAccess.getJvmLowerBoundRule()); }
+	 ruleJvmLowerBound
+{ after(grammarAccess.getJvmLowerBoundRule()); } 
+	 EOF 
+;
+
+// Rule JvmLowerBound
+ruleJvmLowerBound 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
+		(rule__JvmLowerBound__Group__0)
+		{ after(grammarAccess.getJvmLowerBoundAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleJvmLowerBoundAnded
+entryRuleJvmLowerBoundAnded
+:
+{ before(grammarAccess.getJvmLowerBoundAndedRule()); }
+	 ruleJvmLowerBoundAnded
+{ after(grammarAccess.getJvmLowerBoundAndedRule()); } 
+	 EOF 
+;
+
+// Rule JvmLowerBoundAnded
+ruleJvmLowerBoundAnded 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
+		(rule__JvmLowerBoundAnded__Group__0)
+		{ after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleQualifiedNameWithWildcard
+entryRuleQualifiedNameWithWildcard
+:
+{ before(grammarAccess.getQualifiedNameWithWildcardRule()); }
+	 ruleQualifiedNameWithWildcard
+{ after(grammarAccess.getQualifiedNameWithWildcardRule()); } 
+	 EOF 
+;
+
+// Rule QualifiedNameWithWildcard
+ruleQualifiedNameWithWildcard 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
+		(rule__QualifiedNameWithWildcard__Group__0)
+		{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleValidID
+entryRuleValidID
+:
+{ before(grammarAccess.getValidIDRule()); }
+	 ruleValidID
+{ after(grammarAccess.getValidIDRule()); } 
+	 EOF 
+;
+
+// Rule ValidID
+ruleValidID 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
+		RULE_ID
+		{ after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXImportSection
+entryRuleXImportSection
+:
+{ before(grammarAccess.getXImportSectionRule()); }
+	 ruleXImportSection
+{ after(grammarAccess.getXImportSectionRule()); } 
+	 EOF 
+;
+
+// Rule XImportSection
+ruleXImportSection 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		(
+			{ before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); }
+			(rule__XImportSection__ImportDeclarationsAssignment)
+			{ after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); }
+		)
+		(
+			{ before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); }
+			(rule__XImportSection__ImportDeclarationsAssignment)*
+			{ after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleQualifiedNameInStaticImport
+entryRuleQualifiedNameInStaticImport
+:
+{ before(grammarAccess.getQualifiedNameInStaticImportRule()); }
+	 ruleQualifiedNameInStaticImport
+{ after(grammarAccess.getQualifiedNameInStaticImportRule()); } 
+	 EOF 
+;
+
+// Rule QualifiedNameInStaticImport
+ruleQualifiedNameInStaticImport 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		(
+			{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
+			(rule__QualifiedNameInStaticImport__Group__0)
+			{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
+		)
+		(
+			{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
+			(rule__QualifiedNameInStaticImport__Group__0)*
+			{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule EDateStepType
+ruleEDateStepType
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEDateStepTypeAccess().getAlternatives()); }
+		(rule__EDateStepType__Alternatives)
+		{ after(grammarAccess.getEDateStepTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IEntityMockObjectAttribute__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); }
+		ruleEntityMockObjectResourceValue
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); }
+		ruleEntityMockObjectPlainValue
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); }
+		ruleEntityMockObjectArrayValue
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); }
+		ruleEntityMockObjectEmbed
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); }
+		ruleEntityMockObjectFill
+		{ after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); }
+		rulePropertyFillerDateFuture
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); }
+		rulePropertyFillerDatePast
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); }
+		rulePropertyFillerDateRange
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); }
+		rulePropertyFillerBoolean
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); }
+		rulePropertyFillerSignedDoubleRange
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); }
+		rulePropertyFillerSignedDoubleRandom
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); }
+		rulePropertyFillerSignedIntegerRange
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); }
+		rulePropertyFillerSignedIntegerRandom
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); }
+		rulePropertyFillerTextRandom
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); }
+		rulePropertyFillerTextParagraphs
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); }
+		rulePropertyFillerTextSentences
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); }
+		rulePropertyFillerTextWords
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); }
+		rulePropertyFillerUnsignedDoubleRange
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); }
+		rulePropertyFillerUnsignedDoubleRandom
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); }
+		rulePropertyFillerUnsignedIntegerRange
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); }
+		rulePropertyFillerUnsignedIntegerRandom
+		{ after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Alternatives_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); }
+		(rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); }
+		(rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Alternatives_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); }
+		(rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); }
+		(rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Alternatives_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); }
+		(rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); }
+		(rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Alternatives_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); }
+		(rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); }
+		(rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); }
+		(rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); }
+		(rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); }
+		(rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); }
+		(rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); }
+		(rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); }
+		(rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); }
+		(rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); }
+		(rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Alternatives_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getGroup_4_0()); }
+		(rule__EntityMockEntity__Group_4_0__0)
+		{ after(grammarAccess.getEntityMockEntityAccess().getGroup_4_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getGroup_4_1()); }
+		(rule__EntityMockEntity__Group_4_1__0)
+		{ after(grammarAccess.getEntityMockEntityAccess().getGroup_4_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getGroup_4_2()); }
+		(rule__EntityMockEntity__Group_4_2__0)
+		{ after(grammarAccess.getEntityMockEntityAccess().getGroup_4_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IIterate__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); }
+		ruleIntegerIterate
+		{ after(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); }
+		ruleDateIterate
+		{ after(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getYesterdayAssignment_0()); }
+		(rule__Date__YesterdayAssignment_0)
+		{ after(grammarAccess.getDateAccess().getYesterdayAssignment_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDateAccess().getTodayAssignment_1()); }
+		(rule__Date__TodayAssignment_1)
+		{ after(grammarAccess.getDateAccess().getTodayAssignment_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDateAccess().getTomorrowAssignment_2()); }
+		(rule__Date__TomorrowAssignment_2)
+		{ after(grammarAccess.getDateAccess().getTomorrowAssignment_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDateAccess().getGroup_3()); }
+		(rule__Date__Group_3__0)
+		{ after(grammarAccess.getDateAccess().getGroup_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IEntityMockAttribute__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0()); }
+		ruleEntityMockAttributeByObject
+		{ after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1()); }
+		ruleEntityMockAttributeFiller
+		{ after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2()); }
+		ruleEntityMockAttributeByReference
+		{ after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunctionParameter__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefAssignment_0()); }
+		(rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0)
+		{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefAssignment_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeAssignment_1()); }
+		(rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1)
+		{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeAssignment_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0()); }
+		(rule__EntityMockAttributeByObject__Group_0__0)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_1()); }
+		(rule__EntityMockAttributeByObject__Group_1__0)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0()); }
+		'existingEntities'
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityAssignment_3_1()); }
+		(rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1)
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityAssignment_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); }
+		(rule__XImportDeclaration__Group_2_0__0)
+		{ after(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); }
+		(rule__XImportDeclaration__ImportedTypeAssignment_2_1)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); }
+		(rule__XImportDeclaration__ImportedNamespaceAssignment_2_2)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); }
+		(rule__XImportDeclaration__Group_2_3__0)
+		{ after(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Alternatives_2_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); }
+		(rule__XImportDeclaration__WildcardAssignment_2_0_3_0)
+		{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); }
+		(rule__XImportDeclaration__MemberNameAssignment_2_0_3_1)
+		{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Alternatives_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
+		(rule__XAnnotation__Group_3_1_0__0)
+		{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
+		(rule__XAnnotation__ValueAssignment_3_1_1)
+		{ after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
+		(rule__XAnnotationElementValueOrCommaList__Group_0__0)
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
+		(rule__XAnnotationElementValueOrCommaList__Group_1__0)
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
+		(rule__XAnnotationElementValue__Group_0__0)
+		{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationOrExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
+		ruleXAnnotation
+		{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
+		ruleXExpression
+		{ after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getGroup_0()); }
+		(rule__XAssignment__Group_0__0)
+		{ after(grammarAccess.getXAssignmentAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getGroup_1()); }
+		(rule__XAssignment__Group_1__0)
+		{ after(grammarAccess.getXAssignmentAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
+		'+='
+		{ after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
+		'-='
+		{ after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
+		'*='
+		{ after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
+		'/='
+		{ after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
+		'%='
+		{ after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
+		(rule__OpMultiAssign__Group_5__0)
+		{ after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
+		(rule__OpMultiAssign__Group_6__0)
+		{ after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpEquality__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
+		'=='
+		{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
+		'!='
+		{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+		'==='
+		{ after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
+		'!=='
+		{ after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
+		(rule__XRelationalExpression__Group_1_0__0)
+		{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
+		(rule__XRelationalExpression__Group_1_1__0)
+		{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpCompare__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
+		'>='
+		{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpCompareAccess().getGroup_1()); }
+		(rule__OpCompare__Group_1__0)
+		{ after(grammarAccess.getOpCompareAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
+		'>'
+		{ after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
+		'<'
+		{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
+		'->'
+		{ after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
+		'..<'
+		{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGroup_2()); }
+		(rule__OpOther__Group_2__0)
+		{ after(grammarAccess.getOpOtherAccess().getGroup_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
+		'..'
+		{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
+		'=>'
+		{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGroup_5()); }
+		(rule__OpOther__Group_5__0)
+		{ after(grammarAccess.getOpOtherAccess().getGroup_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGroup_6()); }
+		(rule__OpOther__Group_6__0)
+		{ after(grammarAccess.getOpOtherAccess().getGroup_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
+		'<>'
+		{ after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
+		'?:'
+		{ after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
+		(rule__OpOther__Group_5_1_0__0)
+		{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
+		'>'
+		{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Alternatives_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
+		(rule__OpOther__Group_6_1_0__0)
+		{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
+		'<'
+		{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
+		'=>'
+		{ after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpAdd__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
+		'+'
+		{ after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
+		'-'
+		{ after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMulti__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
+		'*'
+		{ after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
+		'**'
+		{ after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
+		'/'
+		{ after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
+		'%'
+		{ after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
+		(rule__XUnaryOperation__Group_0__0)
+		{ after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
+		ruleXCastedExpression
+		{ after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpUnary__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
+		'!'
+		{ after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
+		'-'
+		{ after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
+		'+'
+		{ after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpPostfix__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
+		'++'
+		{ after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+		'--'
+		{ after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
+		(rule__XMemberFeatureCall__Group_1_0__0)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
+		(rule__XMemberFeatureCall__Group_1_1__0)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
+		'.'
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
+		(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
+		'.'
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
+		(rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
+		(rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Alternatives_1_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
+		(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
+		(rule__XMemberFeatureCall__Group_1_1_3_1_1__0)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPrimaryExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
+		ruleXConstructorCall
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
+		ruleXBlockExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
+		ruleXSwitchExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
+		(ruleXSynchronizedExpression)
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
+		ruleXFeatureCall
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
+		ruleXLiteral
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
+		ruleXIfExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
+		(ruleXForLoopExpression)
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
+		ruleXBasicForLoopExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
+		ruleXWhileExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
+		ruleXDoWhileExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
+		ruleXThrowExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
+		ruleXReturnExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
+		ruleXTryCatchFinallyExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
+		ruleXParenthesizedExpression
+		{ after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XLiteral__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
+		ruleXCollectionLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
+		(ruleXClosure)
+		{ after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
+		ruleXBooleanLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
+		ruleXNumberLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
+		ruleXNullLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
+		ruleXStringLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
+		ruleXTypeLiteral
+		{ after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCollectionLiteral__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
+		ruleXSetLiteral
+		{ after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
+		ruleXListLiteral
+		{ after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
+		(rule__XSwitchExpression__Group_2_0__0)
+		{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
+		(rule__XSwitchExpression__Group_2_1__0)
+		{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
+		(rule__XCasePart__Group_3_0__0)
+		{ after(grammarAccess.getXCasePartAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
+		(rule__XCasePart__FallThroughAssignment_3_1)
+		{ after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionOrVarDeclaration__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
+		ruleXVariableDeclaration
+		{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
+		ruleXExpression
+		{ after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
+		(rule__XVariableDeclaration__WriteableAssignment_1_0)
+		{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
+		'val'
+		{ after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
+		(rule__XVariableDeclaration__Group_2_0__0)
+		{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
+		(rule__XVariableDeclaration__NameAssignment_2_1)
+		{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Alternatives_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
+		(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0)
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
+		(rule__XFeatureCall__Group_3_1_1__0)
+		{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FeatureCallID__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
+		ruleValidID
+		{ after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
+		'extends'
+		{ after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
+		'static'
+		{ after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
+		'import'
+		{ after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
+		'extension'
+		{ after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IdOrSuper__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
+		ruleFeatureCallID
+		{ after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
+		'super'
+		{ after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Alternatives_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
+		(rule__XConstructorCall__ArgumentsAssignment_4_1_0)
+		{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
+		(rule__XConstructorCall__Group_4_1_1__0)
+		{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
+		'false'
+		{ after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
+		(rule__XBooleanLiteral__IsTrueAssignment_1_1)
+		{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
+		(rule__XTryCatchFinallyExpression__Group_3_0__0)
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
+		(rule__XTryCatchFinallyExpression__Group_3_1__0)
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
+		RULE_HEX
+		{ after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNumberAccess().getGroup_1()); }
+		(rule__Number__Group_1__0)
+		{ after(grammarAccess.getNumberAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
+		RULE_INT
+		{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
+		RULE_DECIMAL
+		{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Alternatives_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
+		RULE_DECIMAL
+		{ after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
+		(rule__JvmTypeReference__Group_0__0)
+		{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
+		ruleXFunctionTypeRef
+		{ after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmArgumentTypeReference__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
+		ruleJvmWildcardTypeReference
+		{ after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
+		(rule__JvmWildcardTypeReference__Group_2_0__0)
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
+		(rule__JvmWildcardTypeReference__Group_2_1__0)
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDateStepType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0()); }
+		('days')
+		{ after(grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1()); }
+		('weeks')
+		{ after(grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2()); }
+		('months')
+		{ after(grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3()); }
+		('years')
+		{ after(grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockModel__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockModel__Group__0__Impl
+	rule__EntityMockModel__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockModel__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockModelAccess().getImportSectionAssignment_0()); }
+	(rule__EntityMockModel__ImportSectionAssignment_0)?
+	{ after(grammarAccess.getEntityMockModelAccess().getImportSectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockModel__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockModel__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockModel__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockModelAccess().getPackagesAssignment_1()); }
+	(rule__EntityMockModel__PackagesAssignment_1)*
+	{ after(grammarAccess.getEntityMockModelAccess().getPackagesAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockPackage__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group__0__Impl
+	rule__EntityMockPackage__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group__1__Impl
+	rule__EntityMockPackage__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1()); }
+	'package'
+	{ after(grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group__2__Impl
+	rule__EntityMockPackage__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getNameAssignment_2()); }
+	(rule__EntityMockPackage__NameAssignment_2)
+	{ after(grammarAccess.getEntityMockPackageAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getGroup_3()); }
+	(rule__EntityMockPackage__Group_3__0)?
+	{ after(grammarAccess.getEntityMockPackageAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockPackage__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group_3__0__Impl
+	rule__EntityMockPackage__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0()); }
+	'{'
+	{ after(grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group_3__1__Impl
+	rule__EntityMockPackage__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getMocksAssignment_3_1()); }
+	(rule__EntityMockPackage__MocksAssignment_3_1)*
+	{ after(grammarAccess.getEntityMockPackageAccess().getMocksAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockPackage__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2()); }
+	'}'
+	{ after(grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMock__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group__0__Impl
+	rule__EntityMock__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getEntityMockAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockAccess().getEntityMockAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group__1__Impl
+	rule__EntityMock__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getMockKeyword_1()); }
+	'mock'
+	{ after(grammarAccess.getEntityMockAccess().getMockKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group__2__Impl
+	rule__EntityMock__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getNameAssignment_2()); }
+	(rule__EntityMock__NameAssignment_2)
+	{ after(grammarAccess.getEntityMockAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group__3__Impl
+	rule__EntityMock__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getGroup_3()); }
+	(rule__EntityMock__Group_3__0)?
+	{ after(grammarAccess.getEntityMockAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getGroup_4()); }
+	(rule__EntityMock__Group_4__0)?
+	{ after(grammarAccess.getEntityMockAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMock__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_3__0__Impl
+	rule__EntityMock__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getDescriptionAssignment_3_0()); }
+	(rule__EntityMock__DescriptionAssignment_3_0)
+	{ after(grammarAccess.getEntityMockAccess().getDescriptionAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getDescriptionValueAssignment_3_1()); }
+	(rule__EntityMock__DescriptionValueAssignment_3_1)
+	{ after(grammarAccess.getEntityMockAccess().getDescriptionValueAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMock__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_4__0__Impl
+	rule__EntityMock__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0()); }
+	'{'
+	{ after(grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_4__1__Impl
+	rule__EntityMock__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()); }
+	(rule__EntityMock__UnorderedGroup_4_1)
+	{ after(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_4__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2()); }
+	'}'
+	{ after(grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMock__Group_4_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_4_1_0__0__Impl
+	rule__EntityMock__Group_4_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0()); }
+	'priority'
+	{ after(grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__Group_4_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__Group_4_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAccess().getRunPriorityAssignment_4_1_0_1()); }
+	(rule__EntityMock__RunPriorityAssignment_4_1_0_1)
+	{ after(grammarAccess.getEntityMockAccess().getRunPriorityAssignment_4_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RunningDataInterchanges__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchanges__Group__0__Impl
+	rule__RunningDataInterchanges__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0()); }
+	()
+	{ after(grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchanges__Group__1__Impl
+	rule__RunningDataInterchanges__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1()); }
+	'datainterchanges'
+	{ after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchanges__Group__2__Impl
+	rule__RunningDataInterchanges__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchanges__Group__3__Impl
+	rule__RunningDataInterchanges__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesAssignment_3()); }
+	(rule__RunningDataInterchanges__DatainterchangesAssignment_3)*
+	{ after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchanges__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RunningDataInterchange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchange__Group__0__Impl
+	rule__RunningDataInterchange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0()); }
+	()
+	{ after(grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchange__Group__1__Impl
+	rule__RunningDataInterchange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1()); }
+	'datainterchange'
+	{ after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchange__Group__2__Impl
+	rule__RunningDataInterchange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefAssignment_2()); }
+	(rule__RunningDataInterchange__DatainterchangeRefAssignment_2)
+	{ after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchange__Group__3__Impl
+	rule__RunningDataInterchange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3()); }
+	'file'
+	{ after(grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RunningDataInterchange__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRunningDataInterchangeAccess().getFileURLAssignment_4()); }
+	(rule__RunningDataInterchange__FileURLAssignment_4)
+	{ after(grammarAccess.getRunningDataInterchangeAccess().getFileURLAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResources__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResources__Group__0__Impl
+	rule__EntityMockResources__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResources__Group__1__Impl
+	rule__EntityMockResources__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1()); }
+	'resources'
+	{ after(grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResources__Group__2__Impl
+	rule__EntityMockResources__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResources__Group__3__Impl
+	rule__EntityMockResources__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourcesAccess().getResourcesAssignment_3()); }
+	(rule__EntityMockResources__ResourcesAssignment_3)*
+	{ after(grammarAccess.getEntityMockResourcesAccess().getResourcesAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResources__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResource__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__0__Impl
+	rule__EntityMockResource__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0()); }
+	'resource'
+	{ after(grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__1__Impl
+	rule__EntityMockResource__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getNameAssignment_1()); }
+	(rule__EntityMockResource__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockResourceAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__2__Impl
+	rule__EntityMockResource__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__3__Impl
+	rule__EntityMockResource__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getGroup_3()); }
+	(rule__EntityMockResource__Group_3__0)?
+	{ after(grammarAccess.getEntityMockResourceAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__4__Impl
+	rule__EntityMockResource__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4()); }
+	'items'
+	{ after(grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__5__Impl
+	rule__EntityMockResource__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5()); }
+	'{'
+	{ after(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__6__Impl
+	rule__EntityMockResource__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getDatarowsAssignment_6()); }
+	(rule__EntityMockResource__DatarowsAssignment_6)*
+	{ after(grammarAccess.getEntityMockResourceAccess().getDatarowsAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__7__Impl
+	rule__EntityMockResource__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7()); }
+	'}'
+	{ after(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8()); }
+	'}'
+	{ after(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResource__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3__0__Impl
+	rule__EntityMockResource__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0()); }
+	'attributes'
+	{ after(grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3__1__Impl
+	rule__EntityMockResource__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1()); }
+	'('
+	{ after(grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3__2__Impl
+	rule__EntityMockResource__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getGroup_3_2()); }
+	(rule__EntityMockResource__Group_3_2__0)*
+	{ after(grammarAccess.getEntityMockResourceAccess().getGroup_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3()); }
+	')'
+	{ after(grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResource__Group_3_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3_2__0__Impl
+	rule__EntityMockResource__Group_3_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getAttributesAssignment_3_2_0()); }
+	(rule__EntityMockResource__AttributesAssignment_3_2_0)
+	{ after(grammarAccess.getEntityMockResourceAccess().getAttributesAssignment_3_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResource__Group_3_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__Group_3_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1()); }
+	(',')?
+	{ after(grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResourceAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceAttribute__Group__0__Impl
+	rule__EntityMockResourceAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceAttribute__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceAttributeAccess().getNameAssignment_1()); }
+	(rule__EntityMockResourceAttribute__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockResourceAttributeAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResourceDataRow__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group__0__Impl
+	rule__EntityMockResourceDataRow__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group__1__Impl
+	rule__EntityMockResourceDataRow__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getNameAssignment_1()); }
+	(rule__EntityMockResourceDataRow__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2()); }
+	(rule__EntityMockResourceDataRow__Group_2__0)?
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResourceDataRow__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group_2__0__Impl
+	rule__EntityMockResourceDataRow__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0()); }
+	'('
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group_2__1__Impl
+	rule__EntityMockResourceDataRow__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2_1()); }
+	(rule__EntityMockResourceDataRow__Group_2_1__0)*
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2()); }
+	')'
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockResourceDataRow__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group_2_1__0__Impl
+	rule__EntityMockResourceDataRow__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getValuesAssignment_2_1_0()); }
+	(rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0)
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getValuesAssignment_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockResourceDataRow__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1()); }
+	(',')?
+	{ after(grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjects__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjects__Group__0__Impl
+	rule__EntityMockObjects__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjects__Group__1__Impl
+	rule__EntityMockObjects__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1()); }
+	'objects'
+	{ after(grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjects__Group__2__Impl
+	rule__EntityMockObjects__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjects__Group__3__Impl
+	rule__EntityMockObjects__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectsAccess().getObjectsAssignment_3()); }
+	(rule__EntityMockObjects__ObjectsAssignment_3)*
+	{ after(grammarAccess.getEntityMockObjectsAccess().getObjectsAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjects__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObject__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__0__Impl
+	rule__EntityMockObject__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0()); }
+	'object'
+	{ after(grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__1__Impl
+	rule__EntityMockObject__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getNameAssignment_1()); }
+	(rule__EntityMockObject__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__2__Impl
+	rule__EntityMockObject__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__3__Impl
+	rule__EntityMockObject__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getEnumerationsAssignment_3()); }
+	(rule__EntityMockObject__EnumerationsAssignment_3)*
+	{ after(grammarAccess.getEntityMockObjectAccess().getEnumerationsAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__4__Impl
+	rule__EntityMockObject__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getAttributesAssignment_4()); }
+	(rule__EntityMockObject__AttributesAssignment_4)*
+	{ after(grammarAccess.getEntityMockObjectAccess().getAttributesAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__5__Impl
+	rule__EntityMockObject__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getCalculationsAssignment_5()); }
+	(rule__EntityMockObject__CalculationsAssignment_5)*
+	{ after(grammarAccess.getEntityMockObjectAccess().getCalculationsAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObject__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectEnum__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEnum__Group__0__Impl
+	rule__EntityMockObjectEnum__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEnum__Group__1__Impl
+	rule__EntityMockObjectEnum__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEnumAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectEnum__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectEnumAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEnum__Group__2__Impl
+	rule__EntityMockObjectEnum__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2()); }
+	'byEnum'
+	{ after(grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEnum__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceAssignment_3()); }
+	(rule__EntityMockObjectEnum__UsingResourceAssignment_3)
+	{ after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectPlainValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group__0__Impl
+	rule__EntityMockObjectPlainValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group__1__Impl
+	rule__EntityMockObjectPlainValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectPlainValue__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group__2__Impl
+	rule__EntityMockObjectPlainValue__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group__3__Impl
+	rule__EntityMockObjectPlainValue__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup_3()); }
+	(rule__EntityMockObjectPlainValue__Group_3__0)*
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4()); }
+	')'
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectPlainValue__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group_3__0__Impl
+	rule__EntityMockObjectPlainValue__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesAssignment_3_0()); }
+	(rule__EntityMockObjectPlainValue__ValuesAssignment_3_0)
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectPlainValue__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1()); }
+	(',')?
+	{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectResourceValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group__0__Impl
+	rule__EntityMockObjectResourceValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group__1__Impl
+	rule__EntityMockObjectResourceValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectResourceValue__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group__2__Impl
+	rule__EntityMockObjectResourceValue__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2()); }
+	'with'
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group__3__Impl
+	rule__EntityMockObjectResourceValue__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumAssignment_3()); }
+	(rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3)
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup_4()); }
+	(rule__EntityMockObjectResourceValue__Group_4__0)?
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectResourceValue__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group_4__0__Impl
+	rule__EntityMockObjectResourceValue__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0()); }
+	'.'
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectResourceValue__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeAssignment_4_1()); }
+	(rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1)
+	{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectArrayValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__0__Impl
+	rule__EntityMockObjectArrayValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__1__Impl
+	rule__EntityMockObjectArrayValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectArrayValue__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__2__Impl
+	rule__EntityMockObjectArrayValue__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2()); }
+	'switchOn'
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__3__Impl
+	rule__EntityMockObjectArrayValue__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationAssignment_3()); }
+	(rule__EntityMockObjectArrayValue__EnumerationAssignment_3)
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__4__Impl
+	rule__EntityMockObjectArrayValue__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__5__Impl
+	rule__EntityMockObjectArrayValue__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsAssignment_5()); }
+	(rule__EntityMockObjectArrayValue__ItemsAssignment_5)*
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectArrayValue__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectItemValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group__0__Impl
+	rule__EntityMockObjectItemValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0()); }
+	'when'
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group__1__Impl
+	rule__EntityMockObjectItemValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowAssignment_1()); }
+	(rule__EntityMockObjectItemValue__DatarowAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group__2__Impl
+	rule__EntityMockObjectItemValue__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group__3__Impl
+	rule__EntityMockObjectItemValue__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getGroup_3()); }
+	(rule__EntityMockObjectItemValue__Group_3__0)*
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4()); }
+	')'
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectItemValue__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group_3__0__Impl
+	rule__EntityMockObjectItemValue__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getValuesAssignment_3_0()); }
+	(rule__EntityMockObjectItemValue__ValuesAssignment_3_0)
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getValuesAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectItemValue__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1()); }
+	(',')?
+	{ after(grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectEmbed__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEmbed__Group__0__Impl
+	rule__EntityMockObjectEmbed__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEmbed__Group__1__Impl
+	rule__EntityMockObjectEmbed__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1()); }
+	'embed'
+	{ after(grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEmbed__Group__2__Impl
+	rule__EntityMockObjectEmbed__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEmbedAccess().getNameAssignment_2()); }
+	(rule__EntityMockObjectEmbed__NameAssignment_2)
+	{ after(grammarAccess.getEntityMockObjectEmbedAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEmbed__Group__3__Impl
+	rule__EntityMockObjectEmbed__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3()); }
+	'definedAs'
+	{ after(grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectEmbed__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectAssignment_4()); }
+	(rule__EntityMockObjectEmbed__ObjectAssignment_4)
+	{ after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectFunction__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__0__Impl
+	rule__EntityMockObjectFunction__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__1__Impl
+	rule__EntityMockObjectFunction__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectFunction__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__2__Impl
+	rule__EntityMockObjectFunction__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2()); }
+	'calculateAs'
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__3__Impl
+	rule__EntityMockObjectFunction__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeAssignment_3()); }
+	(rule__EntityMockObjectFunction__OftypeAssignment_3)
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__4__Impl
+	rule__EntityMockObjectFunction__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4()); }
+	'basedOn'
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__5__Impl
+	rule__EntityMockObjectFunction__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5()); }
+	'('
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__6__Impl
+	rule__EntityMockObjectFunction__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6()); }
+	(rule__EntityMockObjectFunction__Group_6__0)?
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__7__Impl
+	rule__EntityMockObjectFunction__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7()); }
+	')'
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getBodyAssignment_8()); }
+	(rule__EntityMockObjectFunction__BodyAssignment_8)
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getBodyAssignment_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectFunction__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group_6__0__Impl
+	rule__EntityMockObjectFunction__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_0()); }
+	(rule__EntityMockObjectFunction__ParamsAssignment_6_0)
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6_1()); }
+	(rule__EntityMockObjectFunction__Group_6_1__0)*
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectFunction__Group_6_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group_6_1__0__Impl
+	rule__EntityMockObjectFunction__Group_6_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0()); }
+	','
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunction__Group_6_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__Group_6_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_1_1()); }
+	(rule__EntityMockObjectFunction__ParamsAssignment_6_1_1)
+	{ after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectFunctionParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunctionParameter__Group__0__Impl
+	rule__EntityMockObjectFunctionParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunctionParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeAssignment_0()); }
+	(rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0)
+	{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunctionParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFunctionParameter__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunctionParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectFunctionParameter__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockObjectFill__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFill__Group__0__Impl
+	rule__EntityMockObjectFill__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFill__Group__1__Impl
+	rule__EntityMockObjectFill__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFillAccess().getNameAssignment_1()); }
+	(rule__EntityMockObjectFill__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockObjectFillAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFill__Group__2__Impl
+	rule__EntityMockObjectFill__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2()); }
+	'randomize'
+	{ after(grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockObjectFill__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockObjectFillAccess().getFillerTypeAssignment_3()); }
+	(rule__EntityMockObjectFill__FillerTypeAssignment_3)
+	{ after(grammarAccess.getEntityMockObjectFillAccess().getFillerTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerDateFuture__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateFuture__Group__0__Impl
+	rule__PropertyFillerDateFuture__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0()); }
+	'future'
+	{ after(grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateFuture__Group__1__Impl
+	rule__PropertyFillerDateFuture__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsAssignment_1()); }
+	(rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1)
+	{ after(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateFuture__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2()); }
+	'years'
+	{ after(grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerDatePast__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDatePast__Group__0__Impl
+	rule__PropertyFillerDatePast__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0()); }
+	'past'
+	{ after(grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDatePast__Group__1__Impl
+	rule__PropertyFillerDatePast__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsAssignment_1()); }
+	(rule__PropertyFillerDatePast__DatePastYearsAssignment_1)
+	{ after(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDatePast__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2()); }
+	'years'
+	{ after(grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerBoolean__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerBoolean__Group__0__Impl
+	rule__PropertyFillerBoolean__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerBoolean__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerBoolean__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerBoolean__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerBoolean__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1()); }
+	'boolean'
+	{ after(grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerDateRange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__0__Impl
+	rule__PropertyFillerDateRange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0()); }
+	'dateRange'
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__1__Impl
+	rule__PropertyFillerDateRange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1()); }
+	'from'
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__2__Impl
+	rule__PropertyFillerDateRange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsAssignment_2()); }
+	(rule__PropertyFillerDateRange__DateBeginYearsAssignment_2)
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__3__Impl
+	rule__PropertyFillerDateRange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3()); }
+	'until'
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__4__Impl
+	rule__PropertyFillerDateRange__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsAssignment_4()); }
+	(rule__PropertyFillerDateRange__DateEndYearsAssignment_4)
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerDateRange__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5()); }
+	'years'
+	{ after(grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedDoubleRange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__0__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0()); }
+	'numberRange'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__1__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1()); }
+	'from'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__2__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_2()); }
+	(rule__PropertyFillerSignedDoubleRange__Group_2__0)?
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__3__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3()); }
+	'with'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__4__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsAssignment_4()); }
+	(rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4)
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__5__Impl
+	rule__PropertyFillerSignedDoubleRange__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5()); }
+	'decimals'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_6()); }
+	(rule__PropertyFillerSignedDoubleRange__Group_6__0)?
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedDoubleRange__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl
+	rule__PropertyFillerSignedDoubleRange__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_0()); }
+	(rule__PropertyFillerSignedDoubleRange__Alternatives_2_0)?
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl
+	rule__PropertyFillerSignedDoubleRange__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1()); }
+	'until'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_2()); }
+	(rule__PropertyFillerSignedDoubleRange__Alternatives_2_2)
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedDoubleRange__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl
+	rule__PropertyFillerSignedDoubleRange__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0()); }
+	'roundTo'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedAssignment_6_1()); }
+	(rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1)
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedDoubleRandom__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRandom__Group__0__Impl
+	rule__PropertyFillerSignedDoubleRandom__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0()); }
+	'numberPick'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRandom__Group__1__Impl
+	rule__PropertyFillerSignedDoubleRandom__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRandom__Group__2__Impl
+	rule__PropertyFillerSignedDoubleRandom__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); }
+	)
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2)*
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedDoubleRandom__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedIntegerRange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group__0__Impl
+	rule__PropertyFillerSignedIntegerRange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group__1__Impl
+	rule__PropertyFillerSignedIntegerRange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1()); }
+	'integerRange'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group__2__Impl
+	rule__PropertyFillerSignedIntegerRange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2()); }
+	'from'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group__3__Impl
+	rule__PropertyFillerSignedIntegerRange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_3()); }
+	(rule__PropertyFillerSignedIntegerRange__Group_3__0)?
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_4()); }
+	(rule__PropertyFillerSignedIntegerRange__Group_4__0)?
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedIntegerRange__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl
+	rule__PropertyFillerSignedIntegerRange__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_0()); }
+	(rule__PropertyFillerSignedIntegerRange__Alternatives_3_0)?
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl
+	rule__PropertyFillerSignedIntegerRange__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1()); }
+	'until'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_2()); }
+	(rule__PropertyFillerSignedIntegerRange__Alternatives_3_2)
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedIntegerRange__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl
+	rule__PropertyFillerSignedIntegerRange__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0()); }
+	'roundTo'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedAssignment_4_1()); }
+	(rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1)
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerSignedIntegerRandom__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRandom__Group__0__Impl
+	rule__PropertyFillerSignedIntegerRandom__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0()); }
+	'integerPick'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRandom__Group__1__Impl
+	rule__PropertyFillerSignedIntegerRandom__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRandom__Group__2__Impl
+	rule__PropertyFillerSignedIntegerRandom__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); }
+	)
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2)*
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerSignedIntegerRandom__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerTextRandom__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextRandom__Group__0__Impl
+	rule__PropertyFillerTextRandom__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0()); }
+	'textPick'
+	{ after(grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextRandom__Group__1__Impl
+	rule__PropertyFillerTextRandom__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextRandom__Group__2__Impl
+	rule__PropertyFillerTextRandom__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerTextRandom__ItemsAssignment_2)
+		{ after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); }
+	)
+	(
+		{ before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerTextRandom__ItemsAssignment_2)*
+		{ after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextRandom__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerTextParagraphs__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextParagraphs__Group__0__Impl
+	rule__PropertyFillerTextParagraphs__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextParagraphs__Group__1__Impl
+	rule__PropertyFillerTextParagraphs__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1()); }
+	'paragraphs'
+	{ after(grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextParagraphs__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountAssignment_2()); }
+	(rule__PropertyFillerTextParagraphs__CountAssignment_2)?
+	{ after(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerTextSentences__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextSentences__Group__0__Impl
+	rule__PropertyFillerTextSentences__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextSentences__Group__1__Impl
+	rule__PropertyFillerTextSentences__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1()); }
+	'sentences'
+	{ after(grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextSentences__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextSentencesAccess().getCountAssignment_2()); }
+	(rule__PropertyFillerTextSentences__CountAssignment_2)?
+	{ after(grammarAccess.getPropertyFillerTextSentencesAccess().getCountAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerTextWords__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextWords__Group__0__Impl
+	rule__PropertyFillerTextWords__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextWords__Group__1__Impl
+	rule__PropertyFillerTextWords__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1()); }
+	'words'
+	{ after(grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerTextWords__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerTextWordsAccess().getCountAssignment_2()); }
+	(rule__PropertyFillerTextWords__CountAssignment_2)?
+	{ after(grammarAccess.getPropertyFillerTextWordsAccess().getCountAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedDoubleRange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0()); }
+	'unsignedNumberRange'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1()); }
+	'from'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_2()); }
+	(rule__PropertyFillerUnsignedDoubleRange__Group_2__0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3()); }
+	'with'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsAssignment_4()); }
+	(rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4)
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5()); }
+	'decimals'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_6()); }
+	(rule__PropertyFillerUnsignedDoubleRange__Group_6__0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_0()); }
+	(rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1()); }
+	'until'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_2()); }
+	(rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2)
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedDoubleRange__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl
+	rule__PropertyFillerUnsignedDoubleRange__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0()); }
+	'roundTo'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedAssignment_6_1()); }
+	(rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1)
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl
+	rule__PropertyFillerUnsignedDoubleRandom__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0()); }
+	'unsignedNumberPick'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl
+	rule__PropertyFillerUnsignedDoubleRandom__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl
+	rule__PropertyFillerUnsignedDoubleRandom__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); }
+	)
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2)*
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedIntegerRange__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1()); }
+	'unsignedIntegerRange'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2()); }
+	'from'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_3()); }
+	(rule__PropertyFillerUnsignedIntegerRange__Group_3__0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_4()); }
+	(rule__PropertyFillerUnsignedIntegerRange__Group_4__0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_0()); }
+	(rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0)?
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1()); }
+	'until'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_2()); }
+	(rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2)
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedIntegerRange__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl
+	rule__PropertyFillerUnsignedIntegerRange__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0()); }
+	'roundTo'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedAssignment_4_1()); }
+	(rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1)
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl
+	rule__PropertyFillerUnsignedIntegerRandom__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0()); }
+	'unsignedIntegerPick'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl
+	rule__PropertyFillerUnsignedIntegerRandom__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl
+	rule__PropertyFillerUnsignedIntegerRandom__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); }
+	)
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); }
+		(rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2)*
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntities__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntities__Group__0__Impl
+	rule__EntityMockEntities__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntities__Group__1__Impl
+	rule__EntityMockEntities__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1()); }
+	'entities'
+	{ after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntities__Group__2__Impl
+	rule__EntityMockEntities__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntities__Group__3__Impl
+	rule__EntityMockEntities__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesAssignment_3()); }
+	(rule__EntityMockEntities__EntitiesAssignment_3)*
+	{ after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntities__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntity__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group__0__Impl
+	rule__EntityMockEntity__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0()); }
+	'mocking'
+	{ after(grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group__1__Impl
+	rule__EntityMockEntity__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getNameAssignment_1()); }
+	(rule__EntityMockEntity__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockEntityAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group__2__Impl
+	rule__EntityMockEntity__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2()); }
+	'entity'
+	{ after(grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group__3__Impl
+	rule__EntityMockEntity__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getEntityRefAssignment_3()); }
+	(rule__EntityMockEntity__EntityRefAssignment_3)
+	{ after(grammarAccess.getEntityMockEntityAccess().getEntityRefAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getAlternatives_4()); }
+	(rule__EntityMockEntity__Alternatives_4)
+	{ after(grammarAccess.getEntityMockEntityAccess().getAlternatives_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntity__Group_4_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__0__Impl
+	rule__EntityMockEntity__Group_4_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0()); }
+	'rows'
+	{ after(grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__1__Impl
+	rule__EntityMockEntity__Group_4_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getMinRowsAssignment_4_0_1()); }
+	(rule__EntityMockEntity__MinRowsAssignment_4_0_1)
+	{ after(grammarAccess.getEntityMockEntityAccess().getMinRowsAssignment_4_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__2__Impl
+	rule__EntityMockEntity__Group_4_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2()); }
+	'to'
+	{ after(grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__3__Impl
+	rule__EntityMockEntity__Group_4_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getMaxRowsAssignment_4_0_3()); }
+	(rule__EntityMockEntity__MaxRowsAssignment_4_0_3)
+	{ after(grammarAccess.getEntityMockEntityAccess().getMaxRowsAssignment_4_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__4__Impl
+	rule__EntityMockEntity__Group_4_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4()); }
+	'{'
+	{ after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__5__Impl
+	rule__EntityMockEntity__Group_4_0__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_0_5()); }
+	(rule__EntityMockEntity__TemplatesAssignment_4_0_5)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__6__Impl
+	rule__EntityMockEntity__Group_4_0__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_0_6()); }
+	(rule__EntityMockEntity__AttributesAssignment_4_0_6)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_0_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__7__Impl
+	rule__EntityMockEntity__Group_4_0__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_0_7()); }
+	(rule__EntityMockEntity__CalculationsAssignment_4_0_7)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_0_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_0__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_0__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8()); }
+	'}'
+	{ after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntity__Group_4_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_1__0__Impl
+	rule__EntityMockEntity__Group_4_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0()); }
+	'resource'
+	{ after(grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_1__1__Impl
+	rule__EntityMockEntity__Group_4_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getByResourceAssignment_4_1_1()); }
+	(rule__EntityMockEntity__ByResourceAssignment_4_1_1)
+	{ after(grammarAccess.getEntityMockEntityAccess().getByResourceAssignment_4_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_1__2__Impl
+	rule__EntityMockEntity__Group_4_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2()); }
+	'{'
+	{ after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_1__3__Impl
+	rule__EntityMockEntity__Group_4_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3()); }
+	(rule__EntityMockEntity__UnorderedGroup_4_1_3)
+	{ after(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4()); }
+	'}'
+	{ after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntity__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__0__Impl
+	rule__EntityMockEntity__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0()); }
+	'iterate'
+	{ after(grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__1__Impl
+	rule__EntityMockEntity__Group_4_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getIteratorAssignment_4_2_1()); }
+	(rule__EntityMockEntity__IteratorAssignment_4_2_1)
+	{ after(grammarAccess.getEntityMockEntityAccess().getIteratorAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__2__Impl
+	rule__EntityMockEntity__Group_4_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2()); }
+	'with'
+	{ after(grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__3__Impl
+	rule__EntityMockEntity__Group_4_2__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getIterateAssignment_4_2_3()); }
+	(rule__EntityMockEntity__IterateAssignment_4_2_3)
+	{ after(grammarAccess.getEntityMockEntityAccess().getIterateAssignment_4_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__4__Impl
+	rule__EntityMockEntity__Group_4_2__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4()); }
+	'{'
+	{ after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__5__Impl
+	rule__EntityMockEntity__Group_4_2__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_2_5()); }
+	(rule__EntityMockEntity__TemplatesAssignment_4_2_5)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_2_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__6__Impl
+	rule__EntityMockEntity__Group_4_2__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_2_6()); }
+	(rule__EntityMockEntity__AttributesAssignment_4_2_6)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_2_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__7__Impl
+	rule__EntityMockEntity__Group_4_2__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_2_7()); }
+	(rule__EntityMockEntity__CalculationsAssignment_4_2_7)*
+	{ after(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_2_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__Group_4_2__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__Group_4_2__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8()); }
+	'}'
+	{ after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IntegerIterate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__0__Impl
+	rule__IntegerIterate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0()); }
+	'integerFrom'
+	{ after(grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__1__Impl
+	rule__IntegerIterate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getFromAssignment_1()); }
+	(rule__IntegerIterate__FromAssignment_1)
+	{ after(grammarAccess.getIntegerIterateAccess().getFromAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__2__Impl
+	rule__IntegerIterate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getUntilKeyword_2()); }
+	'until'
+	{ after(grammarAccess.getIntegerIterateAccess().getUntilKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__3__Impl
+	rule__IntegerIterate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getUntilAssignment_3()); }
+	(rule__IntegerIterate__UntilAssignment_3)
+	{ after(grammarAccess.getIntegerIterateAccess().getUntilAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__4__Impl
+	rule__IntegerIterate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getStepKeyword_4()); }
+	'step'
+	{ after(grammarAccess.getIntegerIterateAccess().getStepKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntegerIterate__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntegerIterateAccess().getStepAssignment_5()); }
+	(rule__IntegerIterate__StepAssignment_5)
+	{ after(grammarAccess.getIntegerIterateAccess().getStepAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DateIterate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__0__Impl
+	rule__DateIterate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getDateFromKeyword_0()); }
+	'dateFrom'
+	{ after(grammarAccess.getDateIterateAccess().getDateFromKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__1__Impl
+	rule__DateIterate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getFromAssignment_1()); }
+	(rule__DateIterate__FromAssignment_1)
+	{ after(grammarAccess.getDateIterateAccess().getFromAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__2__Impl
+	rule__DateIterate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getUntilKeyword_2()); }
+	'until'
+	{ after(grammarAccess.getDateIterateAccess().getUntilKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__3__Impl
+	rule__DateIterate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getUntilAssignment_3()); }
+	(rule__DateIterate__UntilAssignment_3)
+	{ after(grammarAccess.getDateIterateAccess().getUntilAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__4__Impl
+	rule__DateIterate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getEveryKeyword_4()); }
+	'every'
+	{ after(grammarAccess.getDateIterateAccess().getEveryKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__5__Impl
+	rule__DateIterate__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getStepCountAssignment_5()); }
+	(rule__DateIterate__StepCountAssignment_5)
+	{ after(grammarAccess.getDateIterateAccess().getStepCountAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DateIterate__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateIterateAccess().getStepTypeAssignment_6()); }
+	(rule__DateIterate__StepTypeAssignment_6)
+	{ after(grammarAccess.getDateIterateAccess().getStepTypeAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Date__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Date__Group_3__0__Impl
+	rule__Date__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateAccess().getYearAssignment_3_0()); }
+	(rule__Date__YearAssignment_3_0)
+	{ after(grammarAccess.getDateAccess().getYearAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Date__Group_3__1__Impl
+	rule__Date__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1()); }
+	'-'
+	{ after(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Date__Group_3__2__Impl
+	rule__Date__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateAccess().getMonthAssignment_3_2()); }
+	(rule__Date__MonthAssignment_3_2)
+	{ after(grammarAccess.getDateAccess().getMonthAssignment_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Date__Group_3__3__Impl
+	rule__Date__Group_3__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3()); }
+	'-'
+	{ after(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Date__Group_3__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__Group_3__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDateAccess().getDayAssignment_3_4()); }
+	(rule__Date__DayAssignment_3_4)
+	{ after(grammarAccess.getDateAccess().getDayAssignment_3_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockByResourceAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockByResourceAttribute__Group__0__Impl
+	rule__EntityMockByResourceAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockByResourceAttribute__Group__1__Impl
+	rule__EntityMockByResourceAttribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1()); }
+	'var'
+	{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockByResourceAttribute__Group__2__Impl
+	rule__EntityMockByResourceAttribute__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefAssignment_2()); }
+	(rule__EntityMockByResourceAttribute__AttributeRefAssignment_2)
+	{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockByResourceAttribute__Group__3__Impl
+	rule__EntityMockByResourceAttribute__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3()); }
+	'as'
+	{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockByResourceAttribute__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeAssignment_4()); }
+	(rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4)
+	{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockTemplate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockTemplate__Group__0__Impl
+	rule__EntityMockTemplate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0()); }
+	'template'
+	{ after(grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockTemplate__Group__1__Impl
+	rule__EntityMockTemplate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockTemplateAccess().getNameAssignment_1()); }
+	(rule__EntityMockTemplate__NameAssignment_1)
+	{ after(grammarAccess.getEntityMockTemplateAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockTemplate__Group__2__Impl
+	rule__EntityMockTemplate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2()); }
+	'byObject'
+	{ after(grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockTemplate__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockTemplateAccess().getObjectAssignment_3()); }
+	(rule__EntityMockTemplate__ObjectAssignment_3)
+	{ after(grammarAccess.getEntityMockTemplateAccess().getObjectAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntityFunction__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__0__Impl
+	rule__EntityMockEntityFunction__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__1__Impl
+	rule__EntityMockEntityFunction__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefAssignment_1()); }
+	(rule__EntityMockEntityFunction__AttributeRefAssignment_1)
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__2__Impl
+	rule__EntityMockEntityFunction__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2()); }
+	'calculateOn'
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__3__Impl
+	rule__EntityMockEntityFunction__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3()); }
+	'('
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__4__Impl
+	rule__EntityMockEntityFunction__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4()); }
+	(rule__EntityMockEntityFunction__Group_4__0)?
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__5__Impl
+	rule__EntityMockEntityFunction__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5()); }
+	')'
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getBodyAssignment_6()); }
+	(rule__EntityMockEntityFunction__BodyAssignment_6)
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getBodyAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntityFunction__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group_4__0__Impl
+	rule__EntityMockEntityFunction__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_0()); }
+	(rule__EntityMockEntityFunction__ParamsAssignment_4_0)
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4_1()); }
+	(rule__EntityMockEntityFunction__Group_4_1__0)*
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntityFunction__Group_4_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group_4_1__0__Impl
+	rule__EntityMockEntityFunction__Group_4_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0()); }
+	','
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityFunction__Group_4_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__Group_4_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_1_1()); }
+	(rule__EntityMockEntityFunction__ParamsAssignment_4_1_1)
+	{ after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntityNestedAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityNestedAttribute__Group__0__Impl
+	rule__EntityMockEntityNestedAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceAssignment_0()); }
+	(rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0)
+	{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityNestedAttribute__Group__1__Impl
+	rule__EntityMockEntityNestedAttribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntityNestedAttribute__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeAssignment_2()); }
+	(rule__EntityMockEntityNestedAttribute__AttributeAssignment_2)
+	{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockReferencedObjectAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group__0__Impl
+	rule__EntityMockReferencedObjectAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0()); }
+	()
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group__1__Impl
+	rule__EntityMockReferencedObjectAttribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateAssignment_1()); }
+	(rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1)
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group__2__Impl
+	rule__EntityMockReferencedObjectAttribute__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup_2()); }
+	(rule__EntityMockReferencedObjectAttribute__Group_2__0)*
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group__3__Impl
+	rule__EntityMockReferencedObjectAttribute__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3()); }
+	'.'
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeAssignment_4()); }
+	(rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4)
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockReferencedObjectAttribute__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl
+	rule__EntityMockReferencedObjectAttribute__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0()); }
+	('.')?
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedAssignment_2_1()); }
+	(rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1)
+	{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeByObject__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_0__0__Impl
+	rule__EntityMockAttributeByObject__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_0__1__Impl
+	rule__EntityMockAttributeByObject__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefAssignment_0_1()); }
+	(rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1)
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0_2()); }
+	(rule__EntityMockAttributeByObject__Group_0_2__0)
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeByObject__Group_0_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_0_2__0__Impl
+	rule__EntityMockAttributeByObject__Group_0_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0()); }
+	'as'
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_0_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_0_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceAssignment_0_2_1()); }
+	(rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1)
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceAssignment_0_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeByObject__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_1__0__Impl
+	rule__EntityMockAttributeByObject__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0()); }
+	'using'
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_1__1__Impl
+	rule__EntityMockAttributeByObject__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumAssignment_1_1()); }
+	(rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1)
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_1__2__Impl
+	rule__EntityMockAttributeByObject__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2()); }
+	'.'
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByObject__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeAssignment_1_3()); }
+	(rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3)
+	{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeAssignment_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeFiller__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeFiller__Group__0__Impl
+	rule__EntityMockAttributeFiller__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0()); }
+	'var'
+	{ after(grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeFiller__Group__1__Impl
+	rule__EntityMockAttributeFiller__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefAssignment_1()); }
+	(rule__EntityMockAttributeFiller__AttributeRefAssignment_1)
+	{ after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeFiller__Group__2__Impl
+	rule__EntityMockAttributeFiller__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2()); }
+	'randomize'
+	{ after(grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeFiller__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypeAssignment_3()); }
+	(rule__EntityMockAttributeFiller__FillerTypeAssignment_3)
+	{ after(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeByReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group__0__Impl
+	rule__EntityMockAttributeByReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0()); }
+	'ref'
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group__1__Impl
+	rule__EntityMockAttributeByReference__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefAssignment_1()); }
+	(rule__EntityMockAttributeByReference__AttributeRefAssignment_1)
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group__2__Impl
+	rule__EntityMockAttributeByReference__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2()); }
+	'to'
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group__3__Impl
+	rule__EntityMockAttributeByReference__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAlternatives_3()); }
+	(rule__EntityMockAttributeByReference__Alternatives_3)
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup_4()); }
+	(rule__EntityMockAttributeByReference__Group_4__0)?
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockAttributeByReference__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group_4__0__Impl
+	rule__EntityMockAttributeByReference__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0()); }
+	'optionalFor'
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group_4__1__Impl
+	rule__EntityMockAttributeByReference__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForAssignment_4_1()); }
+	(rule__EntityMockAttributeByReference__OptionalForAssignment_4_1)
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockAttributeByReference__Group_4__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2()); }
+	'percent'
+	{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignedNumber__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignedNumber__Group__0__Impl
+	rule__SignedNumber__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignedNumber__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignedNumber__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignedNumber__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignedNumber__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); }
+	ruleUnsignedNumber
+	{ after(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnsignedNumber__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnsignedNumber__Group__0__Impl
+	rule__UnsignedNumber__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); }
+	RULE_INT
+	{ after(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnsignedNumber__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnsignedNumberAccess().getGroup_1()); }
+	(rule__UnsignedNumber__Group_1__0)?
+	{ after(grammarAccess.getUnsignedNumberAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnsignedNumber__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnsignedNumber__Group_1__0__Impl
+	rule__UnsignedNumber__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); }
+	'.'
+	{ after(grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnsignedNumber__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnsignedNumber__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); }
+	RULE_INT
+	{ after(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SINT__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SINT__Group__0__Impl
+	rule__SINT__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SINT__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSINTAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getSINTAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SINT__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SINT__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SINT__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSINTAccess().getINTTerminalRuleCall_1()); }
+	RULE_INT
+	{ after(grammarAccess.getSINTAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XImportDeclaration__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__0__Impl
+	rule__XImportDeclaration__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); }
+	()
+	{ after(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__1__Impl
+	rule__XImportDeclaration__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); }
+	'import'
+	{ after(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__2__Impl
+	rule__XImportDeclaration__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); }
+	(rule__XImportDeclaration__Alternatives_2)
+	{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); }
+	(';')?
+	{ after(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XImportDeclaration__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_0__0__Impl
+	rule__XImportDeclaration__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); }
+	(rule__XImportDeclaration__StaticAssignment_2_0_0)
+	{ after(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_0__1__Impl
+	rule__XImportDeclaration__Group_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); }
+	(rule__XImportDeclaration__ExtensionAssignment_2_0_1)?
+	{ after(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_0__2__Impl
+	rule__XImportDeclaration__Group_2_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); }
+	(rule__XImportDeclaration__ImportedTypeAssignment_2_0_2)
+	{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); }
+	(rule__XImportDeclaration__Alternatives_2_0_3)
+	{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XImportDeclaration__Group_2_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_3__0__Impl
+	rule__XImportDeclaration__Group_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); }
+	(rule__XImportDeclaration__FqnImportAssignment_2_3_0)
+	{ after(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_2_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_2_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); }
+	(rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1)
+	{ after(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotation__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group__0__Impl
+	rule__XAnnotation__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
+	()
+	{ after(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group__1__Impl
+	rule__XAnnotation__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }
+	'@'
+	{ after(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group__2__Impl
+	rule__XAnnotation__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
+	(rule__XAnnotation__AnnotationTypeAssignment_2)
+	{ after(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getGroup_3()); }
+	(rule__XAnnotation__Group_3__0)?
+	{ after(grammarAccess.getXAnnotationAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotation__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3__0__Impl
+	rule__XAnnotation__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
+	('(')
+	{ after(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3__1__Impl
+	rule__XAnnotation__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
+	(rule__XAnnotation__Alternatives_3_1)?
+	{ after(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }
+	')'
+	{ after(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotation__Group_3_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3_1_0__0__Impl
+	rule__XAnnotation__Group_3_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
+	(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0)
+	{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
+	(rule__XAnnotation__Group_3_1_0_1__0)*
+	{ after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotation__Group_3_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3_1_0_1__0__Impl
+	rule__XAnnotation__Group_3_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }
+	','
+	{ after(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotation__Group_3_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__Group_3_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
+	(rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1)
+	{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValuePair__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValuePair__Group__0__Impl
+	rule__XAnnotationElementValuePair__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
+	(rule__XAnnotationElementValuePair__Group_0__0)
+	{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValuePair__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
+	(rule__XAnnotationElementValuePair__ValueAssignment_1)
+	{ after(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValuePair__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValuePair__Group_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
+	(rule__XAnnotationElementValuePair__Group_0_0__0)
+	{ after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValuePair__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValuePair__Group_0_0__0__Impl
+	rule__XAnnotationElementValuePair__Group_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
+	(rule__XAnnotationElementValuePair__ElementAssignment_0_0_0)
+	{ after(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValuePair__Group_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__Group_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }
+	'='
+	{ after(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
+	(rule__XAnnotationElementValueOrCommaList__Group_0_0__0)
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
+	(rule__XAnnotationElementValueOrCommaList__Group_0_1__0)?
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }
+	']'
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
+	(rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0)
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
+	()
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }
+	'#'
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
+	'['
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
+	(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0)
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
+	(rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0)*
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
+	(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1)
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
+	ruleXAnnotationOrExpression
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
+	(rule__XAnnotationElementValueOrCommaList__Group_1_1__0)?
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
+	()
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
+		(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
+		(rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0)*
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
+	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }
+	','
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
+	(rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1)
+	{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValue__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0__0__Impl
+	rule__XAnnotationElementValue__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
+	(rule__XAnnotationElementValue__Group_0_0__0)
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0__1__Impl
+	rule__XAnnotationElementValue__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
+	(rule__XAnnotationElementValue__Group_0_1__0)?
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }
+	']'
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValue__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
+	(rule__XAnnotationElementValue__Group_0_0_0__0)
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValue__Group_0_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_0_0__0__Impl
+	rule__XAnnotationElementValue__Group_0_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
+	()
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_0_0__1__Impl
+	rule__XAnnotationElementValue__Group_0_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }
+	'#'
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
+	'['
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValue__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_1__0__Impl
+	rule__XAnnotationElementValue__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
+	(rule__XAnnotationElementValue__ElementsAssignment_0_1_0)
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
+	(rule__XAnnotationElementValue__Group_0_1_1__0)*
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAnnotationElementValue__Group_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_1_1__0__Impl
+	rule__XAnnotationElementValue__Group_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAnnotationElementValue__Group_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__Group_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
+	(rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1)
+	{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAssignment__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_0__0__Impl
+	rule__XAssignment__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
+	()
+	{ after(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_0__1__Impl
+	rule__XAssignment__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
+	(rule__XAssignment__FeatureAssignment_0_1)
+	{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_0__2__Impl
+	rule__XAssignment__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
+	ruleOpSingleAssign
+	{ after(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
+	(rule__XAssignment__ValueAssignment_0_3)
+	{ after(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAssignment__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1__0__Impl
+	rule__XAssignment__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
+	ruleXOrExpression
+	{ after(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
+	(rule__XAssignment__Group_1_1__0)?
+	{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAssignment__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1_1__0__Impl
+	rule__XAssignment__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
+	(rule__XAssignment__Group_1_1_0__0)
+	{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
+	(rule__XAssignment__RightOperandAssignment_1_1_1)
+	{ after(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAssignment__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
+	(rule__XAssignment__Group_1_1_0_0__0)
+	{ after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAssignment__Group_1_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1_1_0_0__0__Impl
+	rule__XAssignment__Group_1_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAssignment__Group_1_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__Group_1_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
+	(rule__XAssignment__FeatureAssignment_1_1_0_0_1)
+	{ after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpMultiAssign__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_5__0__Impl
+	rule__OpMultiAssign__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }
+	'<'
+	{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_5__1__Impl
+	rule__OpMultiAssign__Group_5__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }
+	'<'
+	{ after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_5__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_5__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_5__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }
+	'='
+	{ after(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpMultiAssign__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_6__0__Impl
+	rule__OpMultiAssign__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }
+	'>'
+	{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_6__1__Impl
+	rule__OpMultiAssign__Group_6__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
+	('>')?
+	{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_6__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpMultiAssign__Group_6__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpMultiAssign__Group_6__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }
+	'>='
+	{ after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOrExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group__0__Impl
+	rule__XOrExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
+	ruleXAndExpression
+	{ after(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
+	(rule__XOrExpression__Group_1__0)*
+	{ after(grammarAccess.getXOrExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOrExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group_1__0__Impl
+	rule__XOrExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
+	(rule__XOrExpression__Group_1_0__0)
+	{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XOrExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOrExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
+	(rule__XOrExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOrExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group_1_0_0__0__Impl
+	rule__XOrExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOrExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XOrExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAndExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group__0__Impl
+	rule__XAndExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
+	ruleXEqualityExpression
+	{ after(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
+	(rule__XAndExpression__Group_1__0)*
+	{ after(grammarAccess.getXAndExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAndExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group_1__0__Impl
+	rule__XAndExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
+	(rule__XAndExpression__Group_1_0__0)
+	{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XAndExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAndExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
+	(rule__XAndExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAndExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group_1_0_0__0__Impl
+	rule__XAndExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAndExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XAndExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XEqualityExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group__0__Impl
+	rule__XEqualityExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
+	ruleXRelationalExpression
+	{ after(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
+	(rule__XEqualityExpression__Group_1__0)*
+	{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XEqualityExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group_1__0__Impl
+	rule__XEqualityExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
+	(rule__XEqualityExpression__Group_1_0__0)
+	{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XEqualityExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XEqualityExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
+	(rule__XEqualityExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XEqualityExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group_1_0_0__0__Impl
+	rule__XEqualityExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XEqualityExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XEqualityExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group__0__Impl
+	rule__XRelationalExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
+	ruleXOtherOperatorExpression
+	{ after(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
+	(rule__XRelationalExpression__Alternatives_1)*
+	{ after(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_0__0__Impl
+	rule__XRelationalExpression__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
+	(rule__XRelationalExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
+	(rule__XRelationalExpression__TypeAssignment_1_0_1)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_0_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
+	(rule__XRelationalExpression__Group_1_0_0_0__0)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_0_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_0_0_0__0__Impl
+	rule__XRelationalExpression__Group_1_0_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
+	()
+	{ after(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_0_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_0_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }
+	'instanceof'
+	{ after(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_1__0__Impl
+	rule__XRelationalExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
+	(rule__XRelationalExpression__Group_1_1_0__0)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
+	(rule__XRelationalExpression__RightOperandAssignment_1_1_1)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
+	(rule__XRelationalExpression__Group_1_1_0_0__0)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XRelationalExpression__Group_1_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_1_0_0__0__Impl
+	rule__XRelationalExpression__Group_1_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XRelationalExpression__Group_1_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__Group_1_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
+	(rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1)
+	{ after(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpCompare__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpCompare__Group_1__0__Impl
+	rule__OpCompare__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpCompare__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }
+	'<'
+	{ after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpCompare__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpCompare__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpCompare__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }
+	'='
+	{ after(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOtherOperatorExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group__0__Impl
+	rule__XOtherOperatorExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
+	ruleXAdditiveExpression
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
+	(rule__XOtherOperatorExpression__Group_1__0)*
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOtherOperatorExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group_1__0__Impl
+	rule__XOtherOperatorExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
+	(rule__XOtherOperatorExpression__Group_1_0__0)
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XOtherOperatorExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOtherOperatorExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
+	(rule__XOtherOperatorExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XOtherOperatorExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
+	rule__XOtherOperatorExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_2__0__Impl
+	rule__OpOther__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }
+	'>'
+	{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }
+	'..'
+	{ after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_5__0__Impl
+	rule__OpOther__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }
+	'>'
+	{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
+	(rule__OpOther__Alternatives_5_1)
+	{ after(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_5_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_5_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
+	(rule__OpOther__Group_5_1_0_0__0)
+	{ after(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_5_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_5_1_0_0__0__Impl
+	rule__OpOther__Group_5_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }
+	'>'
+	{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_5_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_5_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }
+	'>'
+	{ after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_6__0__Impl
+	rule__OpOther__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }
+	'<'
+	{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
+	(rule__OpOther__Alternatives_6_1)
+	{ after(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_6_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_6_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
+	(rule__OpOther__Group_6_1_0_0__0)
+	{ after(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OpOther__Group_6_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_6_1_0_0__0__Impl
+	rule__OpOther__Group_6_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }
+	'<'
+	{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OpOther__Group_6_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OpOther__Group_6_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }
+	'<'
+	{ after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAdditiveExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group__0__Impl
+	rule__XAdditiveExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
+	ruleXMultiplicativeExpression
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
+	(rule__XAdditiveExpression__Group_1__0)*
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAdditiveExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group_1__0__Impl
+	rule__XAdditiveExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
+	(rule__XAdditiveExpression__Group_1_0__0)
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XAdditiveExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAdditiveExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
+	(rule__XAdditiveExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XAdditiveExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group_1_0_0__0__Impl
+	rule__XAdditiveExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XAdditiveExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XAdditiveExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMultiplicativeExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group__0__Impl
+	rule__XMultiplicativeExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
+	ruleXUnaryOperation
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
+	(rule__XMultiplicativeExpression__Group_1__0)*
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMultiplicativeExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group_1__0__Impl
+	rule__XMultiplicativeExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
+	(rule__XMultiplicativeExpression__Group_1_0__0)
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); }
+	(rule__XMultiplicativeExpression__RightOperandAssignment_1_1)
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMultiplicativeExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); }
+	(rule__XMultiplicativeExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMultiplicativeExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group_1_0_0__0__Impl
+	rule__XMultiplicativeExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+	(rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1)
+	{ after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XUnaryOperation__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XUnaryOperation__Group_0__0__Impl
+	rule__XUnaryOperation__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); }
+	()
+	{ after(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XUnaryOperation__Group_0__1__Impl
+	rule__XUnaryOperation__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); }
+	(rule__XUnaryOperation__FeatureAssignment_0_1)
+	{ after(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XUnaryOperation__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); }
+	(rule__XUnaryOperation__OperandAssignment_0_2)
+	{ after(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCastedExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group__0__Impl
+	rule__XCastedExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); }
+	ruleXPostfixOperation
+	{ after(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1()); }
+	(rule__XCastedExpression__Group_1__0)*
+	{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCastedExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group_1__0__Impl
+	rule__XCastedExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); }
+	(rule__XCastedExpression__Group_1_0__0)
+	{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); }
+	(rule__XCastedExpression__TypeAssignment_1_1)
+	{ after(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCastedExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); }
+	(rule__XCastedExpression__Group_1_0_0__0)
+	{ after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCastedExpression__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group_1_0_0__0__Impl
+	rule__XCastedExpression__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCastedExpression__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); }
+	'as'
+	{ after(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XPostfixOperation__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XPostfixOperation__Group__0__Impl
+	rule__XPostfixOperation__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); }
+	ruleXMemberFeatureCall
+	{ after(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XPostfixOperation__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXPostfixOperationAccess().getGroup_1()); }
+	(rule__XPostfixOperation__Group_1__0)?
+	{ after(grammarAccess.getXPostfixOperationAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XPostfixOperation__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XPostfixOperation__Group_1__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); }
+	(rule__XPostfixOperation__Group_1_0__0)
+	{ after(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XPostfixOperation__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XPostfixOperation__Group_1_0__0__Impl
+	rule__XPostfixOperation__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); }
+	()
+	{ after(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XPostfixOperation__Group_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); }
+	(rule__XPostfixOperation__FeatureAssignment_1_0_1)
+	{ after(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group__0__Impl
+	rule__XMemberFeatureCall__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); }
+	ruleXPrimaryExpression
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); }
+	(rule__XMemberFeatureCall__Alternatives_1)*
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0__0__Impl
+	rule__XMemberFeatureCall__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); }
+	(rule__XMemberFeatureCall__Group_1_0_0__0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); }
+	(rule__XMemberFeatureCall__ValueAssignment_1_0_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); }
+	(rule__XMemberFeatureCall__Group_1_0_0_0__0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_0_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl
+	rule__XMemberFeatureCall__Group_1_0_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); }
+	()
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl
+	rule__XMemberFeatureCall__Group_1_0_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); }
+	(rule__XMemberFeatureCall__Alternatives_1_0_0_0_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl
+	rule__XMemberFeatureCall__Group_1_0_0_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); }
+	(rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); }
+	ruleOpSingleAssign
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1__0__Impl
+	rule__XMemberFeatureCall__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); }
+	(rule__XMemberFeatureCall__Group_1_1_0__0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1__1__Impl
+	rule__XMemberFeatureCall__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); }
+	(rule__XMemberFeatureCall__Group_1_1_1__0)?
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1__2__Impl
+	rule__XMemberFeatureCall__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); }
+	(rule__XMemberFeatureCall__FeatureAssignment_1_1_2)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1__3__Impl
+	rule__XMemberFeatureCall__Group_1_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); }
+	(rule__XMemberFeatureCall__Group_1_1_3__0)?
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); }
+	(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4)?
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); }
+	(rule__XMemberFeatureCall__Group_1_1_0_0__0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); }
+	()
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); }
+	(rule__XMemberFeatureCall__Alternatives_1_1_0_0_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); }
+	'<'
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1__1__Impl
+	rule__XMemberFeatureCall__Group_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); }
+	(rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1__2__Impl
+	rule__XMemberFeatureCall__Group_1_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); }
+	(rule__XMemberFeatureCall__Group_1_1_1_2__0)*
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); }
+	'>'
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); }
+	(rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); }
+	(rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3__1__Impl
+	rule__XMemberFeatureCall__Group_1_1_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); }
+	(rule__XMemberFeatureCall__Alternatives_1_1_3_1)?
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); }
+	')'
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); }
+	(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); }
+	(rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0)*
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl
+	rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); }
+	','
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); }
+	(rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1)
+	{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSetLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group__0__Impl
+	rule__XSetLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group__1__Impl
+	rule__XSetLiteral__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); }
+	'#'
+	{ after(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group__2__Impl
+	rule__XSetLiteral__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group__3__Impl
+	rule__XSetLiteral__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getGroup_3()); }
+	(rule__XSetLiteral__Group_3__0)?
+	{ after(grammarAccess.getXSetLiteralAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSetLiteral__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group_3__0__Impl
+	rule__XSetLiteral__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); }
+	(rule__XSetLiteral__ElementsAssignment_3_0)
+	{ after(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); }
+	(rule__XSetLiteral__Group_3_1__0)*
+	{ after(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSetLiteral__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group_3_1__0__Impl
+	rule__XSetLiteral__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); }
+	','
+	{ after(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSetLiteral__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); }
+	(rule__XSetLiteral__ElementsAssignment_3_1_1)
+	{ after(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XListLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group__0__Impl
+	rule__XListLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group__1__Impl
+	rule__XListLiteral__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); }
+	'#'
+	{ after(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group__2__Impl
+	rule__XListLiteral__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); }
+	'['
+	{ after(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group__3__Impl
+	rule__XListLiteral__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getGroup_3()); }
+	(rule__XListLiteral__Group_3__0)?
+	{ after(grammarAccess.getXListLiteralAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); }
+	']'
+	{ after(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XListLiteral__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group_3__0__Impl
+	rule__XListLiteral__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); }
+	(rule__XListLiteral__ElementsAssignment_3_0)
+	{ after(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getGroup_3_1()); }
+	(rule__XListLiteral__Group_3_1__0)*
+	{ after(grammarAccess.getXListLiteralAccess().getGroup_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XListLiteral__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group_3_1__0__Impl
+	rule__XListLiteral__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); }
+	','
+	{ after(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XListLiteral__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); }
+	(rule__XListLiteral__ElementsAssignment_3_1_1)
+	{ after(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group__0__Impl
+	rule__XClosure__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_0()); }
+	(rule__XClosure__Group_0__0)
+	{ after(grammarAccess.getXClosureAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group__1__Impl
+	rule__XClosure__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_1()); }
+	(rule__XClosure__Group_1__0)?
+	{ after(grammarAccess.getXClosureAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group__2__Impl
+	rule__XClosure__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); }
+	(rule__XClosure__ExpressionAssignment_2)
+	{ after(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); }
+	']'
+	{ after(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_0_0()); }
+	(rule__XClosure__Group_0_0__0)
+	{ after(grammarAccess.getXClosureAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_0_0__0__Impl
+	rule__XClosure__Group_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); }
+	()
+	{ after(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); }
+	'['
+	{ after(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_1_0()); }
+	(rule__XClosure__Group_1_0__0)
+	{ after(grammarAccess.getXClosureAccess().getGroup_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0__0__Impl
+	rule__XClosure__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_1_0_0()); }
+	(rule__XClosure__Group_1_0_0__0)?
+	{ after(grammarAccess.getXClosureAccess().getGroup_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); }
+	(rule__XClosure__ExplicitSyntaxAssignment_1_0_1)
+	{ after(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0_0__0__Impl
+	rule__XClosure__Group_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); }
+	(rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0)
+	{ after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); }
+	(rule__XClosure__Group_1_0_0_1__0)*
+	{ after(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XClosure__Group_1_0_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0_0_1__0__Impl
+	rule__XClosure__Group_1_0_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); }
+	','
+	{ after(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XClosure__Group_1_0_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__Group_1_0_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); }
+	(rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1)
+	{ after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XExpressionInClosure__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XExpressionInClosure__Group__0__Impl
+	rule__XExpressionInClosure__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XExpressionInClosure__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); }
+	(rule__XExpressionInClosure__Group_1__0)*
+	{ after(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XExpressionInClosure__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XExpressionInClosure__Group_1__0__Impl
+	rule__XExpressionInClosure__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); }
+	(rule__XExpressionInClosure__ExpressionsAssignment_1_0)
+	{ after(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XExpressionInClosure__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); }
+	(';')?
+	{ after(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XShortClosure__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group__0__Impl
+	rule__XShortClosure__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getGroup_0()); }
+	(rule__XShortClosure__Group_0__0)
+	{ after(grammarAccess.getXShortClosureAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); }
+	(rule__XShortClosure__ExpressionAssignment_1)
+	{ after(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XShortClosure__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getGroup_0_0()); }
+	(rule__XShortClosure__Group_0_0__0)
+	{ after(grammarAccess.getXShortClosureAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XShortClosure__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0__0__Impl
+	rule__XShortClosure__Group_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); }
+	()
+	{ after(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0__1__Impl
+	rule__XShortClosure__Group_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); }
+	(rule__XShortClosure__Group_0_0_1__0)?
+	{ after(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); }
+	(rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2)
+	{ after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XShortClosure__Group_0_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0_1__0__Impl
+	rule__XShortClosure__Group_0_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); }
+	(rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0)
+	{ after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); }
+	(rule__XShortClosure__Group_0_0_1_1__0)*
+	{ after(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XShortClosure__Group_0_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0_1_1__0__Impl
+	rule__XShortClosure__Group_0_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XShortClosure__Group_0_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__Group_0_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); }
+	(rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1)
+	{ after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XParenthesizedExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XParenthesizedExpression__Group__0__Impl
+	rule__XParenthesizedExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XParenthesizedExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); }
+	'('
+	{ after(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XParenthesizedExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XParenthesizedExpression__Group__1__Impl
+	rule__XParenthesizedExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XParenthesizedExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); }
+	ruleXExpression
+	{ after(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XParenthesizedExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XParenthesizedExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XParenthesizedExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); }
+	')'
+	{ after(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XIfExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__0__Impl
+	rule__XIfExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__1__Impl
+	rule__XIfExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); }
+	'if'
+	{ after(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__2__Impl
+	rule__XIfExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__3__Impl
+	rule__XIfExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); }
+	(rule__XIfExpression__IfAssignment_3)
+	{ after(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__4__Impl
+	rule__XIfExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); }
+	')'
+	{ after(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__5__Impl
+	rule__XIfExpression__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); }
+	(rule__XIfExpression__ThenAssignment_5)
+	{ after(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getGroup_6()); }
+	(rule__XIfExpression__Group_6__0)?
+	{ after(grammarAccess.getXIfExpressionAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XIfExpression__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group_6__0__Impl
+	rule__XIfExpression__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); }
+	('else')
+	{ after(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XIfExpression__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); }
+	(rule__XIfExpression__ElseAssignment_6_1)
+	{ after(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__0__Impl
+	rule__XSwitchExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__1__Impl
+	rule__XSwitchExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); }
+	'switch'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__2__Impl
+	rule__XSwitchExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); }
+	(rule__XSwitchExpression__Alternatives_2)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__3__Impl
+	rule__XSwitchExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); }
+	'{'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__4__Impl
+	rule__XSwitchExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); }
+	(rule__XSwitchExpression__CasesAssignment_4)*
+	{ after(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__5__Impl
+	rule__XSwitchExpression__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); }
+	(rule__XSwitchExpression__Group_5__0)?
+	{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0__0__Impl
+	rule__XSwitchExpression__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); }
+	(rule__XSwitchExpression__Group_2_0_0__0)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0__1__Impl
+	rule__XSwitchExpression__Group_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); }
+	(rule__XSwitchExpression__SwitchAssignment_2_0_1)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); }
+	')'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); }
+	(rule__XSwitchExpression__Group_2_0_0_0__0)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_0_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0_0_0__0__Impl
+	rule__XSwitchExpression__Group_2_0_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); }
+	'('
+	{ after(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0_0_0__1__Impl
+	rule__XSwitchExpression__Group_2_0_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); }
+	(rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_0_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_0_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); }
+	':'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_1__0__Impl
+	rule__XSwitchExpression__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); }
+	(rule__XSwitchExpression__Group_2_1_0__0)?
+	{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); }
+	(rule__XSwitchExpression__SwitchAssignment_2_1_1)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_1_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); }
+	(rule__XSwitchExpression__Group_2_1_0_0__0)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_2_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_1_0_0__0__Impl
+	rule__XSwitchExpression__Group_2_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); }
+	(rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_2_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_2_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); }
+	':'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSwitchExpression__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_5__0__Impl
+	rule__XSwitchExpression__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); }
+	'default'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_5__1__Impl
+	rule__XSwitchExpression__Group_5__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); }
+	':'
+	{ after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_5__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSwitchExpression__Group_5__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__Group_5__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); }
+	(rule__XSwitchExpression__DefaultAssignment_5_2)
+	{ after(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCasePart__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group__0__Impl
+	rule__XCasePart__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); }
+	()
+	{ after(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group__1__Impl
+	rule__XCasePart__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); }
+	(rule__XCasePart__TypeGuardAssignment_1)?
+	{ after(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group__2__Impl
+	rule__XCasePart__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getGroup_2()); }
+	(rule__XCasePart__Group_2__0)?
+	{ after(grammarAccess.getXCasePartAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getAlternatives_3()); }
+	(rule__XCasePart__Alternatives_3)
+	{ after(grammarAccess.getXCasePartAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCasePart__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group_2__0__Impl
+	rule__XCasePart__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); }
+	'case'
+	{ after(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); }
+	(rule__XCasePart__CaseAssignment_2_1)
+	{ after(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCasePart__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group_3_0__0__Impl
+	rule__XCasePart__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); }
+	':'
+	{ after(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCasePart__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); }
+	(rule__XCasePart__ThenAssignment_3_0_1)
+	{ after(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XForLoopExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group__0__Impl
+	rule__XForLoopExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); }
+	(rule__XForLoopExpression__Group_0__0)
+	{ after(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group__1__Impl
+	rule__XForLoopExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); }
+	(rule__XForLoopExpression__ForExpressionAssignment_1)
+	{ after(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group__2__Impl
+	rule__XForLoopExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); }
+	')'
+	{ after(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); }
+	(rule__XForLoopExpression__EachExpressionAssignment_3)
+	{ after(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XForLoopExpression__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); }
+	(rule__XForLoopExpression__Group_0_0__0)
+	{ after(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XForLoopExpression__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0_0__0__Impl
+	rule__XForLoopExpression__Group_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); }
+	()
+	{ after(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0_0__1__Impl
+	rule__XForLoopExpression__Group_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); }
+	'for'
+	{ after(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0_0__2__Impl
+	rule__XForLoopExpression__Group_0_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); }
+	'('
+	{ after(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0_0__3__Impl
+	rule__XForLoopExpression__Group_0_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); }
+	(rule__XForLoopExpression__DeclaredParamAssignment_0_0_3)
+	{ after(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XForLoopExpression__Group_0_0__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__Group_0_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); }
+	':'
+	{ after(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBasicForLoopExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__0__Impl
+	rule__XBasicForLoopExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__1__Impl
+	rule__XBasicForLoopExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); }
+	'for'
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__2__Impl
+	rule__XBasicForLoopExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__3__Impl
+	rule__XBasicForLoopExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); }
+	(rule__XBasicForLoopExpression__Group_3__0)?
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__4__Impl
+	rule__XBasicForLoopExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); }
+	';'
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__5__Impl
+	rule__XBasicForLoopExpression__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); }
+	(rule__XBasicForLoopExpression__ExpressionAssignment_5)?
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__6__Impl
+	rule__XBasicForLoopExpression__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); }
+	';'
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__7__Impl
+	rule__XBasicForLoopExpression__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); }
+	(rule__XBasicForLoopExpression__Group_7__0)?
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__8__Impl
+	rule__XBasicForLoopExpression__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); }
+	')'
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); }
+	(rule__XBasicForLoopExpression__EachExpressionAssignment_9)
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBasicForLoopExpression__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_3__0__Impl
+	rule__XBasicForLoopExpression__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); }
+	(rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0)
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); }
+	(rule__XBasicForLoopExpression__Group_3_1__0)*
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBasicForLoopExpression__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_3_1__0__Impl
+	rule__XBasicForLoopExpression__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); }
+	','
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); }
+	(rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1)
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBasicForLoopExpression__Group_7__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_7__0__Impl
+	rule__XBasicForLoopExpression__Group_7__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); }
+	(rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0)
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_7__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); }
+	(rule__XBasicForLoopExpression__Group_7_1__0)*
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBasicForLoopExpression__Group_7_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_7_1__0__Impl
+	rule__XBasicForLoopExpression__Group_7_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); }
+	','
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBasicForLoopExpression__Group_7_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__Group_7_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); }
+	(rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1)
+	{ after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XWhileExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__0__Impl
+	rule__XWhileExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__1__Impl
+	rule__XWhileExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); }
+	'while'
+	{ after(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__2__Impl
+	rule__XWhileExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__3__Impl
+	rule__XWhileExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); }
+	(rule__XWhileExpression__PredicateAssignment_3)
+	{ after(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__4__Impl
+	rule__XWhileExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); }
+	')'
+	{ after(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XWhileExpression__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); }
+	(rule__XWhileExpression__BodyAssignment_5)
+	{ after(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XDoWhileExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__0__Impl
+	rule__XDoWhileExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__1__Impl
+	rule__XDoWhileExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); }
+	'do'
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__2__Impl
+	rule__XDoWhileExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); }
+	(rule__XDoWhileExpression__BodyAssignment_2)
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__3__Impl
+	rule__XDoWhileExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); }
+	'while'
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__4__Impl
+	rule__XDoWhileExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); }
+	'('
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__5__Impl
+	rule__XDoWhileExpression__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); }
+	(rule__XDoWhileExpression__PredicateAssignment_5)
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XDoWhileExpression__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); }
+	')'
+	{ after(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBlockExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group__0__Impl
+	rule__XBlockExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group__1__Impl
+	rule__XBlockExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); }
+	'{'
+	{ after(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group__2__Impl
+	rule__XBlockExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getGroup_2()); }
+	(rule__XBlockExpression__Group_2__0)*
+	{ after(grammarAccess.getXBlockExpressionAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); }
+	'}'
+	{ after(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBlockExpression__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group_2__0__Impl
+	rule__XBlockExpression__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); }
+	(rule__XBlockExpression__ExpressionsAssignment_2_0)
+	{ after(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBlockExpression__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); }
+	(';')?
+	{ after(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XVariableDeclaration__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group__0__Impl
+	rule__XVariableDeclaration__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); }
+	()
+	{ after(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group__1__Impl
+	rule__XVariableDeclaration__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); }
+	(rule__XVariableDeclaration__Alternatives_1)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group__2__Impl
+	rule__XVariableDeclaration__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); }
+	(rule__XVariableDeclaration__Alternatives_2)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); }
+	(rule__XVariableDeclaration__Group_3__0)?
+	{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XVariableDeclaration__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group_2_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); }
+	(rule__XVariableDeclaration__Group_2_0_0__0)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XVariableDeclaration__Group_2_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group_2_0_0__0__Impl
+	rule__XVariableDeclaration__Group_2_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_2_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); }
+	(rule__XVariableDeclaration__TypeAssignment_2_0_0_0)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_2_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group_2_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_2_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); }
+	(rule__XVariableDeclaration__NameAssignment_2_0_0_1)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XVariableDeclaration__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group_3__0__Impl
+	rule__XVariableDeclaration__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); }
+	'='
+	{ after(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XVariableDeclaration__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); }
+	(rule__XVariableDeclaration__RightAssignment_3_1)
+	{ after(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmFormalParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmFormalParameter__Group__0__Impl
+	rule__JvmFormalParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmFormalParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); }
+	(rule__JvmFormalParameter__ParameterTypeAssignment_0)?
+	{ after(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmFormalParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmFormalParameter__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmFormalParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); }
+	(rule__JvmFormalParameter__NameAssignment_1)
+	{ after(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FullJvmFormalParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FullJvmFormalParameter__Group__0__Impl
+	rule__FullJvmFormalParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FullJvmFormalParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); }
+	(rule__FullJvmFormalParameter__ParameterTypeAssignment_0)
+	{ after(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FullJvmFormalParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FullJvmFormalParameter__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FullJvmFormalParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); }
+	(rule__FullJvmFormalParameter__NameAssignment_1)
+	{ after(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group__0__Impl
+	rule__XFeatureCall__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); }
+	()
+	{ after(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group__1__Impl
+	rule__XFeatureCall__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getGroup_1()); }
+	(rule__XFeatureCall__Group_1__0)?
+	{ after(grammarAccess.getXFeatureCallAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group__2__Impl
+	rule__XFeatureCall__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); }
+	(rule__XFeatureCall__FeatureAssignment_2)
+	{ after(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group__3__Impl
+	rule__XFeatureCall__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getGroup_3()); }
+	(rule__XFeatureCall__Group_3__0)?
+	{ after(grammarAccess.getXFeatureCallAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); }
+	(rule__XFeatureCall__FeatureCallArgumentsAssignment_4)?
+	{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1__0__Impl
+	rule__XFeatureCall__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); }
+	'<'
+	{ after(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1__1__Impl
+	rule__XFeatureCall__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); }
+	(rule__XFeatureCall__TypeArgumentsAssignment_1_1)
+	{ after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1__2__Impl
+	rule__XFeatureCall__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); }
+	(rule__XFeatureCall__Group_1_2__0)*
+	{ after(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); }
+	'>'
+	{ after(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1_2__0__Impl
+	rule__XFeatureCall__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); }
+	','
+	{ after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); }
+	(rule__XFeatureCall__TypeArgumentsAssignment_1_2_1)
+	{ after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3__0__Impl
+	rule__XFeatureCall__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); }
+	(rule__XFeatureCall__ExplicitOperationCallAssignment_3_0)
+	{ after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3__1__Impl
+	rule__XFeatureCall__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); }
+	(rule__XFeatureCall__Alternatives_3_1)?
+	{ after(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); }
+	')'
+	{ after(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3_1_1__0__Impl
+	rule__XFeatureCall__Group_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); }
+	(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0)
+	{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); }
+	(rule__XFeatureCall__Group_3_1_1_1__0)*
+	{ after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFeatureCall__Group_3_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3_1_1_1__0__Impl
+	rule__XFeatureCall__Group_3_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); }
+	','
+	{ after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFeatureCall__Group_3_1_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__Group_3_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); }
+	(rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1)
+	{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__0__Impl
+	rule__XConstructorCall__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); }
+	()
+	{ after(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__1__Impl
+	rule__XConstructorCall__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); }
+	'new'
+	{ after(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__2__Impl
+	rule__XConstructorCall__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); }
+	(rule__XConstructorCall__ConstructorAssignment_2)
+	{ after(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__3__Impl
+	rule__XConstructorCall__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getGroup_3()); }
+	(rule__XConstructorCall__Group_3__0)?
+	{ after(grammarAccess.getXConstructorCallAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__4__Impl
+	rule__XConstructorCall__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getGroup_4()); }
+	(rule__XConstructorCall__Group_4__0)?
+	{ after(grammarAccess.getXConstructorCallAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); }
+	(rule__XConstructorCall__ArgumentsAssignment_5)?
+	{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3__0__Impl
+	rule__XConstructorCall__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); }
+	('<')
+	{ after(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3__1__Impl
+	rule__XConstructorCall__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); }
+	(rule__XConstructorCall__TypeArgumentsAssignment_3_1)
+	{ after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3__2__Impl
+	rule__XConstructorCall__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); }
+	(rule__XConstructorCall__Group_3_2__0)*
+	{ after(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); }
+	'>'
+	{ after(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group_3_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3_2__0__Impl
+	rule__XConstructorCall__Group_3_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); }
+	','
+	{ after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_3_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_3_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); }
+	(rule__XConstructorCall__TypeArgumentsAssignment_3_2_1)
+	{ after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4__0__Impl
+	rule__XConstructorCall__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); }
+	(rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0)
+	{ after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4__1__Impl
+	rule__XConstructorCall__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); }
+	(rule__XConstructorCall__Alternatives_4_1)?
+	{ after(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); }
+	')'
+	{ after(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group_4_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4_1_1__0__Impl
+	rule__XConstructorCall__Group_4_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); }
+	(rule__XConstructorCall__ArgumentsAssignment_4_1_1_0)
+	{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); }
+	(rule__XConstructorCall__Group_4_1_1_1__0)*
+	{ after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XConstructorCall__Group_4_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4_1_1_1__0__Impl
+	rule__XConstructorCall__Group_4_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); }
+	','
+	{ after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XConstructorCall__Group_4_1_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__Group_4_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); }
+	(rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1)
+	{ after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XBooleanLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBooleanLiteral__Group__0__Impl
+	rule__XBooleanLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XBooleanLiteral__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); }
+	(rule__XBooleanLiteral__Alternatives_1)
+	{ after(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XNullLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XNullLiteral__Group__0__Impl
+	rule__XNullLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNullLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNullLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XNullLiteral__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNullLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); }
+	'null'
+	{ after(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XNumberLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XNumberLiteral__Group__0__Impl
+	rule__XNumberLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNumberLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNumberLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XNumberLiteral__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNumberLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); }
+	(rule__XNumberLiteral__ValueAssignment_1)
+	{ after(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XStringLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XStringLiteral__Group__0__Impl
+	rule__XStringLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XStringLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XStringLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XStringLiteral__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XStringLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); }
+	(rule__XStringLiteral__ValueAssignment_1)
+	{ after(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XTypeLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__0__Impl
+	rule__XTypeLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); }
+	()
+	{ after(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__1__Impl
+	rule__XTypeLiteral__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); }
+	'typeof'
+	{ after(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__2__Impl
+	rule__XTypeLiteral__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); }
+	'('
+	{ after(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__3__Impl
+	rule__XTypeLiteral__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); }
+	(rule__XTypeLiteral__TypeAssignment_3)
+	{ after(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__4__Impl
+	rule__XTypeLiteral__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); }
+	(rule__XTypeLiteral__ArrayDimensionsAssignment_4)*
+	{ after(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTypeLiteral__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); }
+	')'
+	{ after(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XThrowExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XThrowExpression__Group__0__Impl
+	rule__XThrowExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XThrowExpression__Group__1__Impl
+	rule__XThrowExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); }
+	'throw'
+	{ after(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XThrowExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); }
+	(rule__XThrowExpression__ExpressionAssignment_2)
+	{ after(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XReturnExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XReturnExpression__Group__0__Impl
+	rule__XReturnExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XReturnExpression__Group__1__Impl
+	rule__XReturnExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); }
+	'return'
+	{ after(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XReturnExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); }
+	(rule__XReturnExpression__ExpressionAssignment_2)?
+	{ after(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XTryCatchFinallyExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group__0__Impl
+	rule__XTryCatchFinallyExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group__1__Impl
+	rule__XTryCatchFinallyExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); }
+	'try'
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group__2__Impl
+	rule__XTryCatchFinallyExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); }
+	(rule__XTryCatchFinallyExpression__ExpressionAssignment_2)
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); }
+	(rule__XTryCatchFinallyExpression__Alternatives_3)
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XTryCatchFinallyExpression__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_0__0__Impl
+	rule__XTryCatchFinallyExpression__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); }
+		(rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0)
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); }
+	)
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); }
+		(rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0)*
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); }
+	(rule__XTryCatchFinallyExpression__Group_3_0_1__0)?
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XTryCatchFinallyExpression__Group_3_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl
+	rule__XTryCatchFinallyExpression__Group_3_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); }
+	('finally')
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); }
+	(rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1)
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XTryCatchFinallyExpression__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_1__0__Impl
+	rule__XTryCatchFinallyExpression__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); }
+	'finally'
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); }
+	(rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1)
+	{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSynchronizedExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group__0__Impl
+	rule__XSynchronizedExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); }
+	(rule__XSynchronizedExpression__Group_0__0)
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group__1__Impl
+	rule__XSynchronizedExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); }
+	(rule__XSynchronizedExpression__ParamAssignment_1)
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group__2__Impl
+	rule__XSynchronizedExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); }
+	')'
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); }
+	(rule__XSynchronizedExpression__ExpressionAssignment_3)
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSynchronizedExpression__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); }
+	(rule__XSynchronizedExpression__Group_0_0__0)
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XSynchronizedExpression__Group_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group_0_0__0__Impl
+	rule__XSynchronizedExpression__Group_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); }
+	()
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group_0_0__1__Impl
+	rule__XSynchronizedExpression__Group_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); }
+	'synchronized'
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XSynchronizedExpression__Group_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__Group_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); }
+	'('
+	{ after(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XCatchClause__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCatchClause__Group__0__Impl
+	rule__XCatchClause__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); }
+	('catch')
+	{ after(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCatchClause__Group__1__Impl
+	rule__XCatchClause__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCatchClause__Group__2__Impl
+	rule__XCatchClause__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); }
+	(rule__XCatchClause__DeclaredParamAssignment_2)
+	{ after(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCatchClause__Group__3__Impl
+	rule__XCatchClause__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XCatchClause__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); }
+	(rule__XCatchClause__ExpressionAssignment_4)
+	{ after(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedName__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group__0__Impl
+	rule__QualifiedName__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getGroup_1()); }
+	(rule__QualifiedName__Group_1__0)*
+	{ after(grammarAccess.getQualifiedNameAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedName__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group_1__0__Impl
+	rule__QualifiedName__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); }
+	('.')
+	{ after(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Number__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Number__Group_1__0__Impl
+	rule__Number__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumberAccess().getAlternatives_1_0()); }
+	(rule__Number__Alternatives_1_0)
+	{ after(grammarAccess.getNumberAccess().getAlternatives_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Number__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumberAccess().getGroup_1_1()); }
+	(rule__Number__Group_1_1__0)?
+	{ after(grammarAccess.getNumberAccess().getGroup_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Number__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Number__Group_1_1__0__Impl
+	rule__Number__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); }
+	'.'
+	{ after(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Number__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Number__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); }
+	(rule__Number__Alternatives_1_1_1)
+	{ after(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0__0__Impl
+	rule__JvmTypeReference__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); }
+	ruleJvmParameterizedTypeReference
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); }
+	(rule__JvmTypeReference__Group_0_1__0)*
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); }
+	(rule__JvmTypeReference__Group_0_1_0__0)
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1_0__0__Impl
+	rule__JvmTypeReference__Group_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); }
+	()
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); }
+	ruleArrayBrackets
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ArrayBrackets__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArrayBrackets__Group__0__Impl
+	rule__ArrayBrackets__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); }
+	'['
+	{ after(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArrayBrackets__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); }
+	']'
+	{ after(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__0__Impl
+	rule__XFunctionTypeRef__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); }
+	(rule__XFunctionTypeRef__Group_0__0)?
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__1__Impl
+	rule__XFunctionTypeRef__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); }
+	'=>'
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); }
+	(rule__XFunctionTypeRef__ReturnTypeAssignment_2)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__0__Impl
+	rule__XFunctionTypeRef__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); }
+	'('
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__1__Impl
+	rule__XFunctionTypeRef__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); }
+	(rule__XFunctionTypeRef__Group_0_1__0)?
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); }
+	')'
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1__0__Impl
+	rule__XFunctionTypeRef__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); }
+	(rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); }
+	(rule__XFunctionTypeRef__Group_0_1_1__0)*
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1_1__0__Impl
+	rule__XFunctionTypeRef__Group_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); }
+	(rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group__0__Impl
+	rule__JvmParameterizedTypeReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); }
+	(rule__JvmParameterizedTypeReference__TypeAssignment_0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); }
+	(rule__JvmParameterizedTypeReference__Group_1__0)?
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); }
+	('<')
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__2__Impl
+	rule__JvmParameterizedTypeReference__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_2__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__3__Impl
+	rule__JvmParameterizedTypeReference__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); }
+	'>'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); }
+	','
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_0__0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); }
+	(rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_2__0)?
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_0_0__0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); }
+	()
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); }
+	'.'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); }
+	('<')
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_2_2__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); }
+	'>'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); }
+	','
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__0__Impl
+	rule__JvmWildcardTypeReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); }
+	()
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__1__Impl
+	rule__JvmWildcardTypeReference__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); }
+	'?'
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); }
+	(rule__JvmWildcardTypeReference__Alternatives_2)?
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_0__0__Impl
+	rule__JvmWildcardTypeReference__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0)
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1)*
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_1__0__Impl
+	rule__JvmWildcardTypeReference__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0)
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1)*
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmUpperBound__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBound__Group__0__Impl
+	rule__JvmUpperBound__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); }
+	'extends'
+	{ after(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBound__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmUpperBound__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmUpperBoundAnded__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBoundAnded__Group__0__Impl
+	rule__JvmUpperBoundAnded__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); }
+	'&'
+	{ after(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBoundAnded__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmUpperBoundAnded__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmLowerBound__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBound__Group__0__Impl
+	rule__JvmLowerBound__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); }
+	'super'
+	{ after(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBound__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmLowerBound__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmLowerBoundAnded__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBoundAnded__Group__0__Impl
+	rule__JvmLowerBoundAnded__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); }
+	'&'
+	{ after(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBoundAnded__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmLowerBoundAnded__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedNameWithWildcard__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__0__Impl
+	rule__QualifiedNameWithWildcard__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); }
+	ruleQualifiedName
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__1__Impl
+	rule__QualifiedNameWithWildcard__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); }
+	'*'
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedNameInStaticImport__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameInStaticImport__Group__0__Impl
+	rule__QualifiedNameInStaticImport__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameInStaticImport__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMock__UnorderedGroup_4_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__0
+	{getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1())}?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockAccess().getGroup_4_1_0()); }
+					(rule__EntityMock__Group_4_1_0__0)
+					{ after(grammarAccess.getEntityMockAccess().getGroup_4_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1()); }
+					(rule__EntityMock__DatainterchangesAssignment_4_1_1)
+					{ after(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2()); }
+					(rule__EntityMock__ResourcesAssignment_4_1_2)
+					{ after(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3()); }
+					(rule__EntityMock__ObjectsAssignment_4_1_3)
+					{ after(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockAccess().getEntitiesAssignment_4_1_4()); }
+					(rule__EntityMock__EntitiesAssignment_4_1_4)
+					{ after(grammarAccess.getEntityMockAccess().getEntitiesAssignment_4_1_4()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__Impl
+	rule__EntityMock__UnorderedGroup_4_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__Impl
+	rule__EntityMock__UnorderedGroup_4_1__2?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__Impl
+	rule__EntityMock__UnorderedGroup_4_1__3?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__Impl
+	rule__EntityMock__UnorderedGroup_4_1__4?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__UnorderedGroup_4_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMock__UnorderedGroup_4_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockEntity__UnorderedGroup_4_1_3
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+	}
+:
+	rule__EntityMockEntity__UnorderedGroup_4_1_3__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					(
+						{ before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); }
+						(rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0)
+						{ after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); }
+					)
+					(
+						{ before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); }
+						((rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0)=>rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0)*
+						{ after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); }
+					)
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingAssignment_4_1_3_1()); }
+					(rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1)
+					{ after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingAssignment_4_1_3_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__UnorderedGroup_4_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl
+	rule__EntityMockEntity__UnorderedGroup_4_1_3__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__UnorderedGroup_4_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EntityMockModel__ImportSectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); }
+		ruleXImportSection
+		{ after(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockModel__PackagesAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0()); }
+		ruleEntityMockPackage
+		{ after(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); }
+		ruleQualifiedName
+		{ after(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockPackage__MocksAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0()); }
+		ruleEntityMock
+		{ after(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__DescriptionAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); }
+			'describedBy'
+			{ after(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); }
+		)
+		{ after(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__DescriptionValueAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__RunPriorityAssignment_4_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__DatainterchangesAssignment_4_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0()); }
+		ruleRunningDataInterchanges
+		{ after(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__ResourcesAssignment_4_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0()); }
+		ruleEntityMockResources
+		{ after(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__ObjectsAssignment_4_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0()); }
+		ruleEntityMockObjects
+		{ after(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMock__EntitiesAssignment_4_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0()); }
+		ruleEntityMockEntities
+		{ after(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchanges__DatainterchangesAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); }
+		ruleRunningDataInterchange
+		{ after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__DatainterchangeRefAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RunningDataInterchange__FileURLAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResources__ResourcesAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); }
+		ruleEntityMockResource
+		{ after(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__AttributesAssignment_3_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); }
+		ruleEntityMockResourceAttribute
+		{ after(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResource__DatarowsAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); }
+		ruleEntityMockResourceDataRow
+		{ after(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceAttribute__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjects__ObjectsAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); }
+		ruleEntityMockObject
+		{ after(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__EnumerationsAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); }
+		ruleEntityMockObjectEnum
+		{ after(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__AttributesAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); }
+		ruleIEntityMockObjectAttribute
+		{ after(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObject__CalculationsAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); }
+		ruleEntityMockObjectFunction
+		{ after(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEnum__UsingResourceAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectPlainValue__ValuesAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__EnumerationAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectArrayValue__ItemsAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); }
+		ruleEntityMockObjectItemValue
+		{ after(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__DatarowAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectItemValue__ValuesAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectEmbed__ObjectAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__OftypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); }
+		ruleJvmParameterizedTypeReference
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__ParamsAssignment_6_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); }
+		ruleEntityMockObjectFunctionParameter
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__ParamsAssignment_6_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); }
+		ruleEntityMockObjectFunctionParameter
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunction__BodyAssignment_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); }
+		ruleXBlockExpression
+		{ after(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFunctionParameter__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockObjectFill__FillerTypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); }
+		rulePropertyFillerType
+		{ after(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDatePast__DatePastYearsAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__DateBeginYearsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0()); }
+		ruleSINT
+		{ after(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerDateRange__DateEndYearsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0()); }
+		ruleSINT
+		{ after(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0()); }
+		ruleSignedNumber
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0()); }
+		ruleSignedNumber
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); }
+		ruleUnsignedNumber
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); }
+		ruleSignedNumber
+		{ after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0()); }
+		ruleSINT
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0()); }
+		ruleSINT
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); }
+		ruleSINT
+		{ after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextRandom__ItemsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextParagraphs__CountAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextSentences__CountAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerTextWords__CountAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0()); }
+		ruleUnsignedNumber
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0()); }
+		ruleUnsignedNumber
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); }
+		ruleUnsignedNumber
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); }
+		ruleUnsignedNumber
+		{ after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); }
+		(
+			{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); }
+		RULE_INT
+		{ after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntities__EntitiesAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); }
+		ruleEntityMockEntity
+		{ after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__EntityRefAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityIDTerminalRuleCall_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityIDTerminalRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__MinRowsAssignment_4_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__MaxRowsAssignment_4_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); }
+		RULE_INT
+		{ after(grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__TemplatesAssignment_4_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0()); }
+		ruleEntityMockTemplate
+		{ after(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__AttributesAssignment_4_0_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); }
+		ruleIEntityMockAttribute
+		{ after(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__CalculationsAssignment_4_0_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); }
+		ruleEntityMockEntityFunction
+		{ after(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__ByResourceAssignment_4_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0()); }
+		ruleEntityMockByResourceAttribute
+		{ after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); }
+			'createBlobMapping'
+			{ after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__IteratorAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__IterateAssignment_4_2_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); }
+		ruleIIterate
+		{ after(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__TemplatesAssignment_4_2_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0()); }
+		ruleEntityMockTemplate
+		{ after(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__AttributesAssignment_4_2_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); }
+		ruleIEntityMockAttribute
+		{ after(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntity__CalculationsAssignment_4_2_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); }
+		ruleEntityMockEntityFunction
+		{ after(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__FromAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0()); }
+		ruleSINT
+		{ after(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__UntilAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0()); }
+		ruleSINT
+		{ after(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntegerIterate__StepAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0()); }
+		RULE_INT
+		{ after(grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__FromAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0()); }
+		ruleDate
+		{ after(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__UntilAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0()); }
+		ruleDate
+		{ after(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__StepCountAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DateIterate__StepTypeAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0()); }
+		ruleEDateStepType
+		{ after(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__YesterdayAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); }
+		(
+			{ before(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); }
+			'yesterday'
+			{ after(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); }
+		)
+		{ after(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__TodayAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); }
+			'today'
+			{ after(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__TomorrowAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); }
+		(
+			{ before(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); }
+			'tomorrow'
+			{ after(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); }
+		)
+		{ after(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__YearAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__MonthAssignment_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Date__DayAssignment_3_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__AttributeRefAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0()); }
+		(
+			{ before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0()); }
+		RULE_ID
+		{ after(grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockTemplate__ObjectAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__AttributeRefAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__ParamsAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0()); }
+		ruleEntityMockEntityFunctionParameter
+		{ after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__ParamsAssignment_4_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0()); }
+		ruleEntityMockEntityFunctionParameter
+		{ after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunction__BodyAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0()); }
+		ruleXBlockExpression
+		{ after(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0()); }
+		ruleEntityMockEntityNestedAttribute
+		{ after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockEntityNestedAttribute__AttributeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0()); }
+		(
+			{ before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0()); }
+		ruleEntityMockReferencedObjectAttribute
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__AttributeRefAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeFiller__FillerTypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); }
+		rulePropertyFillerType
+		{ after(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__AttributeRefAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0()); }
+		(
+			{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1()); }
+		)
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EntityMockAttributeByReference__OptionalForAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__StaticAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); }
+			'static'
+			{ after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ExtensionAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); }
+			'extension'
+			{ after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); }
+			ruleQualifiedNameInStaticImport
+			{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__WildcardAssignment_2_0_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); }
+			'*'
+			{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedTypeAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); }
+		ruleQualifiedNameWithWildcard
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__FqnImportAssignment_2_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); }
+			'ns'
+			{ after(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); }
+		ruleQualifiedName
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__AnnotationTypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); }
+		ruleXAnnotationElementValuePair
+		{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); }
+		ruleXAnnotationElementValuePair
+		{ after(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotation__ValueAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); }
+		ruleXAnnotationElementValueOrCommaList
+		{ after(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); }
+		(
+			{ before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); }
+			ruleValidID
+			{ after(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); }
+		)
+		{ after(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValuePair__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); }
+		ruleXAnnotationElementValue
+		{ after(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__ElementsAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); }
+		ruleXAnnotationOrExpression
+		{ after(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__FeatureAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); }
+		(
+			{ before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); }
+			ruleFeatureCallID
+			{ after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__ValueAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); }
+		ruleXAssignment
+		{ after(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__FeatureAssignment_1_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); }
+			ruleOpMultiAssign
+			{ after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAssignment__RightOperandAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); }
+		ruleXAssignment
+		{ after(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpOr
+			{ after(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOrExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); }
+		ruleXAndExpression
+		{ after(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpAnd
+			{ after(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAndExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); }
+		ruleXEqualityExpression
+		{ after(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpEquality
+			{ after(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XEqualityExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); }
+		ruleXRelationalExpression
+		{ after(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__TypeAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); }
+			ruleOpCompare
+			{ after(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XRelationalExpression__RightOperandAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); }
+		ruleXOtherOperatorExpression
+		{ after(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpOther
+			{ after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XOtherOperatorExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); }
+		ruleXAdditiveExpression
+		{ after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpAdd
+			{ after(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XAdditiveExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); }
+		ruleXMultiplicativeExpression
+		{ after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+		(
+			{ before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); }
+			ruleOpMulti
+			{ after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMultiplicativeExpression__RightOperandAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); }
+		ruleXUnaryOperation
+		{ after(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__FeatureAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); }
+		(
+			{ before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); }
+			ruleOpUnary
+			{ after(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XUnaryOperation__OperandAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); }
+		ruleXUnaryOperation
+		{ after(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCastedExpression__TypeAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XPostfixOperation__FeatureAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); }
+			ruleOpPostfix
+			{ after(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); }
+		)
+		{ after(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); }
+			'::'
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); }
+			ruleFeatureCallID
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__ValueAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); }
+		ruleXAssignment
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); }
+			'?.'
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); }
+			'::'
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__FeatureAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); }
+			ruleIdOrSuper
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); }
+		(
+			{ before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); }
+			'('
+			{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); }
+		)
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); }
+		ruleXShortClosure
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); }
+		ruleXClosure
+		{ after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__ElementsAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSetLiteral__ElementsAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__ElementsAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XListLiteral__ElementsAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__ExplicitSyntaxAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); }
+			'|'
+			{ after(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XClosure__ExpressionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); }
+		ruleXExpressionInClosure
+		{ after(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XExpressionInClosure__ExpressionsAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); }
+		ruleXExpressionOrVarDeclaration
+		{ after(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); }
+		(
+			{ before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); }
+			'|'
+			{ after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); }
+		)
+		{ after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XShortClosure__ExpressionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__IfAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__ThenAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XIfExpression__ElseAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__SwitchAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__SwitchAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__CasesAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); }
+		ruleXCasePart
+		{ after(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSwitchExpression__DefaultAssignment_5_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__TypeGuardAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__CaseAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__ThenAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCasePart__FallThroughAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); }
+		(
+			{ before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); }
+			','
+			{ after(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); }
+		)
+		{ after(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); }
+		ruleJvmFormalParameter
+		{ after(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__ForExpressionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XForLoopExpression__EachExpressionAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); }
+		ruleXExpressionOrVarDeclaration
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); }
+		ruleXExpressionOrVarDeclaration
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__ExpressionAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBasicForLoopExpression__EachExpressionAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__PredicateAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XWhileExpression__BodyAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__BodyAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XDoWhileExpression__PredicateAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBlockExpression__ExpressionsAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); }
+		ruleXExpressionOrVarDeclaration
+		{ after(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__WriteableAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); }
+		(
+			{ before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); }
+			'var'
+			{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); }
+		)
+		{ after(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__TypeAssignment_2_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__NameAssignment_2_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__NameAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XVariableDeclaration__RightAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmFormalParameter__ParameterTypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmFormalParameter__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FullJvmFormalParameter__ParameterTypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FullJvmFormalParameter__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__TypeArgumentsAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__FeatureAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); }
+			ruleIdOrSuper
+			{ after(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); }
+		(
+			{ before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); }
+			'('
+			{ after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); }
+		)
+		{ after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); }
+		ruleXShortClosure
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); }
+		ruleXClosure
+		{ after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ConstructorAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__TypeArgumentsAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); }
+		(
+			{ before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); }
+			'('
+			{ after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); }
+		)
+		{ after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ArgumentsAssignment_4_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); }
+		ruleXShortClosure
+		{ after(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XConstructorCall__ArgumentsAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); }
+		ruleXClosure
+		{ after(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XBooleanLiteral__IsTrueAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); }
+			'true'
+			{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XNumberLiteral__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); }
+		ruleNumber
+		{ after(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XStringLiteral__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__TypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTypeLiteral__ArrayDimensionsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); }
+		ruleArrayBrackets
+		{ after(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XThrowExpression__ExpressionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XReturnExpression__ExpressionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__ExpressionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); }
+		ruleXCatchClause
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__ParamAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XSynchronizedExpression__ExpressionAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__DeclaredParamAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); }
+		ruleFullJvmFormalParameter
+		{ after(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XCatchClause__ExpressionAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); }
+		ruleXExpression
+		{ after(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ReturnTypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__TypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); }
+		(
+			{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); }
+			ruleValidID
+			{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); }
+		)
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); }
+		ruleJvmUpperBound
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); }
+		ruleJvmUpperBoundAnded
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); }
+		ruleJvmLowerBound
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); }
+		ruleJvmLowerBoundAnded
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportSection__ImportDeclarationsAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); }
+		ruleXImportDeclaration
+		{ after(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+RULE_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;
+
+RULE_INT : '0'..'9' ('0'..'9'|'_')*;
+
+RULE_DECIMAL : RULE_INT (('e'|'E') ('+'|'-')? RULE_INT)? (('b'|'B') ('i'|'I'|'d'|'D')|('l'|'L'|'d'|'D'|'f'|'F'))?;
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'?|'\'' ('\\' .|~(('\\'|'\'')))* '\''?);
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.tokens b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.tokens
new file mode 100644
index 0000000..469f587
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSL.tokens
@@ -0,0 +1,297 @@
+'!'=41
+'!='=23
+'!=='=25
+'#'=124
+'%'=40
+'%='=21
+'&&'=15
+'&'=146
+'('=68
+')'=69
+'*'=37
+'**'=38
+'*='=19
+'+'=35
+'++'=42
+'+='=17
+','=70
+'-'=36
+'--'=43
+'-='=18
+'->'=29
+'.'=44
+'..'=31
+'..<'=30
+'/'=39
+'/='=20
+':'=130
+'::'=153
+';'=121
+'<'=28
+'<>'=33
+'='=13
+'=='=22
+'==='=24
+'=>'=32
+'>'=27
+'>='=26
+'?'=145
+'?.'=154
+'?:'=34
+'@'=122
+'['=125
+']'=123
+'as'=113
+'attributes'=67
+'basedOn'=81
+'boolean'=85
+'byEnum'=74
+'byObject'=115
+'calculateAs'=80
+'calculateOn'=116
+'case'=132
+'catch'=144
+'createBlobMapping'=148
+'datainterchange'=62
+'datainterchanges'=61
+'dateFrom'=111
+'dateRange'=86
+'days'=52
+'decimals'=90
+'default'=131
+'definedAs'=79
+'describedBy'=147
+'do'=135
+'else'=128
+'embed'=78
+'entities'=103
+'entity'=105
+'every'=112
+'existingEntities'=16
+'extends'=46
+'extension'=49
+'false'=51
+'file'=63
+'finally'=142
+'for'=133
+'from'=87
+'future'=83
+'if'=127
+'import'=48
+'instanceof'=126
+'integerFrom'=109
+'integerPick'=94
+'integerRange'=93
+'items'=66
+'iterate'=108
+'mock'=59
+'mocking'=104
+'months'=54
+'new'=136
+'ns'=152
+'null'=137
+'numberPick'=92
+'numberRange'=89
+'object'=72
+'objects'=71
+'optionalFor'=119
+'package'=56
+'paragraphs'=96
+'past'=84
+'percent'=120
+'priority'=60
+'randomize'=82
+'ref'=118
+'resource'=65
+'resources'=64
+'return'=140
+'roundTo'=91
+'rows'=106
+'sentences'=97
+'static'=47
+'step'=110
+'super'=50
+'switch'=129
+'switchOn'=76
+'synchronized'=143
+'template'=114
+'textPick'=95
+'throw'=139
+'to'=107
+'today'=150
+'tomorrow'=151
+'true'=156
+'try'=141
+'typeof'=138
+'unsignedIntegerPick'=102
+'unsignedIntegerRange'=101
+'unsignedNumberPick'=100
+'unsignedNumberRange'=99
+'until'=88
+'using'=117
+'val'=45
+'var'=73
+'weeks'=53
+'when'=77
+'while'=134
+'with'=75
+'words'=98
+'years'=55
+'yesterday'=149
+'{'=57
+'|'=155
+'||'=14
+'}'=58
+RULE_ANY_OTHER=12
+RULE_DECIMAL=7
+RULE_HEX=5
+RULE_ID=4
+RULE_INT=6
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=8
+RULE_WS=11
+T__100=100
+T__101=101
+T__102=102
+T__103=103
+T__104=104
+T__105=105
+T__106=106
+T__107=107
+T__108=108
+T__109=109
+T__110=110
+T__111=111
+T__112=112
+T__113=113
+T__114=114
+T__115=115
+T__116=116
+T__117=117
+T__118=118
+T__119=119
+T__120=120
+T__121=121
+T__122=122
+T__123=123
+T__124=124
+T__125=125
+T__126=126
+T__127=127
+T__128=128
+T__129=129
+T__130=130
+T__131=131
+T__132=132
+T__133=133
+T__134=134
+T__135=135
+T__136=136
+T__137=137
+T__138=138
+T__139=139
+T__13=13
+T__140=140
+T__141=141
+T__142=142
+T__143=143
+T__144=144
+T__145=145
+T__146=146
+T__147=147
+T__148=148
+T__149=149
+T__14=14
+T__150=150
+T__151=151
+T__152=152
+T__153=153
+T__154=154
+T__155=155
+T__156=156
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
+T__22=22
+T__23=23
+T__24=24
+T__25=25
+T__26=26
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
+T__80=80
+T__81=81
+T__82=82
+T__83=83
+T__84=84
+T__85=85
+T__86=86
+T__87=87
+T__88=88
+T__89=89
+T__90=90
+T__91=91
+T__92=92
+T__93=93
+T__94=94
+T__95=95
+T__96=96
+T__97=97
+T__98=98
+T__99=99
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLLexer.java b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLLexer.java
new file mode 100644
index 0000000..081b86b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLLexer.java
@@ -0,0 +1,5960 @@
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalEntityMockDSLLexer extends Lexer {
+    public static final int T__144=144;
+    public static final int T__143=143;
+    public static final int T__146=146;
+    public static final int RULE_HEX=5;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__140=140;
+    public static final int T__142=142;
+    public static final int T__141=141;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__133=133;
+    public static final int T__132=132;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__130=130;
+    public static final int RULE_INT=6;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__30=30;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__91=91;
+    public static final int T__100=100;
+    public static final int T__92=92;
+    public static final int T__93=93;
+    public static final int T__102=102;
+    public static final int T__94=94;
+    public static final int T__101=101;
+    public static final int T__90=90;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__99=99;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int RULE_DECIMAL=7;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__23=23;
+    public static final int T__24=24;
+    public static final int T__25=25;
+    public static final int T__20=20;
+    public static final int T__21=21;
+    public static final int T__122=122;
+    public static final int T__70=70;
+    public static final int T__121=121;
+    public static final int T__71=71;
+    public static final int T__124=124;
+    public static final int T__72=72;
+    public static final int T__123=123;
+    public static final int T__120=120;
+    public static final int RULE_STRING=8;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__77=77;
+    public static final int T__119=119;
+    public static final int T__78=78;
+    public static final int T__118=118;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__115=115;
+    public static final int EOF=-1;
+    public static final int T__74=74;
+    public static final int T__114=114;
+    public static final int T__75=75;
+    public static final int T__117=117;
+    public static final int T__76=76;
+    public static final int T__116=116;
+    public static final int T__80=80;
+    public static final int T__111=111;
+    public static final int T__81=81;
+    public static final int T__110=110;
+    public static final int T__82=82;
+    public static final int T__113=113;
+    public static final int T__83=83;
+    public static final int T__112=112;
+    public static final int RULE_WS=11;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__108=108;
+    public static final int T__89=89;
+    public static final int T__107=107;
+    public static final int T__109=109;
+    public static final int T__84=84;
+    public static final int T__104=104;
+    public static final int T__85=85;
+    public static final int T__103=103;
+    public static final int T__86=86;
+    public static final int T__106=106;
+    public static final int T__87=87;
+    public static final int T__105=105;
+
+    // delegates
+    // delegators
+
+    public InternalEntityMockDSLLexer() {;} 
+    public InternalEntityMockDSLLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalEntityMockDSLLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalEntityMockDSL.g"; }
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:11:7: ( '=' )
+            // InternalEntityMockDSL.g:11:9: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:12:7: ( '||' )
+            // InternalEntityMockDSL.g:12:9: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:13:7: ( '&&' )
+            // InternalEntityMockDSL.g:13:9: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:14:7: ( 'existingEntities' )
+            // InternalEntityMockDSL.g:14:9: 'existingEntities'
+            {
+            match("existingEntities"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:15:7: ( '+=' )
+            // InternalEntityMockDSL.g:15:9: '+='
+            {
+            match("+="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:16:7: ( '-=' )
+            // InternalEntityMockDSL.g:16:9: '-='
+            {
+            match("-="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:17:7: ( '*=' )
+            // InternalEntityMockDSL.g:17:9: '*='
+            {
+            match("*="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:18:7: ( '/=' )
+            // InternalEntityMockDSL.g:18:9: '/='
+            {
+            match("/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:19:7: ( '%=' )
+            // InternalEntityMockDSL.g:19:9: '%='
+            {
+            match("%="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:20:7: ( '==' )
+            // InternalEntityMockDSL.g:20:9: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:21:7: ( '!=' )
+            // InternalEntityMockDSL.g:21:9: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:22:7: ( '===' )
+            // InternalEntityMockDSL.g:22:9: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:23:7: ( '!==' )
+            // InternalEntityMockDSL.g:23:9: '!=='
+            {
+            match("!=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:24:7: ( '>=' )
+            // InternalEntityMockDSL.g:24:9: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:25:7: ( '>' )
+            // InternalEntityMockDSL.g:25:9: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:26:7: ( '<' )
+            // InternalEntityMockDSL.g:26:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:27:7: ( '->' )
+            // InternalEntityMockDSL.g:27:9: '->'
+            {
+            match("->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:28:7: ( '..<' )
+            // InternalEntityMockDSL.g:28:9: '..<'
+            {
+            match("..<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:29:7: ( '..' )
+            // InternalEntityMockDSL.g:29:9: '..'
+            {
+            match(".."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:30:7: ( '=>' )
+            // InternalEntityMockDSL.g:30:9: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31:7: ( '<>' )
+            // InternalEntityMockDSL.g:31:9: '<>'
+            {
+            match("<>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:32:7: ( '?:' )
+            // InternalEntityMockDSL.g:32:9: '?:'
+            {
+            match("?:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:33:7: ( '+' )
+            // InternalEntityMockDSL.g:33:9: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:34:7: ( '-' )
+            // InternalEntityMockDSL.g:34:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:35:7: ( '*' )
+            // InternalEntityMockDSL.g:35:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:36:7: ( '**' )
+            // InternalEntityMockDSL.g:36:9: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:37:7: ( '/' )
+            // InternalEntityMockDSL.g:37:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:38:7: ( '%' )
+            // InternalEntityMockDSL.g:38:9: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:39:7: ( '!' )
+            // InternalEntityMockDSL.g:39:9: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:40:7: ( '++' )
+            // InternalEntityMockDSL.g:40:9: '++'
+            {
+            match("++"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:41:7: ( '--' )
+            // InternalEntityMockDSL.g:41:9: '--'
+            {
+            match("--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:42:7: ( '.' )
+            // InternalEntityMockDSL.g:42:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:43:7: ( 'val' )
+            // InternalEntityMockDSL.g:43:9: 'val'
+            {
+            match("val"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:44:7: ( 'extends' )
+            // InternalEntityMockDSL.g:44:9: 'extends'
+            {
+            match("extends"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:45:7: ( 'static' )
+            // InternalEntityMockDSL.g:45:9: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:46:7: ( 'import' )
+            // InternalEntityMockDSL.g:46:9: 'import'
+            {
+            match("import"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:47:7: ( 'extension' )
+            // InternalEntityMockDSL.g:47:9: 'extension'
+            {
+            match("extension"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:48:7: ( 'super' )
+            // InternalEntityMockDSL.g:48:9: 'super'
+            {
+            match("super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:49:7: ( 'false' )
+            // InternalEntityMockDSL.g:49:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__51"
+
+    // $ANTLR start "T__52"
+    public final void mT__52() throws RecognitionException {
+        try {
+            int _type = T__52;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:50:7: ( 'days' )
+            // InternalEntityMockDSL.g:50:9: 'days'
+            {
+            match("days"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:51:7: ( 'weeks' )
+            // InternalEntityMockDSL.g:51:9: 'weeks'
+            {
+            match("weeks"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:52:7: ( 'months' )
+            // InternalEntityMockDSL.g:52:9: 'months'
+            {
+            match("months"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:53:7: ( 'years' )
+            // InternalEntityMockDSL.g:53:9: 'years'
+            {
+            match("years"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:54:7: ( 'package' )
+            // InternalEntityMockDSL.g:54:9: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:55:7: ( '{' )
+            // InternalEntityMockDSL.g:55:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:56:7: ( '}' )
+            // InternalEntityMockDSL.g:56:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:57:7: ( 'mock' )
+            // InternalEntityMockDSL.g:57:9: 'mock'
+            {
+            match("mock"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__59"
+
+    // $ANTLR start "T__60"
+    public final void mT__60() throws RecognitionException {
+        try {
+            int _type = T__60;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:58:7: ( 'priority' )
+            // InternalEntityMockDSL.g:58:9: 'priority'
+            {
+            match("priority"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:59:7: ( 'datainterchanges' )
+            // InternalEntityMockDSL.g:59:9: 'datainterchanges'
+            {
+            match("datainterchanges"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__61"
+
+    // $ANTLR start "T__62"
+    public final void mT__62() throws RecognitionException {
+        try {
+            int _type = T__62;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:60:7: ( 'datainterchange' )
+            // InternalEntityMockDSL.g:60:9: 'datainterchange'
+            {
+            match("datainterchange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:61:7: ( 'file' )
+            // InternalEntityMockDSL.g:61:9: 'file'
+            {
+            match("file"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__63"
+
+    // $ANTLR start "T__64"
+    public final void mT__64() throws RecognitionException {
+        try {
+            int _type = T__64;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:62:7: ( 'resources' )
+            // InternalEntityMockDSL.g:62:9: 'resources'
+            {
+            match("resources"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:63:7: ( 'resource' )
+            // InternalEntityMockDSL.g:63:9: 'resource'
+            {
+            match("resource"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:64:7: ( 'items' )
+            // InternalEntityMockDSL.g:64:9: 'items'
+            {
+            match("items"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:65:7: ( 'attributes' )
+            // InternalEntityMockDSL.g:65:9: 'attributes'
+            {
+            match("attributes"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__67"
+
+    // $ANTLR start "T__68"
+    public final void mT__68() throws RecognitionException {
+        try {
+            int _type = T__68;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:66:7: ( '(' )
+            // InternalEntityMockDSL.g:66:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:67:7: ( ')' )
+            // InternalEntityMockDSL.g:67:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:68:7: ( ',' )
+            // InternalEntityMockDSL.g:68:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:69:7: ( 'objects' )
+            // InternalEntityMockDSL.g:69:9: 'objects'
+            {
+            match("objects"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:70:7: ( 'object' )
+            // InternalEntityMockDSL.g:70:9: 'object'
+            {
+            match("object"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:71:7: ( 'var' )
+            // InternalEntityMockDSL.g:71:9: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:72:7: ( 'byEnum' )
+            // InternalEntityMockDSL.g:72:9: 'byEnum'
+            {
+            match("byEnum"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:73:7: ( 'with' )
+            // InternalEntityMockDSL.g:73:9: 'with'
+            {
+            match("with"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:74:7: ( 'switchOn' )
+            // InternalEntityMockDSL.g:74:9: 'switchOn'
+            {
+            match("switchOn"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:75:7: ( 'when' )
+            // InternalEntityMockDSL.g:75:9: 'when'
+            {
+            match("when"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:76:7: ( 'embed' )
+            // InternalEntityMockDSL.g:76:9: 'embed'
+            {
+            match("embed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:77:7: ( 'definedAs' )
+            // InternalEntityMockDSL.g:77:9: 'definedAs'
+            {
+            match("definedAs"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "T__80"
+    public final void mT__80() throws RecognitionException {
+        try {
+            int _type = T__80;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:78:7: ( 'calculateAs' )
+            // InternalEntityMockDSL.g:78:9: 'calculateAs'
+            {
+            match("calculateAs"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__80"
+
+    // $ANTLR start "T__81"
+    public final void mT__81() throws RecognitionException {
+        try {
+            int _type = T__81;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:79:7: ( 'basedOn' )
+            // InternalEntityMockDSL.g:79:9: 'basedOn'
+            {
+            match("basedOn"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__81"
+
+    // $ANTLR start "T__82"
+    public final void mT__82() throws RecognitionException {
+        try {
+            int _type = T__82;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:80:7: ( 'randomize' )
+            // InternalEntityMockDSL.g:80:9: 'randomize'
+            {
+            match("randomize"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__82"
+
+    // $ANTLR start "T__83"
+    public final void mT__83() throws RecognitionException {
+        try {
+            int _type = T__83;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:81:7: ( 'future' )
+            // InternalEntityMockDSL.g:81:9: 'future'
+            {
+            match("future"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__83"
+
+    // $ANTLR start "T__84"
+    public final void mT__84() throws RecognitionException {
+        try {
+            int _type = T__84;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:82:7: ( 'past' )
+            // InternalEntityMockDSL.g:82:9: 'past'
+            {
+            match("past"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__84"
+
+    // $ANTLR start "T__85"
+    public final void mT__85() throws RecognitionException {
+        try {
+            int _type = T__85;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:83:7: ( 'boolean' )
+            // InternalEntityMockDSL.g:83:9: 'boolean'
+            {
+            match("boolean"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__85"
+
+    // $ANTLR start "T__86"
+    public final void mT__86() throws RecognitionException {
+        try {
+            int _type = T__86;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:84:7: ( 'dateRange' )
+            // InternalEntityMockDSL.g:84:9: 'dateRange'
+            {
+            match("dateRange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__86"
+
+    // $ANTLR start "T__87"
+    public final void mT__87() throws RecognitionException {
+        try {
+            int _type = T__87;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:85:7: ( 'from' )
+            // InternalEntityMockDSL.g:85:9: 'from'
+            {
+            match("from"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__87"
+
+    // $ANTLR start "T__88"
+    public final void mT__88() throws RecognitionException {
+        try {
+            int _type = T__88;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:86:7: ( 'until' )
+            // InternalEntityMockDSL.g:86:9: 'until'
+            {
+            match("until"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__88"
+
+    // $ANTLR start "T__89"
+    public final void mT__89() throws RecognitionException {
+        try {
+            int _type = T__89;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:87:7: ( 'numberRange' )
+            // InternalEntityMockDSL.g:87:9: 'numberRange'
+            {
+            match("numberRange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__89"
+
+    // $ANTLR start "T__90"
+    public final void mT__90() throws RecognitionException {
+        try {
+            int _type = T__90;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:88:7: ( 'decimals' )
+            // InternalEntityMockDSL.g:88:9: 'decimals'
+            {
+            match("decimals"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__90"
+
+    // $ANTLR start "T__91"
+    public final void mT__91() throws RecognitionException {
+        try {
+            int _type = T__91;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:89:7: ( 'roundTo' )
+            // InternalEntityMockDSL.g:89:9: 'roundTo'
+            {
+            match("roundTo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__91"
+
+    // $ANTLR start "T__92"
+    public final void mT__92() throws RecognitionException {
+        try {
+            int _type = T__92;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:90:7: ( 'numberPick' )
+            // InternalEntityMockDSL.g:90:9: 'numberPick'
+            {
+            match("numberPick"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__92"
+
+    // $ANTLR start "T__93"
+    public final void mT__93() throws RecognitionException {
+        try {
+            int _type = T__93;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:91:7: ( 'integerRange' )
+            // InternalEntityMockDSL.g:91:9: 'integerRange'
+            {
+            match("integerRange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__93"
+
+    // $ANTLR start "T__94"
+    public final void mT__94() throws RecognitionException {
+        try {
+            int _type = T__94;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:92:7: ( 'integerPick' )
+            // InternalEntityMockDSL.g:92:9: 'integerPick'
+            {
+            match("integerPick"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__94"
+
+    // $ANTLR start "T__95"
+    public final void mT__95() throws RecognitionException {
+        try {
+            int _type = T__95;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:93:7: ( 'textPick' )
+            // InternalEntityMockDSL.g:93:9: 'textPick'
+            {
+            match("textPick"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__95"
+
+    // $ANTLR start "T__96"
+    public final void mT__96() throws RecognitionException {
+        try {
+            int _type = T__96;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:94:7: ( 'paragraphs' )
+            // InternalEntityMockDSL.g:94:9: 'paragraphs'
+            {
+            match("paragraphs"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__96"
+
+    // $ANTLR start "T__97"
+    public final void mT__97() throws RecognitionException {
+        try {
+            int _type = T__97;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:95:7: ( 'sentences' )
+            // InternalEntityMockDSL.g:95:9: 'sentences'
+            {
+            match("sentences"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__97"
+
+    // $ANTLR start "T__98"
+    public final void mT__98() throws RecognitionException {
+        try {
+            int _type = T__98;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:96:7: ( 'words' )
+            // InternalEntityMockDSL.g:96:9: 'words'
+            {
+            match("words"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__98"
+
+    // $ANTLR start "T__99"
+    public final void mT__99() throws RecognitionException {
+        try {
+            int _type = T__99;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:97:7: ( 'unsignedNumberRange' )
+            // InternalEntityMockDSL.g:97:9: 'unsignedNumberRange'
+            {
+            match("unsignedNumberRange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__99"
+
+    // $ANTLR start "T__100"
+    public final void mT__100() throws RecognitionException {
+        try {
+            int _type = T__100;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:98:8: ( 'unsignedNumberPick' )
+            // InternalEntityMockDSL.g:98:10: 'unsignedNumberPick'
+            {
+            match("unsignedNumberPick"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__100"
+
+    // $ANTLR start "T__101"
+    public final void mT__101() throws RecognitionException {
+        try {
+            int _type = T__101;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:99:8: ( 'unsignedIntegerRange' )
+            // InternalEntityMockDSL.g:99:10: 'unsignedIntegerRange'
+            {
+            match("unsignedIntegerRange"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__101"
+
+    // $ANTLR start "T__102"
+    public final void mT__102() throws RecognitionException {
+        try {
+            int _type = T__102;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:100:8: ( 'unsignedIntegerPick' )
+            // InternalEntityMockDSL.g:100:10: 'unsignedIntegerPick'
+            {
+            match("unsignedIntegerPick"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__102"
+
+    // $ANTLR start "T__103"
+    public final void mT__103() throws RecognitionException {
+        try {
+            int _type = T__103;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:101:8: ( 'entities' )
+            // InternalEntityMockDSL.g:101:10: 'entities'
+            {
+            match("entities"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__103"
+
+    // $ANTLR start "T__104"
+    public final void mT__104() throws RecognitionException {
+        try {
+            int _type = T__104;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:102:8: ( 'mocking' )
+            // InternalEntityMockDSL.g:102:10: 'mocking'
+            {
+            match("mocking"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__104"
+
+    // $ANTLR start "T__105"
+    public final void mT__105() throws RecognitionException {
+        try {
+            int _type = T__105;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:103:8: ( 'entity' )
+            // InternalEntityMockDSL.g:103:10: 'entity'
+            {
+            match("entity"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__105"
+
+    // $ANTLR start "T__106"
+    public final void mT__106() throws RecognitionException {
+        try {
+            int _type = T__106;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:104:8: ( 'rows' )
+            // InternalEntityMockDSL.g:104:10: 'rows'
+            {
+            match("rows"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__106"
+
+    // $ANTLR start "T__107"
+    public final void mT__107() throws RecognitionException {
+        try {
+            int _type = T__107;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:105:8: ( 'to' )
+            // InternalEntityMockDSL.g:105:10: 'to'
+            {
+            match("to"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__107"
+
+    // $ANTLR start "T__108"
+    public final void mT__108() throws RecognitionException {
+        try {
+            int _type = T__108;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:106:8: ( 'iterate' )
+            // InternalEntityMockDSL.g:106:10: 'iterate'
+            {
+            match("iterate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__108"
+
+    // $ANTLR start "T__109"
+    public final void mT__109() throws RecognitionException {
+        try {
+            int _type = T__109;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:107:8: ( 'integerFrom' )
+            // InternalEntityMockDSL.g:107:10: 'integerFrom'
+            {
+            match("integerFrom"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__109"
+
+    // $ANTLR start "T__110"
+    public final void mT__110() throws RecognitionException {
+        try {
+            int _type = T__110;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:108:8: ( 'step' )
+            // InternalEntityMockDSL.g:108:10: 'step'
+            {
+            match("step"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__110"
+
+    // $ANTLR start "T__111"
+    public final void mT__111() throws RecognitionException {
+        try {
+            int _type = T__111;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:109:8: ( 'dateFrom' )
+            // InternalEntityMockDSL.g:109:10: 'dateFrom'
+            {
+            match("dateFrom"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__111"
+
+    // $ANTLR start "T__112"
+    public final void mT__112() throws RecognitionException {
+        try {
+            int _type = T__112;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:110:8: ( 'every' )
+            // InternalEntityMockDSL.g:110:10: 'every'
+            {
+            match("every"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__112"
+
+    // $ANTLR start "T__113"
+    public final void mT__113() throws RecognitionException {
+        try {
+            int _type = T__113;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:111:8: ( 'as' )
+            // InternalEntityMockDSL.g:111:10: 'as'
+            {
+            match("as"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__113"
+
+    // $ANTLR start "T__114"
+    public final void mT__114() throws RecognitionException {
+        try {
+            int _type = T__114;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:112:8: ( 'template' )
+            // InternalEntityMockDSL.g:112:10: 'template'
+            {
+            match("template"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__114"
+
+    // $ANTLR start "T__115"
+    public final void mT__115() throws RecognitionException {
+        try {
+            int _type = T__115;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:113:8: ( 'byObject' )
+            // InternalEntityMockDSL.g:113:10: 'byObject'
+            {
+            match("byObject"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__115"
+
+    // $ANTLR start "T__116"
+    public final void mT__116() throws RecognitionException {
+        try {
+            int _type = T__116;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:114:8: ( 'calculateOn' )
+            // InternalEntityMockDSL.g:114:10: 'calculateOn'
+            {
+            match("calculateOn"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__116"
+
+    // $ANTLR start "T__117"
+    public final void mT__117() throws RecognitionException {
+        try {
+            int _type = T__117;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:115:8: ( 'using' )
+            // InternalEntityMockDSL.g:115:10: 'using'
+            {
+            match("using"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__117"
+
+    // $ANTLR start "T__118"
+    public final void mT__118() throws RecognitionException {
+        try {
+            int _type = T__118;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:116:8: ( 'ref' )
+            // InternalEntityMockDSL.g:116:10: 'ref'
+            {
+            match("ref"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__118"
+
+    // $ANTLR start "T__119"
+    public final void mT__119() throws RecognitionException {
+        try {
+            int _type = T__119;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:117:8: ( 'optionalFor' )
+            // InternalEntityMockDSL.g:117:10: 'optionalFor'
+            {
+            match("optionalFor"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__119"
+
+    // $ANTLR start "T__120"
+    public final void mT__120() throws RecognitionException {
+        try {
+            int _type = T__120;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:118:8: ( 'percent' )
+            // InternalEntityMockDSL.g:118:10: 'percent'
+            {
+            match("percent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__120"
+
+    // $ANTLR start "T__121"
+    public final void mT__121() throws RecognitionException {
+        try {
+            int _type = T__121;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:119:8: ( ';' )
+            // InternalEntityMockDSL.g:119:10: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__121"
+
+    // $ANTLR start "T__122"
+    public final void mT__122() throws RecognitionException {
+        try {
+            int _type = T__122;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:120:8: ( '@' )
+            // InternalEntityMockDSL.g:120:10: '@'
+            {
+            match('@'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__122"
+
+    // $ANTLR start "T__123"
+    public final void mT__123() throws RecognitionException {
+        try {
+            int _type = T__123;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:121:8: ( ']' )
+            // InternalEntityMockDSL.g:121:10: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__123"
+
+    // $ANTLR start "T__124"
+    public final void mT__124() throws RecognitionException {
+        try {
+            int _type = T__124;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:122:8: ( '#' )
+            // InternalEntityMockDSL.g:122:10: '#'
+            {
+            match('#'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__124"
+
+    // $ANTLR start "T__125"
+    public final void mT__125() throws RecognitionException {
+        try {
+            int _type = T__125;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:123:8: ( '[' )
+            // InternalEntityMockDSL.g:123:10: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__125"
+
+    // $ANTLR start "T__126"
+    public final void mT__126() throws RecognitionException {
+        try {
+            int _type = T__126;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:124:8: ( 'instanceof' )
+            // InternalEntityMockDSL.g:124:10: 'instanceof'
+            {
+            match("instanceof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__126"
+
+    // $ANTLR start "T__127"
+    public final void mT__127() throws RecognitionException {
+        try {
+            int _type = T__127;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:125:8: ( 'if' )
+            // InternalEntityMockDSL.g:125:10: 'if'
+            {
+            match("if"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__127"
+
+    // $ANTLR start "T__128"
+    public final void mT__128() throws RecognitionException {
+        try {
+            int _type = T__128;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:126:8: ( 'else' )
+            // InternalEntityMockDSL.g:126:10: 'else'
+            {
+            match("else"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__128"
+
+    // $ANTLR start "T__129"
+    public final void mT__129() throws RecognitionException {
+        try {
+            int _type = T__129;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:127:8: ( 'switch' )
+            // InternalEntityMockDSL.g:127:10: 'switch'
+            {
+            match("switch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__129"
+
+    // $ANTLR start "T__130"
+    public final void mT__130() throws RecognitionException {
+        try {
+            int _type = T__130;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:128:8: ( ':' )
+            // InternalEntityMockDSL.g:128:10: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__130"
+
+    // $ANTLR start "T__131"
+    public final void mT__131() throws RecognitionException {
+        try {
+            int _type = T__131;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:129:8: ( 'default' )
+            // InternalEntityMockDSL.g:129:10: 'default'
+            {
+            match("default"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__131"
+
+    // $ANTLR start "T__132"
+    public final void mT__132() throws RecognitionException {
+        try {
+            int _type = T__132;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:130:8: ( 'case' )
+            // InternalEntityMockDSL.g:130:10: 'case'
+            {
+            match("case"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__132"
+
+    // $ANTLR start "T__133"
+    public final void mT__133() throws RecognitionException {
+        try {
+            int _type = T__133;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:131:8: ( 'for' )
+            // InternalEntityMockDSL.g:131:10: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__133"
+
+    // $ANTLR start "T__134"
+    public final void mT__134() throws RecognitionException {
+        try {
+            int _type = T__134;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:132:8: ( 'while' )
+            // InternalEntityMockDSL.g:132:10: 'while'
+            {
+            match("while"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__134"
+
+    // $ANTLR start "T__135"
+    public final void mT__135() throws RecognitionException {
+        try {
+            int _type = T__135;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:133:8: ( 'do' )
+            // InternalEntityMockDSL.g:133:10: 'do'
+            {
+            match("do"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__135"
+
+    // $ANTLR start "T__136"
+    public final void mT__136() throws RecognitionException {
+        try {
+            int _type = T__136;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:134:8: ( 'new' )
+            // InternalEntityMockDSL.g:134:10: 'new'
+            {
+            match("new"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__136"
+
+    // $ANTLR start "T__137"
+    public final void mT__137() throws RecognitionException {
+        try {
+            int _type = T__137;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:135:8: ( 'null' )
+            // InternalEntityMockDSL.g:135:10: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__137"
+
+    // $ANTLR start "T__138"
+    public final void mT__138() throws RecognitionException {
+        try {
+            int _type = T__138;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:136:8: ( 'typeof' )
+            // InternalEntityMockDSL.g:136:10: 'typeof'
+            {
+            match("typeof"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__138"
+
+    // $ANTLR start "T__139"
+    public final void mT__139() throws RecognitionException {
+        try {
+            int _type = T__139;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:137:8: ( 'throw' )
+            // InternalEntityMockDSL.g:137:10: 'throw'
+            {
+            match("throw"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__139"
+
+    // $ANTLR start "T__140"
+    public final void mT__140() throws RecognitionException {
+        try {
+            int _type = T__140;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:138:8: ( 'return' )
+            // InternalEntityMockDSL.g:138:10: 'return'
+            {
+            match("return"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__140"
+
+    // $ANTLR start "T__141"
+    public final void mT__141() throws RecognitionException {
+        try {
+            int _type = T__141;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:139:8: ( 'try' )
+            // InternalEntityMockDSL.g:139:10: 'try'
+            {
+            match("try"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__141"
+
+    // $ANTLR start "T__142"
+    public final void mT__142() throws RecognitionException {
+        try {
+            int _type = T__142;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:140:8: ( 'finally' )
+            // InternalEntityMockDSL.g:140:10: 'finally'
+            {
+            match("finally"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__142"
+
+    // $ANTLR start "T__143"
+    public final void mT__143() throws RecognitionException {
+        try {
+            int _type = T__143;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:141:8: ( 'synchronized' )
+            // InternalEntityMockDSL.g:141:10: 'synchronized'
+            {
+            match("synchronized"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__143"
+
+    // $ANTLR start "T__144"
+    public final void mT__144() throws RecognitionException {
+        try {
+            int _type = T__144;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:142:8: ( 'catch' )
+            // InternalEntityMockDSL.g:142:10: 'catch'
+            {
+            match("catch"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__144"
+
+    // $ANTLR start "T__145"
+    public final void mT__145() throws RecognitionException {
+        try {
+            int _type = T__145;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:143:8: ( '?' )
+            // InternalEntityMockDSL.g:143:10: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__145"
+
+    // $ANTLR start "T__146"
+    public final void mT__146() throws RecognitionException {
+        try {
+            int _type = T__146;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:144:8: ( '&' )
+            // InternalEntityMockDSL.g:144:10: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__146"
+
+    // $ANTLR start "T__147"
+    public final void mT__147() throws RecognitionException {
+        try {
+            int _type = T__147;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:145:8: ( 'describedBy' )
+            // InternalEntityMockDSL.g:145:10: 'describedBy'
+            {
+            match("describedBy"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__147"
+
+    // $ANTLR start "T__148"
+    public final void mT__148() throws RecognitionException {
+        try {
+            int _type = T__148;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:146:8: ( 'createBlobMapping' )
+            // InternalEntityMockDSL.g:146:10: 'createBlobMapping'
+            {
+            match("createBlobMapping"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__148"
+
+    // $ANTLR start "T__149"
+    public final void mT__149() throws RecognitionException {
+        try {
+            int _type = T__149;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:147:8: ( 'yesterday' )
+            // InternalEntityMockDSL.g:147:10: 'yesterday'
+            {
+            match("yesterday"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__149"
+
+    // $ANTLR start "T__150"
+    public final void mT__150() throws RecognitionException {
+        try {
+            int _type = T__150;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:148:8: ( 'today' )
+            // InternalEntityMockDSL.g:148:10: 'today'
+            {
+            match("today"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__150"
+
+    // $ANTLR start "T__151"
+    public final void mT__151() throws RecognitionException {
+        try {
+            int _type = T__151;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:149:8: ( 'tomorrow' )
+            // InternalEntityMockDSL.g:149:10: 'tomorrow'
+            {
+            match("tomorrow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__151"
+
+    // $ANTLR start "T__152"
+    public final void mT__152() throws RecognitionException {
+        try {
+            int _type = T__152;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:150:8: ( 'ns' )
+            // InternalEntityMockDSL.g:150:10: 'ns'
+            {
+            match("ns"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__152"
+
+    // $ANTLR start "T__153"
+    public final void mT__153() throws RecognitionException {
+        try {
+            int _type = T__153;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:151:8: ( '::' )
+            // InternalEntityMockDSL.g:151:10: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__153"
+
+    // $ANTLR start "T__154"
+    public final void mT__154() throws RecognitionException {
+        try {
+            int _type = T__154;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:152:8: ( '?.' )
+            // InternalEntityMockDSL.g:152:10: '?.'
+            {
+            match("?."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__154"
+
+    // $ANTLR start "T__155"
+    public final void mT__155() throws RecognitionException {
+        try {
+            int _type = T__155;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:153:8: ( '|' )
+            // InternalEntityMockDSL.g:153:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__155"
+
+    // $ANTLR start "T__156"
+    public final void mT__156() throws RecognitionException {
+        try {
+            int _type = T__156;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:154:8: ( 'true' )
+            // InternalEntityMockDSL.g:154:10: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__156"
+
+    // $ANTLR start "RULE_HEX"
+    public final void mRULE_HEX() throws RecognitionException {
+        try {
+            int _type = RULE_HEX;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31921:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalEntityMockDSL.g:31921:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            {
+            // InternalEntityMockDSL.g:31921:12: ( '0x' | '0X' )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='0') ) {
+                int LA1_1 = input.LA(2);
+
+                if ( (LA1_1=='x') ) {
+                    alt1=1;
+                }
+                else if ( (LA1_1=='X') ) {
+                    alt1=2;
+                }
+                else {
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 1, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31921:13: '0x'
+                    {
+                    match("0x"); 
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:31921:18: '0X'
+                    {
+                    match("0X"); 
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:31921:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            int cnt2=0;
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='F')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='f')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='f') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt2 >= 1 ) break loop2;
+                        EarlyExitException eee =
+                            new EarlyExitException(2, input);
+                        throw eee;
+                }
+                cnt2++;
+            } while (true);
+
+            // InternalEntityMockDSL.g:31921:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0=='#') ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31921:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    {
+                    match('#'); 
+                    // InternalEntityMockDSL.g:31921:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    int alt3=2;
+                    int LA3_0 = input.LA(1);
+
+                    if ( (LA3_0=='B'||LA3_0=='b') ) {
+                        alt3=1;
+                    }
+                    else if ( (LA3_0=='L'||LA3_0=='l') ) {
+                        alt3=2;
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 3, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt3) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:31921:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            {
+                            if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+                            if ( input.LA(1)=='I'||input.LA(1)=='i' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:31921:84: ( 'l' | 'L' )
+                            {
+                            if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_HEX"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31923:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalEntityMockDSL.g:31923:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            {
+            matchRange('0','9'); 
+            // InternalEntityMockDSL.g:31923:21: ( '0' .. '9' | '_' )*
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( ((LA5_0>='0' && LA5_0<='9')||LA5_0=='_') ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_DECIMAL"
+    public final void mRULE_DECIMAL() throws RecognitionException {
+        try {
+            int _type = RULE_DECIMAL;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31925:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalEntityMockDSL.g:31925:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            {
+            mRULE_INT(); 
+            // InternalEntityMockDSL.g:31925:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='E'||LA7_0=='e') ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31925:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    {
+                    if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    // InternalEntityMockDSL.g:31925:36: ( '+' | '-' )?
+                    int alt6=2;
+                    int LA6_0 = input.LA(1);
+
+                    if ( (LA6_0=='+'||LA6_0=='-') ) {
+                        alt6=1;
+                    }
+                    switch (alt6) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:
+                            {
+                            if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
+                                input.consume();
+
+                            }
+                            else {
+                                MismatchedSetException mse = new MismatchedSetException(null,input);
+                                recover(mse);
+                                throw mse;}
+
+
+                            }
+                            break;
+
+                    }
+
+                    mRULE_INT(); 
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:31925:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            int alt8=3;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0=='B'||LA8_0=='b') ) {
+                alt8=1;
+            }
+            else if ( (LA8_0=='D'||LA8_0=='F'||LA8_0=='L'||LA8_0=='d'||LA8_0=='f'||LA8_0=='l') ) {
+                alt8=2;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31925:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    {
+                    if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+                    if ( input.LA(1)=='D'||input.LA(1)=='I'||input.LA(1)=='d'||input.LA(1)=='i' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:31925:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    {
+                    if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
+                        input.consume();
+
+                    }
+                    else {
+                        MismatchedSetException mse = new MismatchedSetException(null,input);
+                        recover(mse);
+                        throw mse;}
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_DECIMAL"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31927:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalEntityMockDSL.g:31927:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // InternalEntityMockDSL.g:31927:11: ( '^' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0=='^') ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31927:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalEntityMockDSL.g:31927:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( (LA10_0=='$'||(LA10_0>='0' && LA10_0<='9')||(LA10_0>='A' && LA10_0<='Z')||LA10_0=='_'||(LA10_0>='a' && LA10_0<='z')) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop10;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31929:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalEntityMockDSL.g:31929:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // InternalEntityMockDSL.g:31929:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0=='\"') ) {
+                alt15=1;
+            }
+            else if ( (LA15_0=='\'') ) {
+                alt15=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 15, 0, input);
+
+                throw nvae;
+            }
+            switch (alt15) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31929:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // InternalEntityMockDSL.g:31929:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop11:
+                    do {
+                        int alt11=3;
+                        int LA11_0 = input.LA(1);
+
+                        if ( (LA11_0=='\\') ) {
+                            alt11=1;
+                        }
+                        else if ( ((LA11_0>='\u0000' && LA11_0<='!')||(LA11_0>='#' && LA11_0<='[')||(LA11_0>=']' && LA11_0<='\uFFFF')) ) {
+                            alt11=2;
+                        }
+
+
+                        switch (alt11) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:31929:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalEntityMockDSL.g:31929:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop11;
+                        }
+                    } while (true);
+
+                    // InternalEntityMockDSL.g:31929:44: ( '\"' )?
+                    int alt12=2;
+                    int LA12_0 = input.LA(1);
+
+                    if ( (LA12_0=='\"') ) {
+                        alt12=1;
+                    }
+                    switch (alt12) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:31929:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:31929:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // InternalEntityMockDSL.g:31929:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop13:
+                    do {
+                        int alt13=3;
+                        int LA13_0 = input.LA(1);
+
+                        if ( (LA13_0=='\\') ) {
+                            alt13=1;
+                        }
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='&')||(LA13_0>='(' && LA13_0<='[')||(LA13_0>=']' && LA13_0<='\uFFFF')) ) {
+                            alt13=2;
+                        }
+
+
+                        switch (alt13) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:31929:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalEntityMockDSL.g:31929:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop13;
+                        }
+                    } while (true);
+
+                    // InternalEntityMockDSL.g:31929:79: ( '\\'' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\'') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:31929:79: '\\''
+                            {
+                            match('\''); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31931:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalEntityMockDSL.g:31931:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalEntityMockDSL.g:31931:24: ( options {greedy=false; } : . )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( (LA16_0=='*') ) {
+                    int LA16_1 = input.LA(2);
+
+                    if ( (LA16_1=='/') ) {
+                        alt16=2;
+                    }
+                    else if ( ((LA16_1>='\u0000' && LA16_1<='.')||(LA16_1>='0' && LA16_1<='\uFFFF')) ) {
+                        alt16=1;
+                    }
+
+
+                }
+                else if ( ((LA16_0>='\u0000' && LA16_0<=')')||(LA16_0>='+' && LA16_0<='\uFFFF')) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:31931:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31933:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalEntityMockDSL.g:31933:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalEntityMockDSL.g:31933:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( ((LA17_0>='\u0000' && LA17_0<='\t')||(LA17_0>='\u000B' && LA17_0<='\f')||(LA17_0>='\u000E' && LA17_0<='\uFFFF')) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:31933:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            // InternalEntityMockDSL.g:31933:40: ( ( '\\r' )? '\\n' )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0=='\n'||LA19_0=='\r') ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalEntityMockDSL.g:31933:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalEntityMockDSL.g:31933:41: ( '\\r' )?
+                    int alt18=2;
+                    int LA18_0 = input.LA(1);
+
+                    if ( (LA18_0=='\r') ) {
+                        alt18=1;
+                    }
+                    switch (alt18) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:31933:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31935:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalEntityMockDSL.g:31935:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalEntityMockDSL.g:31935:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt20=0;
+            loop20:
+            do {
+                int alt20=2;
+                int LA20_0 = input.LA(1);
+
+                if ( ((LA20_0>='\t' && LA20_0<='\n')||LA20_0=='\r'||LA20_0==' ') ) {
+                    alt20=1;
+                }
+
+
+                switch (alt20) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt20 >= 1 ) break loop20;
+                        EarlyExitException eee =
+                            new EarlyExitException(20, input);
+                        throw eee;
+                }
+                cnt20++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:31937:16: ( . )
+            // InternalEntityMockDSL.g:31937:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalEntityMockDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=153;
+        alt21 = dfa21.predict(input);
+        switch (alt21) {
+            case 1 :
+                // InternalEntityMockDSL.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // InternalEntityMockDSL.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // InternalEntityMockDSL.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // InternalEntityMockDSL.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // InternalEntityMockDSL.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // InternalEntityMockDSL.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // InternalEntityMockDSL.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // InternalEntityMockDSL.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // InternalEntityMockDSL.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // InternalEntityMockDSL.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // InternalEntityMockDSL.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // InternalEntityMockDSL.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // InternalEntityMockDSL.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // InternalEntityMockDSL.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // InternalEntityMockDSL.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // InternalEntityMockDSL.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // InternalEntityMockDSL.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // InternalEntityMockDSL.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // InternalEntityMockDSL.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // InternalEntityMockDSL.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // InternalEntityMockDSL.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // InternalEntityMockDSL.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // InternalEntityMockDSL.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // InternalEntityMockDSL.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // InternalEntityMockDSL.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // InternalEntityMockDSL.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // InternalEntityMockDSL.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // InternalEntityMockDSL.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // InternalEntityMockDSL.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // InternalEntityMockDSL.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // InternalEntityMockDSL.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // InternalEntityMockDSL.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // InternalEntityMockDSL.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // InternalEntityMockDSL.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // InternalEntityMockDSL.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // InternalEntityMockDSL.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // InternalEntityMockDSL.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // InternalEntityMockDSL.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // InternalEntityMockDSL.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // InternalEntityMockDSL.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // InternalEntityMockDSL.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // InternalEntityMockDSL.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // InternalEntityMockDSL.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // InternalEntityMockDSL.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // InternalEntityMockDSL.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // InternalEntityMockDSL.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // InternalEntityMockDSL.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // InternalEntityMockDSL.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // InternalEntityMockDSL.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // InternalEntityMockDSL.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // InternalEntityMockDSL.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // InternalEntityMockDSL.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // InternalEntityMockDSL.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // InternalEntityMockDSL.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // InternalEntityMockDSL.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // InternalEntityMockDSL.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // InternalEntityMockDSL.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // InternalEntityMockDSL.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // InternalEntityMockDSL.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // InternalEntityMockDSL.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // InternalEntityMockDSL.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // InternalEntityMockDSL.g:1:376: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 63 :
+                // InternalEntityMockDSL.g:1:382: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 64 :
+                // InternalEntityMockDSL.g:1:388: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 65 :
+                // InternalEntityMockDSL.g:1:394: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 66 :
+                // InternalEntityMockDSL.g:1:400: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 67 :
+                // InternalEntityMockDSL.g:1:406: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 68 :
+                // InternalEntityMockDSL.g:1:412: T__80
+                {
+                mT__80(); 
+
+                }
+                break;
+            case 69 :
+                // InternalEntityMockDSL.g:1:418: T__81
+                {
+                mT__81(); 
+
+                }
+                break;
+            case 70 :
+                // InternalEntityMockDSL.g:1:424: T__82
+                {
+                mT__82(); 
+
+                }
+                break;
+            case 71 :
+                // InternalEntityMockDSL.g:1:430: T__83
+                {
+                mT__83(); 
+
+                }
+                break;
+            case 72 :
+                // InternalEntityMockDSL.g:1:436: T__84
+                {
+                mT__84(); 
+
+                }
+                break;
+            case 73 :
+                // InternalEntityMockDSL.g:1:442: T__85
+                {
+                mT__85(); 
+
+                }
+                break;
+            case 74 :
+                // InternalEntityMockDSL.g:1:448: T__86
+                {
+                mT__86(); 
+
+                }
+                break;
+            case 75 :
+                // InternalEntityMockDSL.g:1:454: T__87
+                {
+                mT__87(); 
+
+                }
+                break;
+            case 76 :
+                // InternalEntityMockDSL.g:1:460: T__88
+                {
+                mT__88(); 
+
+                }
+                break;
+            case 77 :
+                // InternalEntityMockDSL.g:1:466: T__89
+                {
+                mT__89(); 
+
+                }
+                break;
+            case 78 :
+                // InternalEntityMockDSL.g:1:472: T__90
+                {
+                mT__90(); 
+
+                }
+                break;
+            case 79 :
+                // InternalEntityMockDSL.g:1:478: T__91
+                {
+                mT__91(); 
+
+                }
+                break;
+            case 80 :
+                // InternalEntityMockDSL.g:1:484: T__92
+                {
+                mT__92(); 
+
+                }
+                break;
+            case 81 :
+                // InternalEntityMockDSL.g:1:490: T__93
+                {
+                mT__93(); 
+
+                }
+                break;
+            case 82 :
+                // InternalEntityMockDSL.g:1:496: T__94
+                {
+                mT__94(); 
+
+                }
+                break;
+            case 83 :
+                // InternalEntityMockDSL.g:1:502: T__95
+                {
+                mT__95(); 
+
+                }
+                break;
+            case 84 :
+                // InternalEntityMockDSL.g:1:508: T__96
+                {
+                mT__96(); 
+
+                }
+                break;
+            case 85 :
+                // InternalEntityMockDSL.g:1:514: T__97
+                {
+                mT__97(); 
+
+                }
+                break;
+            case 86 :
+                // InternalEntityMockDSL.g:1:520: T__98
+                {
+                mT__98(); 
+
+                }
+                break;
+            case 87 :
+                // InternalEntityMockDSL.g:1:526: T__99
+                {
+                mT__99(); 
+
+                }
+                break;
+            case 88 :
+                // InternalEntityMockDSL.g:1:532: T__100
+                {
+                mT__100(); 
+
+                }
+                break;
+            case 89 :
+                // InternalEntityMockDSL.g:1:539: T__101
+                {
+                mT__101(); 
+
+                }
+                break;
+            case 90 :
+                // InternalEntityMockDSL.g:1:546: T__102
+                {
+                mT__102(); 
+
+                }
+                break;
+            case 91 :
+                // InternalEntityMockDSL.g:1:553: T__103
+                {
+                mT__103(); 
+
+                }
+                break;
+            case 92 :
+                // InternalEntityMockDSL.g:1:560: T__104
+                {
+                mT__104(); 
+
+                }
+                break;
+            case 93 :
+                // InternalEntityMockDSL.g:1:567: T__105
+                {
+                mT__105(); 
+
+                }
+                break;
+            case 94 :
+                // InternalEntityMockDSL.g:1:574: T__106
+                {
+                mT__106(); 
+
+                }
+                break;
+            case 95 :
+                // InternalEntityMockDSL.g:1:581: T__107
+                {
+                mT__107(); 
+
+                }
+                break;
+            case 96 :
+                // InternalEntityMockDSL.g:1:588: T__108
+                {
+                mT__108(); 
+
+                }
+                break;
+            case 97 :
+                // InternalEntityMockDSL.g:1:595: T__109
+                {
+                mT__109(); 
+
+                }
+                break;
+            case 98 :
+                // InternalEntityMockDSL.g:1:602: T__110
+                {
+                mT__110(); 
+
+                }
+                break;
+            case 99 :
+                // InternalEntityMockDSL.g:1:609: T__111
+                {
+                mT__111(); 
+
+                }
+                break;
+            case 100 :
+                // InternalEntityMockDSL.g:1:616: T__112
+                {
+                mT__112(); 
+
+                }
+                break;
+            case 101 :
+                // InternalEntityMockDSL.g:1:623: T__113
+                {
+                mT__113(); 
+
+                }
+                break;
+            case 102 :
+                // InternalEntityMockDSL.g:1:630: T__114
+                {
+                mT__114(); 
+
+                }
+                break;
+            case 103 :
+                // InternalEntityMockDSL.g:1:637: T__115
+                {
+                mT__115(); 
+
+                }
+                break;
+            case 104 :
+                // InternalEntityMockDSL.g:1:644: T__116
+                {
+                mT__116(); 
+
+                }
+                break;
+            case 105 :
+                // InternalEntityMockDSL.g:1:651: T__117
+                {
+                mT__117(); 
+
+                }
+                break;
+            case 106 :
+                // InternalEntityMockDSL.g:1:658: T__118
+                {
+                mT__118(); 
+
+                }
+                break;
+            case 107 :
+                // InternalEntityMockDSL.g:1:665: T__119
+                {
+                mT__119(); 
+
+                }
+                break;
+            case 108 :
+                // InternalEntityMockDSL.g:1:672: T__120
+                {
+                mT__120(); 
+
+                }
+                break;
+            case 109 :
+                // InternalEntityMockDSL.g:1:679: T__121
+                {
+                mT__121(); 
+
+                }
+                break;
+            case 110 :
+                // InternalEntityMockDSL.g:1:686: T__122
+                {
+                mT__122(); 
+
+                }
+                break;
+            case 111 :
+                // InternalEntityMockDSL.g:1:693: T__123
+                {
+                mT__123(); 
+
+                }
+                break;
+            case 112 :
+                // InternalEntityMockDSL.g:1:700: T__124
+                {
+                mT__124(); 
+
+                }
+                break;
+            case 113 :
+                // InternalEntityMockDSL.g:1:707: T__125
+                {
+                mT__125(); 
+
+                }
+                break;
+            case 114 :
+                // InternalEntityMockDSL.g:1:714: T__126
+                {
+                mT__126(); 
+
+                }
+                break;
+            case 115 :
+                // InternalEntityMockDSL.g:1:721: T__127
+                {
+                mT__127(); 
+
+                }
+                break;
+            case 116 :
+                // InternalEntityMockDSL.g:1:728: T__128
+                {
+                mT__128(); 
+
+                }
+                break;
+            case 117 :
+                // InternalEntityMockDSL.g:1:735: T__129
+                {
+                mT__129(); 
+
+                }
+                break;
+            case 118 :
+                // InternalEntityMockDSL.g:1:742: T__130
+                {
+                mT__130(); 
+
+                }
+                break;
+            case 119 :
+                // InternalEntityMockDSL.g:1:749: T__131
+                {
+                mT__131(); 
+
+                }
+                break;
+            case 120 :
+                // InternalEntityMockDSL.g:1:756: T__132
+                {
+                mT__132(); 
+
+                }
+                break;
+            case 121 :
+                // InternalEntityMockDSL.g:1:763: T__133
+                {
+                mT__133(); 
+
+                }
+                break;
+            case 122 :
+                // InternalEntityMockDSL.g:1:770: T__134
+                {
+                mT__134(); 
+
+                }
+                break;
+            case 123 :
+                // InternalEntityMockDSL.g:1:777: T__135
+                {
+                mT__135(); 
+
+                }
+                break;
+            case 124 :
+                // InternalEntityMockDSL.g:1:784: T__136
+                {
+                mT__136(); 
+
+                }
+                break;
+            case 125 :
+                // InternalEntityMockDSL.g:1:791: T__137
+                {
+                mT__137(); 
+
+                }
+                break;
+            case 126 :
+                // InternalEntityMockDSL.g:1:798: T__138
+                {
+                mT__138(); 
+
+                }
+                break;
+            case 127 :
+                // InternalEntityMockDSL.g:1:805: T__139
+                {
+                mT__139(); 
+
+                }
+                break;
+            case 128 :
+                // InternalEntityMockDSL.g:1:812: T__140
+                {
+                mT__140(); 
+
+                }
+                break;
+            case 129 :
+                // InternalEntityMockDSL.g:1:819: T__141
+                {
+                mT__141(); 
+
+                }
+                break;
+            case 130 :
+                // InternalEntityMockDSL.g:1:826: T__142
+                {
+                mT__142(); 
+
+                }
+                break;
+            case 131 :
+                // InternalEntityMockDSL.g:1:833: T__143
+                {
+                mT__143(); 
+
+                }
+                break;
+            case 132 :
+                // InternalEntityMockDSL.g:1:840: T__144
+                {
+                mT__144(); 
+
+                }
+                break;
+            case 133 :
+                // InternalEntityMockDSL.g:1:847: T__145
+                {
+                mT__145(); 
+
+                }
+                break;
+            case 134 :
+                // InternalEntityMockDSL.g:1:854: T__146
+                {
+                mT__146(); 
+
+                }
+                break;
+            case 135 :
+                // InternalEntityMockDSL.g:1:861: T__147
+                {
+                mT__147(); 
+
+                }
+                break;
+            case 136 :
+                // InternalEntityMockDSL.g:1:868: T__148
+                {
+                mT__148(); 
+
+                }
+                break;
+            case 137 :
+                // InternalEntityMockDSL.g:1:875: T__149
+                {
+                mT__149(); 
+
+                }
+                break;
+            case 138 :
+                // InternalEntityMockDSL.g:1:882: T__150
+                {
+                mT__150(); 
+
+                }
+                break;
+            case 139 :
+                // InternalEntityMockDSL.g:1:889: T__151
+                {
+                mT__151(); 
+
+                }
+                break;
+            case 140 :
+                // InternalEntityMockDSL.g:1:896: T__152
+                {
+                mT__152(); 
+
+                }
+                break;
+            case 141 :
+                // InternalEntityMockDSL.g:1:903: T__153
+                {
+                mT__153(); 
+
+                }
+                break;
+            case 142 :
+                // InternalEntityMockDSL.g:1:910: T__154
+                {
+                mT__154(); 
+
+                }
+                break;
+            case 143 :
+                // InternalEntityMockDSL.g:1:917: T__155
+                {
+                mT__155(); 
+
+                }
+                break;
+            case 144 :
+                // InternalEntityMockDSL.g:1:924: T__156
+                {
+                mT__156(); 
+
+                }
+                break;
+            case 145 :
+                // InternalEntityMockDSL.g:1:931: RULE_HEX
+                {
+                mRULE_HEX(); 
+
+                }
+                break;
+            case 146 :
+                // InternalEntityMockDSL.g:1:940: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 147 :
+                // InternalEntityMockDSL.g:1:949: RULE_DECIMAL
+                {
+                mRULE_DECIMAL(); 
+
+                }
+                break;
+            case 148 :
+                // InternalEntityMockDSL.g:1:962: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 149 :
+                // InternalEntityMockDSL.g:1:970: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 150 :
+                // InternalEntityMockDSL.g:1:982: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 151 :
+                // InternalEntityMockDSL.g:1:998: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 152 :
+                // InternalEntityMockDSL.g:1:1014: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 153 :
+                // InternalEntityMockDSL.g:1:1022: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA21 dfa21 = new DFA21(this);
+    static final String DFA21_eotS =
+        "\1\uffff\1\65\1\67\1\71\1\77\1\102\1\106\1\111\1\115\1\117\1\121\1\123\1\125\1\127\1\132\11\77\2\uffff\2\77\3\uffff\6\77\5\uffff\1\u0097\2\u009a\1\62\5\uffff\1\u009f\6\uffff\5\77\21\uffff\1\u00a7\5\uffff\1\u00a9\4\uffff\11\77\1\u00b6\7\77\1\u00c2\11\77\2\uffff\4\77\1\u00d8\3\uffff\13\77\1\u00e9\1\77\1\u00ee\3\77\10\uffff\1\u009a\6\uffff\6\77\4\uffff\1\u00f9\1\u00fa\12\77\1\uffff\5\77\1\u010b\5\77\1\uffff\17\77\1\u0122\5\77\1\uffff\17\77\1\u0137\1\uffff\4\77\1\uffff\2\77\1\u013e\6\77\1\u0145\2\uffff\1\77\1\u0147\12\77\1\u0152\2\77\1\u0155\1\uffff\1\u0156\7\77\1\u015f\1\u0160\3\77\1\u0165\3\77\1\u0169\4\77\1\uffff\3\77\1\u0171\10\77\1\u017a\6\77\1\u0181\1\uffff\6\77\1\uffff\1\u0188\2\77\1\u018c\1\77\1\u018f\1\uffff\1\77\1\uffff\1\u0191\4\77\1\u0196\3\77\1\u019a\1\uffff\2\77\2\uffff\7\77\1\u01a4\2\uffff\1\u01a5\1\u01a6\2\77\1\uffff\1\u01a9\2\77\1\uffff\7\77\1\uffff\10\77\1\uffff\1\u01bb\1\77\1\u01bd\1\77\1\u01bf\1\77\1\uffff\2\77\1\u01c3\2\77\1\u01c6\1\uffff\3\77\1\uffff\1\77\1\u01cb\1\uffff\1\u01cc\1\uffff\1\u01ce\2\77\1\u01d1\1\uffff\3\77\1\uffff\1\77\1\u01d6\7\77\3\uffff\1\u01de\1\77\1\uffff\6\77\1\u01e6\3\77\1\u01eb\1\77\1\u01ed\4\77\1\uffff\1\77\1\uffff\1\77\1\uffff\3\77\1\uffff\1\77\1\u01f9\1\uffff\1\77\1\u01fb\2\77\2\uffff\1\77\1\uffff\2\77\1\uffff\1\u0201\2\77\1\u0206\1\uffff\4\77\1\u020b\2\77\1\uffff\1\u020e\1\77\1\u0210\2\77\1\u0213\1\77\1\uffff\1\77\1\u0216\1\77\1\u0218\1\uffff\1\77\1\uffff\1\77\1\u021b\1\u021c\10\77\1\uffff\1\77\1\uffff\1\77\1\u0227\1\u0228\2\77\1\uffff\4\77\1\uffff\2\77\1\u0231\1\77\1\uffff\1\u0233\1\77\1\uffff\1\77\1\uffff\1\77\1\u0237\1\uffff\1\u0239\1\77\1\uffff\1\77\1\uffff\1\77\1\u023d\2\uffff\5\77\1\u0244\1\u0245\1\u0246\1\77\1\u0248\2\uffff\1\u0249\6\77\1\u0250\1\uffff\1\u0251\1\uffff\1\77\1\u0253\1\77\1\uffff\1\u0255\1\uffff\1\u0256\2\77\1\uffff\6\77\3\uffff\1\77\2\uffff\4\77\1\u0265\1\77\2\uffff\1\77\1\uffff\1\u0268\2\uffff\1\u0269\7\77\1\u0271\3\77\1\u0275\1\u0276\1\uffff\1\77\1\u0278\2\uffff\1\u0279\1\u027a\1\u027b\3\77\1\u027f\1\uffff\1\77\1\u0281\1\u0282\2\uffff\1\77\4\uffff\3\77\1\uffff\1\77\2\uffff\12\77\1\u0294\4\77\1\u029a\1\u029b\1\uffff\5\77\2\uffff\1\u02a1\4\77\1\uffff\1\77\1\u02a7\2\77\1\u02aa\1\uffff\1\77\1\u02ac\1\uffff\1\u02ad\2\uffff";
+    static final String DFA21_eofS =
+        "\u02ae\uffff";
+    static final String DFA21_minS =
+        "\1\0\1\75\1\174\1\46\1\154\1\53\1\55\2\52\3\75\1\76\2\56\1\141\1\145\1\146\2\141\1\145\1\157\1\145\1\141\2\uffff\1\141\1\163\3\uffff\1\142\2\141\1\156\2\145\5\uffff\1\72\2\60\1\44\5\uffff\1\75\6\uffff\1\151\1\142\1\164\1\145\1\163\21\uffff\1\75\5\uffff\1\74\4\uffff\1\154\1\141\1\160\1\151\2\156\1\160\1\145\1\163\1\44\2\154\1\164\1\157\1\162\1\164\1\143\1\44\1\145\1\164\1\145\1\162\1\143\1\141\1\143\1\151\1\162\2\uffff\1\146\1\156\1\165\1\164\1\44\3\uffff\1\152\1\164\1\105\1\163\1\157\1\154\1\145\1\163\1\151\1\154\1\167\1\44\1\155\1\44\1\160\1\162\1\165\10\uffff\1\60\6\uffff\1\163\2\145\1\151\1\162\1\145\4\uffff\2\44\1\164\1\160\1\145\2\164\1\143\1\157\1\155\1\145\1\164\1\uffff\1\163\1\145\1\141\1\165\1\155\1\44\1\163\2\141\1\151\1\143\1\uffff\1\153\1\150\1\156\1\154\1\144\1\164\1\153\1\162\1\164\1\153\1\164\1\141\1\157\1\143\1\157\1\44\1\165\1\144\1\156\1\163\1\162\1\uffff\1\145\1\151\1\156\1\142\1\145\1\154\1\143\1\145\1\143\1\141\2\151\1\156\1\142\1\154\1\44\1\uffff\1\164\1\160\1\141\1\157\1\uffff\1\145\1\157\1\44\1\145\1\164\1\156\1\144\1\164\1\171\1\44\2\uffff\1\151\1\44\1\162\1\143\1\145\1\150\1\162\1\163\1\141\1\147\1\141\1\145\1\44\1\154\1\162\1\44\1\uffff\1\44\1\151\1\106\1\156\1\165\1\155\1\162\1\163\2\44\1\145\1\163\1\150\1\44\1\163\1\145\1\141\1\44\1\147\1\162\1\145\1\165\1\uffff\1\162\1\157\1\144\1\44\1\151\1\143\1\157\1\165\1\152\1\144\1\145\1\165\1\44\1\150\1\164\1\154\2\147\1\145\1\44\1\uffff\1\120\1\154\1\171\1\162\1\157\1\167\1\uffff\1\44\1\151\1\144\1\44\1\151\1\44\1\uffff\1\143\1\uffff\1\44\1\150\1\156\1\162\1\164\1\44\1\164\1\145\1\156\1\44\1\uffff\1\154\1\145\2\uffff\1\156\1\141\1\162\1\145\1\154\1\141\1\151\1\44\2\uffff\2\44\1\163\1\156\1\uffff\1\44\1\162\1\147\1\uffff\1\162\1\151\1\156\1\162\1\156\1\155\1\124\1\uffff\1\142\1\164\1\156\1\155\1\145\1\117\1\141\1\154\1\uffff\1\44\1\145\1\44\1\156\1\44\1\162\1\uffff\1\151\1\141\1\44\1\162\1\146\1\44\1\uffff\1\156\1\163\1\151\1\uffff\1\145\1\44\1\uffff\1\44\1\uffff\1\44\1\143\1\157\1\44\1\uffff\1\145\1\162\1\143\1\uffff\1\171\1\44\1\164\1\156\1\157\1\144\1\164\1\154\1\142\3\uffff\1\44\1\147\1\uffff\1\144\1\145\1\141\2\164\1\143\1\44\1\151\1\157\1\165\1\44\1\141\1\44\1\143\2\156\1\141\1\uffff\1\102\1\uffff\1\145\1\uffff\1\120\1\143\1\164\1\uffff\1\157\1\44\1\uffff\1\147\1\44\1\157\1\163\2\uffff\1\156\1\uffff\1\145\1\156\1\uffff\1\44\1\106\1\145\1\44\1\uffff\1\145\1\147\1\155\1\101\1\44\1\163\1\145\1\uffff\1\44\1\141\1\44\1\160\1\171\1\44\1\145\1\uffff\1\172\1\44\1\164\1\44\1\uffff\1\154\1\uffff\1\164\2\44\1\164\1\154\1\144\1\141\1\151\1\153\1\145\1\167\1\uffff\1\105\1\uffff\1\156\2\44\1\163\1\151\1\uffff\1\141\1\151\1\162\1\157\1\uffff\1\162\1\145\1\44\1\163\1\uffff\1\44\1\144\1\uffff\1\171\1\uffff\1\150\1\44\1\uffff\1\44\1\145\1\uffff\1\145\1\uffff\1\106\1\44\2\uffff\1\145\1\157\1\111\1\156\1\143\3\44\1\156\1\44\2\uffff\1\44\1\172\1\156\1\143\1\157\1\146\1\143\1\44\1\uffff\1\44\1\uffff\1\102\1\44\1\163\1\uffff\1\44\1\uffff\1\44\1\163\1\157\1\uffff\1\101\1\142\1\165\1\156\1\147\1\153\3\uffff\1\164\2\uffff\1\145\1\147\1\153\1\155\1\44\1\150\2\uffff\1\171\1\uffff\1\44\2\uffff\1\44\1\162\1\163\1\156\1\115\1\155\1\164\1\145\1\44\1\151\1\144\1\145\2\44\1\uffff\1\141\1\44\2\uffff\3\44\1\141\1\142\1\145\1\44\1\uffff\1\164\2\44\2\uffff\1\156\4\uffff\1\160\1\145\1\147\1\uffff\1\151\2\uffff\1\147\1\160\1\162\3\145\1\151\1\120\1\162\1\163\1\44\1\156\1\141\1\151\1\120\2\44\1\uffff\1\147\1\156\1\143\1\141\1\151\2\uffff\1\44\1\147\1\153\1\156\1\143\1\uffff\1\145\1\44\1\147\1\153\1\44\1\uffff\1\145\1\44\1\uffff\1\44\2\uffff";
+    static final String DFA21_maxS =
+        "\1\uffff\1\76\1\174\1\46\1\170\1\75\1\76\5\75\1\76\1\56\1\72\1\141\1\171\1\164\1\165\3\157\1\145\1\162\2\uffff\1\157\1\164\3\uffff\1\160\1\171\1\162\1\163\1\165\1\171\5\uffff\1\72\1\170\1\154\1\172\5\uffff\1\75\6\uffff\1\164\1\142\1\164\1\145\1\163\21\uffff\1\75\5\uffff\1\74\4\uffff\1\162\1\145\1\160\1\151\2\156\1\160\1\145\1\164\1\172\1\154\1\156\1\164\1\157\1\162\1\171\1\163\1\172\1\145\1\164\1\151\1\162\1\156\2\163\1\151\1\162\2\uffff\1\164\1\156\1\167\1\164\1\172\3\uffff\1\152\1\164\1\117\1\163\1\157\1\164\1\145\1\164\1\151\1\155\1\167\1\172\1\170\1\172\1\160\1\162\1\171\10\uffff\1\154\6\uffff\1\163\2\145\1\151\1\162\1\145\4\uffff\2\172\1\164\1\160\1\145\2\164\1\143\1\157\1\162\1\145\1\164\1\uffff\1\163\1\145\1\141\1\165\1\155\1\172\1\163\1\145\2\151\1\143\1\uffff\1\153\1\150\1\156\1\154\1\144\1\164\1\153\1\162\1\164\1\153\1\164\1\141\1\157\1\143\1\157\1\172\1\165\1\144\1\156\1\163\1\162\1\uffff\1\145\1\151\1\156\1\142\1\145\1\154\1\143\1\145\1\143\1\141\2\151\1\156\1\142\1\154\1\172\1\uffff\1\164\1\160\1\141\1\157\1\uffff\1\145\1\157\1\172\1\145\1\164\1\156\1\144\1\164\1\171\1\172\2\uffff\1\151\1\172\1\162\1\143\1\145\1\150\1\162\1\163\1\141\1\147\1\141\1\145\1\172\1\154\1\162\1\172\1\uffff\1\172\1\151\1\122\1\156\1\165\1\155\1\162\1\163\2\172\1\145\1\163\1\150\1\172\1\163\1\145\1\141\1\172\1\147\1\162\1\145\1\165\1\uffff\1\162\1\157\1\144\1\172\1\151\1\143\1\157\1\165\1\152\1\144\1\145\1\165\1\172\1\150\1\164\1\154\2\147\1\145\1\172\1\uffff\1\120\1\154\1\171\1\162\1\157\1\167\1\uffff\1\172\1\151\1\163\1\172\1\171\1\172\1\uffff\1\143\1\uffff\1\172\1\150\1\156\1\162\1\164\1\172\1\164\1\145\1\156\1\172\1\uffff\1\154\1\145\2\uffff\1\156\1\141\1\162\1\145\1\154\1\141\1\151\1\172\2\uffff\2\172\1\163\1\156\1\uffff\1\172\1\162\1\147\1\uffff\1\162\1\151\1\156\1\162\1\156\1\155\1\124\1\uffff\1\142\1\164\1\156\1\155\1\145\1\117\1\141\1\154\1\uffff\1\172\1\145\1\172\1\156\1\172\1\162\1\uffff\1\151\1\141\1\172\1\162\1\146\1\172\1\uffff\1\156\1\163\1\151\1\uffff\1\145\1\172\1\uffff\1\172\1\uffff\1\172\1\143\1\157\1\172\1\uffff\1\145\1\162\1\143\1\uffff\1\171\1\172\1\164\1\156\1\157\1\144\1\164\1\154\1\142\3\uffff\1\172\1\147\1\uffff\1\144\1\145\1\141\2\164\1\143\1\172\1\151\1\157\1\165\1\172\1\141\1\172\1\143\2\156\1\141\1\uffff\1\102\1\uffff\1\145\1\uffff\1\122\1\143\1\164\1\uffff\1\157\1\172\1\uffff\1\147\1\172\1\157\1\163\2\uffff\1\156\1\uffff\1\145\1\156\1\uffff\1\172\1\122\1\145\1\172\1\uffff\1\145\1\147\1\155\1\101\1\172\1\163\1\145\1\uffff\1\172\1\141\1\172\1\160\1\171\1\172\1\145\1\uffff\2\172\1\164\1\172\1\uffff\1\154\1\uffff\1\164\2\172\1\164\1\154\1\144\1\141\1\151\1\153\1\145\1\167\1\uffff\1\105\1\uffff\1\156\2\172\1\163\1\151\1\uffff\1\141\1\151\1\162\1\157\1\uffff\1\162\1\145\1\172\1\163\1\uffff\1\172\1\144\1\uffff\1\171\1\uffff\1\150\1\172\1\uffff\1\172\1\145\1\uffff\1\145\1\uffff\1\106\1\172\2\uffff\1\145\1\157\1\116\1\156\1\143\3\172\1\156\1\172\2\uffff\2\172\1\156\1\143\1\157\1\146\1\143\1\172\1\uffff\1\172\1\uffff\1\102\1\172\1\163\1\uffff\1\172\1\uffff\1\172\1\163\1\157\1\uffff\1\117\1\142\1\165\1\156\1\147\1\153\3\uffff\1\164\2\uffff\1\145\1\147\1\153\1\155\1\172\1\150\2\uffff\1\171\1\uffff\1\172\2\uffff\1\172\1\162\1\163\1\156\1\115\1\155\1\164\1\145\1\172\1\151\1\144\1\145\2\172\1\uffff\1\141\1\172\2\uffff\3\172\1\141\1\142\1\145\1\172\1\uffff\1\164\2\172\2\uffff\1\156\4\uffff\1\160\1\145\1\147\1\uffff\1\151\2\uffff\1\147\1\160\1\162\3\145\1\151\1\122\1\162\1\163\1\172\1\156\1\141\1\151\1\122\2\172\1\uffff\1\147\1\156\1\143\1\141\1\151\2\uffff\1\172\1\147\1\153\1\156\1\143\1\uffff\1\145\1\172\1\147\1\153\1\172\1\uffff\1\145\1\172\1\uffff\1\172\2\uffff";
+    static final String DFA21_acceptS =
+        "\30\uffff\1\55\1\56\2\uffff\1\70\1\71\1\72\6\uffff\1\155\1\156\1\157\1\160\1\161\4\uffff\1\u0094\2\u0095\1\u0098\1\u0099\1\uffff\1\24\1\1\1\2\1\u008f\1\3\1\u0086\5\uffff\1\u0094\1\5\1\36\1\27\1\6\1\21\1\37\1\30\1\7\1\32\1\31\1\10\1\u0096\1\u0097\1\33\1\11\1\34\1\uffff\1\35\1\16\1\17\1\25\1\20\1\uffff\1\40\1\26\1\u008e\1\u0085\33\uffff\1\55\1\56\5\uffff\1\70\1\71\1\72\21\uffff\1\155\1\156\1\157\1\160\1\161\1\u008d\1\166\1\u0091\1\uffff\1\u0092\1\u0093\1\u0095\1\u0098\1\14\1\12\6\uffff\1\15\1\13\1\22\1\23\14\uffff\1\163\13\uffff\1\173\25\uffff\1\145\20\uffff\1\u008c\4\uffff\1\137\12\uffff\1\41\1\75\20\uffff\1\171\26\uffff\1\152\24\uffff\1\174\6\uffff\1\u0081\6\uffff\1\164\1\uffff\1\142\12\uffff\1\63\2\uffff\1\113\1\50\10\uffff\1\77\1\101\4\uffff\1\57\3\uffff\1\110\7\uffff\1\136\10\uffff\1\170\6\uffff\1\175\6\uffff\1\u0090\3\uffff\1\102\2\uffff\1\144\1\uffff\1\46\4\uffff\1\66\3\uffff\1\47\11\uffff\1\51\1\172\1\126\2\uffff\1\53\21\uffff\1\u0084\1\uffff\1\114\1\uffff\1\151\3\uffff\1\u008a\2\uffff\1\177\4\uffff\1\135\1\43\1\uffff\1\165\2\uffff\1\44\4\uffff\1\107\7\uffff\1\52\7\uffff\1\u0080\4\uffff\1\74\1\uffff\1\76\13\uffff\1\176\1\uffff\1\42\5\uffff\1\140\4\uffff\1\u0082\4\uffff\1\167\2\uffff\1\134\1\uffff\1\54\2\uffff\1\154\2\uffff\1\117\1\uffff\1\73\2\uffff\1\105\1\111\12\uffff\1\133\1\100\10\uffff\1\143\1\uffff\1\116\3\uffff\1\60\1\uffff\1\65\3\uffff\1\147\6\uffff\1\123\1\146\1\u008b\1\uffff\1\45\1\125\6\uffff\1\112\1\103\1\uffff\1\u0089\1\uffff\1\64\1\106\16\uffff\1\162\2\uffff\1\124\1\67\7\uffff\1\120\3\uffff\1\122\1\141\1\uffff\1\u0087\1\153\1\104\1\150\3\uffff\1\115\1\uffff\1\u0083\1\121\21\uffff\1\62\5\uffff\1\4\1\61\5\uffff\1\u0088\5\uffff\1\130\2\uffff\1\127\1\uffff\1\132\1\131";
+    static final String DFA21_specialS =
+        "\1\0\u02ad\uffff}>";
+    static final String[] DFA21_transitionS = {
+            "\11\62\2\61\2\62\1\61\22\62\1\61\1\12\1\57\1\50\1\56\1\11\1\3\1\60\1\34\1\35\1\7\1\5\1\36\1\6\1\15\1\10\1\53\11\54\1\52\1\45\1\14\1\1\1\13\1\16\1\46\32\56\1\51\1\62\1\47\1\55\1\56\1\62\1\33\1\40\1\41\1\23\1\4\1\22\2\56\1\21\3\56\1\25\1\43\1\37\1\27\1\56\1\32\1\20\1\44\1\42\1\17\1\24\1\56\1\26\1\56\1\30\1\2\1\31\uff82\62",
+            "\1\63\1\64",
+            "\1\66",
+            "\1\70",
+            "\1\76\1\73\1\74\7\uffff\1\75\1\uffff\1\72",
+            "\1\101\21\uffff\1\100",
+            "\1\105\17\uffff\1\103\1\104",
+            "\1\110\22\uffff\1\107",
+            "\1\113\4\uffff\1\114\15\uffff\1\112",
+            "\1\116",
+            "\1\120",
+            "\1\122",
+            "\1\124",
+            "\1\126",
+            "\1\131\13\uffff\1\130",
+            "\1\133",
+            "\1\137\16\uffff\1\134\1\135\1\uffff\1\136\1\uffff\1\140",
+            "\1\144\6\uffff\1\141\1\143\5\uffff\1\142",
+            "\1\145\7\uffff\1\146\5\uffff\1\151\2\uffff\1\150\2\uffff\1\147",
+            "\1\152\3\uffff\1\153\11\uffff\1\154",
+            "\1\155\2\uffff\1\157\1\156\5\uffff\1\160",
+            "\1\161",
+            "\1\162",
+            "\1\163\3\uffff\1\165\14\uffff\1\164",
+            "",
+            "",
+            "\1\171\3\uffff\1\170\11\uffff\1\172",
+            "\1\174\1\173",
+            "",
+            "",
+            "",
+            "\1\u0080\15\uffff\1\u0081",
+            "\1\u0083\15\uffff\1\u0084\11\uffff\1\u0082",
+            "\1\u0085\20\uffff\1\u0086",
+            "\1\u0087\4\uffff\1\u0088",
+            "\1\u008a\15\uffff\1\u008b\1\uffff\1\u0089",
+            "\1\u008c\2\uffff\1\u008f\6\uffff\1\u008d\2\uffff\1\u0090\6\uffff\1\u008e",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0096",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\13\uffff\1\u0098\6\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\13\uffff\1\u0098",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b",
+            "\1\77\34\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u009e",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00a0\12\uffff\1\u00a1",
+            "\1\u00a2",
+            "\1\u00a3",
+            "\1\u00a4",
+            "\1\u00a5",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00a6",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00a8",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00aa\5\uffff\1\u00ab",
+            "\1\u00ac\3\uffff\1\u00ad",
+            "\1\u00ae",
+            "\1\u00af",
+            "\1\u00b0",
+            "\1\u00b1",
+            "\1\u00b2",
+            "\1\u00b3",
+            "\1\u00b5\1\u00b4",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u00b7",
+            "\1\u00b8\1\uffff\1\u00b9",
+            "\1\u00ba",
+            "\1\u00bb",
+            "\1\u00bc",
+            "\1\u00be\4\uffff\1\u00bd",
+            "\1\u00c0\2\uffff\1\u00bf\14\uffff\1\u00c1",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u00c3",
+            "\1\u00c4",
+            "\1\u00c5\3\uffff\1\u00c6",
+            "\1\u00c7",
+            "\1\u00c9\12\uffff\1\u00c8",
+            "\1\u00ca\21\uffff\1\u00cb",
+            "\1\u00cc\16\uffff\1\u00ce\1\u00cd",
+            "\1\u00cf",
+            "\1\u00d0",
+            "",
+            "",
+            "\1\u00d2\14\uffff\1\u00d1\1\u00d3",
+            "\1\u00d4",
+            "\1\u00d5\1\uffff\1\u00d6",
+            "\1\u00d7",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "",
+            "\1\u00d9",
+            "\1\u00da",
+            "\1\u00db\11\uffff\1\u00dc",
+            "\1\u00dd",
+            "\1\u00de",
+            "\1\u00df\6\uffff\1\u00e0\1\u00e1",
+            "\1\u00e2",
+            "\1\u00e4\1\u00e3",
+            "\1\u00e5",
+            "\1\u00e7\1\u00e6",
+            "\1\u00e8",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u00eb\12\uffff\1\u00ea",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\3\77\1\u00ec\10\77\1\u00ed\15\77",
+            "\1\u00ef",
+            "\1\u00f0",
+            "\1\u00f2\3\uffff\1\u00f1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u00f3",
+            "\1\u00f4",
+            "\1\u00f5",
+            "\1\u00f6",
+            "\1\u00f7",
+            "\1\u00f8",
+            "",
+            "",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u00fb",
+            "\1\u00fc",
+            "\1\u00fd",
+            "\1\u00fe",
+            "\1\u00ff",
+            "\1\u0100",
+            "\1\u0101",
+            "\1\u0102\4\uffff\1\u0103",
+            "\1\u0104",
+            "\1\u0105",
+            "",
+            "\1\u0106",
+            "\1\u0107",
+            "\1\u0108",
+            "\1\u0109",
+            "\1\u010a",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u010c",
+            "\1\u010d\3\uffff\1\u010e",
+            "\1\u0110\7\uffff\1\u010f",
+            "\1\u0111",
+            "\1\u0112",
+            "",
+            "\1\u0113",
+            "\1\u0114",
+            "\1\u0115",
+            "\1\u0116",
+            "\1\u0117",
+            "\1\u0118",
+            "\1\u0119",
+            "\1\u011a",
+            "\1\u011b",
+            "\1\u011c",
+            "\1\u011d",
+            "\1\u011e",
+            "\1\u011f",
+            "\1\u0120",
+            "\1\u0121",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0123",
+            "\1\u0124",
+            "\1\u0125",
+            "\1\u0126",
+            "\1\u0127",
+            "",
+            "\1\u0128",
+            "\1\u0129",
+            "\1\u012a",
+            "\1\u012b",
+            "\1\u012c",
+            "\1\u012d",
+            "\1\u012e",
+            "\1\u012f",
+            "\1\u0130",
+            "\1\u0131",
+            "\1\u0132",
+            "\1\u0133",
+            "\1\u0134",
+            "\1\u0135",
+            "\1\u0136",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0138",
+            "\1\u0139",
+            "\1\u013a",
+            "\1\u013b",
+            "",
+            "\1\u013c",
+            "\1\u013d",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u013f",
+            "\1\u0140",
+            "\1\u0141",
+            "\1\u0142",
+            "\1\u0143",
+            "\1\u0144",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\u0146",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0148",
+            "\1\u0149",
+            "\1\u014a",
+            "\1\u014b",
+            "\1\u014c",
+            "\1\u014d",
+            "\1\u014e",
+            "\1\u014f",
+            "\1\u0150",
+            "\1\u0151",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0153",
+            "\1\u0154",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0157",
+            "\1\u0159\13\uffff\1\u0158",
+            "\1\u015a",
+            "\1\u015b",
+            "\1\u015c",
+            "\1\u015d",
+            "\1\u015e",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0161",
+            "\1\u0162",
+            "\1\u0163",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\10\77\1\u0164\21\77",
+            "\1\u0166",
+            "\1\u0167",
+            "\1\u0168",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u016a",
+            "\1\u016b",
+            "\1\u016c",
+            "\1\u016d",
+            "",
+            "\1\u016e",
+            "\1\u016f",
+            "\1\u0170",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0172",
+            "\1\u0173",
+            "\1\u0174",
+            "\1\u0175",
+            "\1\u0176",
+            "\1\u0177",
+            "\1\u0178",
+            "\1\u0179",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u017b",
+            "\1\u017c",
+            "\1\u017d",
+            "\1\u017e",
+            "\1\u017f",
+            "\1\u0180",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0182",
+            "\1\u0183",
+            "\1\u0184",
+            "\1\u0185",
+            "\1\u0186",
+            "\1\u0187",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0189",
+            "\1\u018a\16\uffff\1\u018b",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u018d\17\uffff\1\u018e",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0190",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0192",
+            "\1\u0193",
+            "\1\u0194",
+            "\1\u0195",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0197",
+            "\1\u0198",
+            "\1\u0199",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u019b",
+            "\1\u019c",
+            "",
+            "",
+            "\1\u019d",
+            "\1\u019e",
+            "\1\u019f",
+            "\1\u01a0",
+            "\1\u01a1",
+            "\1\u01a2",
+            "\1\u01a3",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01a7",
+            "\1\u01a8",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01aa",
+            "\1\u01ab",
+            "",
+            "\1\u01ac",
+            "\1\u01ad",
+            "\1\u01ae",
+            "\1\u01af",
+            "\1\u01b0",
+            "\1\u01b1",
+            "\1\u01b2",
+            "",
+            "\1\u01b3",
+            "\1\u01b4",
+            "\1\u01b5",
+            "\1\u01b6",
+            "\1\u01b7",
+            "\1\u01b8",
+            "\1\u01b9",
+            "\1\u01ba",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01bc",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01be",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01c0",
+            "",
+            "\1\u01c1",
+            "\1\u01c2",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01c4",
+            "\1\u01c5",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u01c7",
+            "\1\u01c8",
+            "\1\u01c9",
+            "",
+            "\1\u01ca",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\16\77\1\u01cd\13\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01cf",
+            "\1\u01d0",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u01d2",
+            "\1\u01d3",
+            "\1\u01d4",
+            "",
+            "\1\u01d5",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01d7",
+            "\1\u01d8",
+            "\1\u01d9",
+            "\1\u01da",
+            "\1\u01db",
+            "\1\u01dc",
+            "\1\u01dd",
+            "",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01df",
+            "",
+            "\1\u01e0",
+            "\1\u01e1",
+            "\1\u01e2",
+            "\1\u01e3",
+            "\1\u01e4",
+            "\1\u01e5",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01e7",
+            "\1\u01e8",
+            "\1\u01e9",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\22\77\1\u01ea\7\77",
+            "\1\u01ec",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01ee",
+            "\1\u01ef",
+            "\1\u01f0",
+            "\1\u01f1",
+            "",
+            "\1\u01f2",
+            "",
+            "\1\u01f3",
+            "",
+            "\1\u01f5\1\uffff\1\u01f4",
+            "\1\u01f6",
+            "\1\u01f7",
+            "",
+            "\1\u01f8",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u01fa",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u01fc",
+            "\1\u01fd",
+            "",
+            "",
+            "\1\u01fe",
+            "",
+            "\1\u01ff",
+            "\1\u0200",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0204\11\uffff\1\u0203\1\uffff\1\u0202",
+            "\1\u0205",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0207",
+            "\1\u0208",
+            "\1\u0209",
+            "\1\u020a",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u020c",
+            "\1\u020d",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u020f",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0211",
+            "\1\u0212",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0214",
+            "",
+            "\1\u0215",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0217",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0219",
+            "",
+            "\1\u021a",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u021d",
+            "\1\u021e",
+            "\1\u021f",
+            "\1\u0220",
+            "\1\u0221",
+            "\1\u0222",
+            "\1\u0223",
+            "\1\u0224",
+            "",
+            "\1\u0225",
+            "",
+            "\1\u0226",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0229",
+            "\1\u022a",
+            "",
+            "\1\u022b",
+            "\1\u022c",
+            "\1\u022d",
+            "\1\u022e",
+            "",
+            "\1\u022f",
+            "\1\u0230",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0232",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0234",
+            "",
+            "\1\u0235",
+            "",
+            "\1\u0236",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\22\77\1\u0238\7\77",
+            "\1\u023a",
+            "",
+            "\1\u023b",
+            "",
+            "\1\u023c",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\u023e",
+            "\1\u023f",
+            "\1\u0241\4\uffff\1\u0240",
+            "\1\u0242",
+            "\1\u0243",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0247",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u024a",
+            "\1\u024b",
+            "\1\u024c",
+            "\1\u024d",
+            "\1\u024e",
+            "\1\u024f",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0252",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0254",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0257",
+            "\1\u0258",
+            "",
+            "\1\u0259\15\uffff\1\u025a",
+            "\1\u025b",
+            "\1\u025c",
+            "\1\u025d",
+            "\1\u025e",
+            "\1\u025f",
+            "",
+            "",
+            "",
+            "\1\u0260",
+            "",
+            "",
+            "\1\u0261",
+            "\1\u0262",
+            "\1\u0263",
+            "\1\u0264",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0266",
+            "",
+            "",
+            "\1\u0267",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u026a",
+            "\1\u026b",
+            "\1\u026c",
+            "\1\u026d",
+            "\1\u026e",
+            "\1\u026f",
+            "\1\u0270",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u0272",
+            "\1\u0273",
+            "\1\u0274",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0277",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u027c",
+            "\1\u027d",
+            "\1\u027e",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u0280",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "",
+            "\1\u0283",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0284",
+            "\1\u0285",
+            "\1\u0286",
+            "",
+            "\1\u0287",
+            "",
+            "",
+            "\1\u0288",
+            "\1\u0289",
+            "\1\u028a",
+            "\1\u028b",
+            "\1\u028c",
+            "\1\u028d",
+            "\1\u028e",
+            "\1\u0290\1\uffff\1\u028f",
+            "\1\u0291",
+            "\1\u0292",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\22\77\1\u0293\7\77",
+            "\1\u0295",
+            "\1\u0296",
+            "\1\u0297",
+            "\1\u0299\1\uffff\1\u0298",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u029c",
+            "\1\u029d",
+            "\1\u029e",
+            "\1\u029f",
+            "\1\u02a0",
+            "",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u02a2",
+            "\1\u02a3",
+            "\1\u02a4",
+            "\1\u02a5",
+            "",
+            "\1\u02a6",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "\1\u02a8",
+            "\1\u02a9",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\u02ab",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            "\1\77\13\uffff\12\77\7\uffff\32\77\4\uffff\1\77\1\uffff\32\77",
+            "",
+            ""
+    };
+
+    static final short[] DFA21_eot = DFA.unpackEncodedString(DFA21_eotS);
+    static final short[] DFA21_eof = DFA.unpackEncodedString(DFA21_eofS);
+    static final char[] DFA21_min = DFA.unpackEncodedStringToUnsignedChars(DFA21_minS);
+    static final char[] DFA21_max = DFA.unpackEncodedStringToUnsignedChars(DFA21_maxS);
+    static final short[] DFA21_accept = DFA.unpackEncodedString(DFA21_acceptS);
+    static final short[] DFA21_special = DFA.unpackEncodedString(DFA21_specialS);
+    static final short[][] DFA21_transition;
+
+    static {
+        int numStates = DFA21_transitionS.length;
+        DFA21_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA21_transition[i] = DFA.unpackEncodedString(DFA21_transitionS[i]);
+        }
+    }
+
+    class DFA21 extends DFA {
+
+        public DFA21(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 21;
+            this.eot = DFA21_eot;
+            this.eof = DFA21_eof;
+            this.min = DFA21_min;
+            this.max = DFA21_max;
+            this.accept = DFA21_accept;
+            this.special = DFA21_special;
+            this.transition = DFA21_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA21_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA21_0=='=') ) {s = 1;}
+
+                        else if ( (LA21_0=='|') ) {s = 2;}
+
+                        else if ( (LA21_0=='&') ) {s = 3;}
+
+                        else if ( (LA21_0=='e') ) {s = 4;}
+
+                        else if ( (LA21_0=='+') ) {s = 5;}
+
+                        else if ( (LA21_0=='-') ) {s = 6;}
+
+                        else if ( (LA21_0=='*') ) {s = 7;}
+
+                        else if ( (LA21_0=='/') ) {s = 8;}
+
+                        else if ( (LA21_0=='%') ) {s = 9;}
+
+                        else if ( (LA21_0=='!') ) {s = 10;}
+
+                        else if ( (LA21_0=='>') ) {s = 11;}
+
+                        else if ( (LA21_0=='<') ) {s = 12;}
+
+                        else if ( (LA21_0=='.') ) {s = 13;}
+
+                        else if ( (LA21_0=='?') ) {s = 14;}
+
+                        else if ( (LA21_0=='v') ) {s = 15;}
+
+                        else if ( (LA21_0=='s') ) {s = 16;}
+
+                        else if ( (LA21_0=='i') ) {s = 17;}
+
+                        else if ( (LA21_0=='f') ) {s = 18;}
+
+                        else if ( (LA21_0=='d') ) {s = 19;}
+
+                        else if ( (LA21_0=='w') ) {s = 20;}
+
+                        else if ( (LA21_0=='m') ) {s = 21;}
+
+                        else if ( (LA21_0=='y') ) {s = 22;}
+
+                        else if ( (LA21_0=='p') ) {s = 23;}
+
+                        else if ( (LA21_0=='{') ) {s = 24;}
+
+                        else if ( (LA21_0=='}') ) {s = 25;}
+
+                        else if ( (LA21_0=='r') ) {s = 26;}
+
+                        else if ( (LA21_0=='a') ) {s = 27;}
+
+                        else if ( (LA21_0=='(') ) {s = 28;}
+
+                        else if ( (LA21_0==')') ) {s = 29;}
+
+                        else if ( (LA21_0==',') ) {s = 30;}
+
+                        else if ( (LA21_0=='o') ) {s = 31;}
+
+                        else if ( (LA21_0=='b') ) {s = 32;}
+
+                        else if ( (LA21_0=='c') ) {s = 33;}
+
+                        else if ( (LA21_0=='u') ) {s = 34;}
+
+                        else if ( (LA21_0=='n') ) {s = 35;}
+
+                        else if ( (LA21_0=='t') ) {s = 36;}
+
+                        else if ( (LA21_0==';') ) {s = 37;}
+
+                        else if ( (LA21_0=='@') ) {s = 38;}
+
+                        else if ( (LA21_0==']') ) {s = 39;}
+
+                        else if ( (LA21_0=='#') ) {s = 40;}
+
+                        else if ( (LA21_0=='[') ) {s = 41;}
+
+                        else if ( (LA21_0==':') ) {s = 42;}
+
+                        else if ( (LA21_0=='0') ) {s = 43;}
+
+                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 44;}
+
+                        else if ( (LA21_0=='^') ) {s = 45;}
+
+                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='g' && LA21_0<='h')||(LA21_0>='j' && LA21_0<='l')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 46;}
+
+                        else if ( (LA21_0=='\"') ) {s = 47;}
+
+                        else if ( (LA21_0=='\'') ) {s = 48;}
+
+                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 49;}
+
+                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 50;}
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 21, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLParser.java b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLParser.java
new file mode 100644
index 0000000..20ff08c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src-gen/org/eclipse/osbp/xtext/entitymock/ide/contentassist/antlr/internal/InternalEntityMockDSLParser.java
@@ -0,0 +1,108076 @@
+package org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+@SuppressWarnings("all")
+public class InternalEntityMockDSLParser extends AbstractInternalContentAssistParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'existingEntities'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'days'", "'weeks'", "'months'", "'years'", "'package'", "'{'", "'}'", "'mock'", "'priority'", "'datainterchanges'", "'datainterchange'", "'file'", "'resources'", "'resource'", "'items'", "'attributes'", "'('", "')'", "','", "'objects'", "'object'", "'var'", "'byEnum'", "'with'", "'switchOn'", "'when'", "'embed'", "'definedAs'", "'calculateAs'", "'basedOn'", "'randomize'", "'future'", "'past'", "'boolean'", "'dateRange'", "'from'", "'until'", "'numberRange'", "'decimals'", "'roundTo'", "'numberPick'", "'integerRange'", "'integerPick'", "'textPick'", "'paragraphs'", "'sentences'", "'words'", "'unsignedNumberRange'", "'unsignedNumberPick'", "'unsignedIntegerRange'", "'unsignedIntegerPick'", "'entities'", "'mocking'", "'entity'", "'rows'", "'to'", "'iterate'", "'integerFrom'", "'step'", "'dateFrom'", "'every'", "'as'", "'template'", "'byObject'", "'calculateOn'", "'using'", "'ref'", "'optionalFor'", "'percent'", "';'", "'@'", "']'", "'#'", "'['", "'instanceof'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'describedBy'", "'createBlobMapping'", "'yesterday'", "'today'", "'tomorrow'", "'ns'", "'::'", "'?.'", "'|'", "'true'"
+    };
+    public static final int T__144=144;
+    public static final int T__143=143;
+    public static final int T__146=146;
+    public static final int RULE_HEX=5;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__140=140;
+    public static final int T__142=142;
+    public static final int T__141=141;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__133=133;
+    public static final int T__132=132;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int RULE_ID=4;
+    public static final int T__131=131;
+    public static final int T__130=130;
+    public static final int RULE_INT=6;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__30=30;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__154=154;
+    public static final int T__156=156;
+    public static final int T__151=151;
+    public static final int T__150=150;
+    public static final int T__153=153;
+    public static final int T__152=152;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__91=91;
+    public static final int T__100=100;
+    public static final int T__92=92;
+    public static final int T__93=93;
+    public static final int T__102=102;
+    public static final int T__94=94;
+    public static final int T__101=101;
+    public static final int T__90=90;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__99=99;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int RULE_DECIMAL=7;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__23=23;
+    public static final int T__24=24;
+    public static final int T__25=25;
+    public static final int T__20=20;
+    public static final int T__21=21;
+    public static final int T__122=122;
+    public static final int T__70=70;
+    public static final int T__121=121;
+    public static final int T__71=71;
+    public static final int T__124=124;
+    public static final int T__72=72;
+    public static final int T__123=123;
+    public static final int T__120=120;
+    public static final int RULE_STRING=8;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__77=77;
+    public static final int T__119=119;
+    public static final int T__78=78;
+    public static final int T__118=118;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__115=115;
+    public static final int EOF=-1;
+    public static final int T__74=74;
+    public static final int T__114=114;
+    public static final int T__75=75;
+    public static final int T__117=117;
+    public static final int T__76=76;
+    public static final int T__116=116;
+    public static final int T__80=80;
+    public static final int T__111=111;
+    public static final int T__81=81;
+    public static final int T__110=110;
+    public static final int T__82=82;
+    public static final int T__113=113;
+    public static final int T__83=83;
+    public static final int T__112=112;
+    public static final int RULE_WS=11;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__108=108;
+    public static final int T__89=89;
+    public static final int T__107=107;
+    public static final int T__109=109;
+    public static final int T__84=84;
+    public static final int T__104=104;
+    public static final int T__85=85;
+    public static final int T__103=103;
+    public static final int T__86=86;
+    public static final int T__106=106;
+    public static final int T__87=87;
+    public static final int T__105=105;
+
+    // delegates
+    // delegators
+
+
+        public InternalEntityMockDSLParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalEntityMockDSLParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalEntityMockDSLParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalEntityMockDSL.g"; }
+
+
+    	private EntityMockDSLGrammarAccess grammarAccess;
+
+    	public void setGrammarAccess(EntityMockDSLGrammarAccess grammarAccess) {
+    		this.grammarAccess = grammarAccess;
+    	}
+
+    	@Override
+    	protected Grammar getGrammar() {
+    		return grammarAccess.getGrammar();
+    	}
+
+    	@Override
+    	protected String getValueForTokenName(String tokenName) {
+    		return tokenName;
+    	}
+
+
+
+    // $ANTLR start "entryRuleEntityMockModel"
+    // InternalEntityMockDSL.g:67:1: entryRuleEntityMockModel : ruleEntityMockModel EOF ;
+    public final void entryRuleEntityMockModel() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:68:1: ( ruleEntityMockModel EOF )
+            // InternalEntityMockDSL.g:69:1: ruleEntityMockModel EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockModel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockModel"
+
+
+    // $ANTLR start "ruleEntityMockModel"
+    // InternalEntityMockDSL.g:76:1: ruleEntityMockModel : ( ( rule__EntityMockModel__Group__0 ) ) ;
+    public final void ruleEntityMockModel() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:80:2: ( ( ( rule__EntityMockModel__Group__0 ) ) )
+            // InternalEntityMockDSL.g:81:2: ( ( rule__EntityMockModel__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:81:2: ( ( rule__EntityMockModel__Group__0 ) )
+            // InternalEntityMockDSL.g:82:3: ( rule__EntityMockModel__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:83:3: ( rule__EntityMockModel__Group__0 )
+            // InternalEntityMockDSL.g:83:4: rule__EntityMockModel__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockModel__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockModel"
+
+
+    // $ANTLR start "entryRuleEntityMockPackage"
+    // InternalEntityMockDSL.g:92:1: entryRuleEntityMockPackage : ruleEntityMockPackage EOF ;
+    public final void entryRuleEntityMockPackage() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:93:1: ( ruleEntityMockPackage EOF )
+            // InternalEntityMockDSL.g:94:1: ruleEntityMockPackage EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockPackage();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockPackage"
+
+
+    // $ANTLR start "ruleEntityMockPackage"
+    // InternalEntityMockDSL.g:101:1: ruleEntityMockPackage : ( ( rule__EntityMockPackage__Group__0 ) ) ;
+    public final void ruleEntityMockPackage() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:105:2: ( ( ( rule__EntityMockPackage__Group__0 ) ) )
+            // InternalEntityMockDSL.g:106:2: ( ( rule__EntityMockPackage__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:106:2: ( ( rule__EntityMockPackage__Group__0 ) )
+            // InternalEntityMockDSL.g:107:3: ( rule__EntityMockPackage__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:108:3: ( rule__EntityMockPackage__Group__0 )
+            // InternalEntityMockDSL.g:108:4: rule__EntityMockPackage__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockPackage"
+
+
+    // $ANTLR start "entryRuleEntityMock"
+    // InternalEntityMockDSL.g:117:1: entryRuleEntityMock : ruleEntityMock EOF ;
+    public final void entryRuleEntityMock() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:118:1: ( ruleEntityMock EOF )
+            // InternalEntityMockDSL.g:119:1: ruleEntityMock EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMock"
+
+
+    // $ANTLR start "ruleEntityMock"
+    // InternalEntityMockDSL.g:126:1: ruleEntityMock : ( ( rule__EntityMock__Group__0 ) ) ;
+    public final void ruleEntityMock() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:130:2: ( ( ( rule__EntityMock__Group__0 ) ) )
+            // InternalEntityMockDSL.g:131:2: ( ( rule__EntityMock__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:131:2: ( ( rule__EntityMock__Group__0 ) )
+            // InternalEntityMockDSL.g:132:3: ( rule__EntityMock__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:133:3: ( rule__EntityMock__Group__0 )
+            // InternalEntityMockDSL.g:133:4: rule__EntityMock__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMock"
+
+
+    // $ANTLR start "entryRuleRunningDataInterchanges"
+    // InternalEntityMockDSL.g:142:1: entryRuleRunningDataInterchanges : ruleRunningDataInterchanges EOF ;
+    public final void entryRuleRunningDataInterchanges() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:143:1: ( ruleRunningDataInterchanges EOF )
+            // InternalEntityMockDSL.g:144:1: ruleRunningDataInterchanges EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleRunningDataInterchanges();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRunningDataInterchanges"
+
+
+    // $ANTLR start "ruleRunningDataInterchanges"
+    // InternalEntityMockDSL.g:151:1: ruleRunningDataInterchanges : ( ( rule__RunningDataInterchanges__Group__0 ) ) ;
+    public final void ruleRunningDataInterchanges() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:155:2: ( ( ( rule__RunningDataInterchanges__Group__0 ) ) )
+            // InternalEntityMockDSL.g:156:2: ( ( rule__RunningDataInterchanges__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:156:2: ( ( rule__RunningDataInterchanges__Group__0 ) )
+            // InternalEntityMockDSL.g:157:3: ( rule__RunningDataInterchanges__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:158:3: ( rule__RunningDataInterchanges__Group__0 )
+            // InternalEntityMockDSL.g:158:4: rule__RunningDataInterchanges__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRunningDataInterchanges"
+
+
+    // $ANTLR start "entryRuleRunningDataInterchange"
+    // InternalEntityMockDSL.g:167:1: entryRuleRunningDataInterchange : ruleRunningDataInterchange EOF ;
+    public final void entryRuleRunningDataInterchange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:168:1: ( ruleRunningDataInterchange EOF )
+            // InternalEntityMockDSL.g:169:1: ruleRunningDataInterchange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleRunningDataInterchange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRunningDataInterchange"
+
+
+    // $ANTLR start "ruleRunningDataInterchange"
+    // InternalEntityMockDSL.g:176:1: ruleRunningDataInterchange : ( ( rule__RunningDataInterchange__Group__0 ) ) ;
+    public final void ruleRunningDataInterchange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:180:2: ( ( ( rule__RunningDataInterchange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:181:2: ( ( rule__RunningDataInterchange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:181:2: ( ( rule__RunningDataInterchange__Group__0 ) )
+            // InternalEntityMockDSL.g:182:3: ( rule__RunningDataInterchange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:183:3: ( rule__RunningDataInterchange__Group__0 )
+            // InternalEntityMockDSL.g:183:4: rule__RunningDataInterchange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRunningDataInterchange"
+
+
+    // $ANTLR start "entryRuleEntityMockResources"
+    // InternalEntityMockDSL.g:192:1: entryRuleEntityMockResources : ruleEntityMockResources EOF ;
+    public final void entryRuleEntityMockResources() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:193:1: ( ruleEntityMockResources EOF )
+            // InternalEntityMockDSL.g:194:1: ruleEntityMockResources EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockResources();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockResources"
+
+
+    // $ANTLR start "ruleEntityMockResources"
+    // InternalEntityMockDSL.g:201:1: ruleEntityMockResources : ( ( rule__EntityMockResources__Group__0 ) ) ;
+    public final void ruleEntityMockResources() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:205:2: ( ( ( rule__EntityMockResources__Group__0 ) ) )
+            // InternalEntityMockDSL.g:206:2: ( ( rule__EntityMockResources__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:206:2: ( ( rule__EntityMockResources__Group__0 ) )
+            // InternalEntityMockDSL.g:207:3: ( rule__EntityMockResources__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:208:3: ( rule__EntityMockResources__Group__0 )
+            // InternalEntityMockDSL.g:208:4: rule__EntityMockResources__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockResources"
+
+
+    // $ANTLR start "entryRuleEntityMockResource"
+    // InternalEntityMockDSL.g:217:1: entryRuleEntityMockResource : ruleEntityMockResource EOF ;
+    public final void entryRuleEntityMockResource() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:218:1: ( ruleEntityMockResource EOF )
+            // InternalEntityMockDSL.g:219:1: ruleEntityMockResource EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockResource();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockResource"
+
+
+    // $ANTLR start "ruleEntityMockResource"
+    // InternalEntityMockDSL.g:226:1: ruleEntityMockResource : ( ( rule__EntityMockResource__Group__0 ) ) ;
+    public final void ruleEntityMockResource() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:230:2: ( ( ( rule__EntityMockResource__Group__0 ) ) )
+            // InternalEntityMockDSL.g:231:2: ( ( rule__EntityMockResource__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:231:2: ( ( rule__EntityMockResource__Group__0 ) )
+            // InternalEntityMockDSL.g:232:3: ( rule__EntityMockResource__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:233:3: ( rule__EntityMockResource__Group__0 )
+            // InternalEntityMockDSL.g:233:4: rule__EntityMockResource__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockResource"
+
+
+    // $ANTLR start "entryRuleEntityMockResourceAttribute"
+    // InternalEntityMockDSL.g:242:1: entryRuleEntityMockResourceAttribute : ruleEntityMockResourceAttribute EOF ;
+    public final void entryRuleEntityMockResourceAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:243:1: ( ruleEntityMockResourceAttribute EOF )
+            // InternalEntityMockDSL.g:244:1: ruleEntityMockResourceAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockResourceAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockResourceAttribute"
+
+
+    // $ANTLR start "ruleEntityMockResourceAttribute"
+    // InternalEntityMockDSL.g:251:1: ruleEntityMockResourceAttribute : ( ( rule__EntityMockResourceAttribute__Group__0 ) ) ;
+    public final void ruleEntityMockResourceAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:255:2: ( ( ( rule__EntityMockResourceAttribute__Group__0 ) ) )
+            // InternalEntityMockDSL.g:256:2: ( ( rule__EntityMockResourceAttribute__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:256:2: ( ( rule__EntityMockResourceAttribute__Group__0 ) )
+            // InternalEntityMockDSL.g:257:3: ( rule__EntityMockResourceAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAttributeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:258:3: ( rule__EntityMockResourceAttribute__Group__0 )
+            // InternalEntityMockDSL.g:258:4: rule__EntityMockResourceAttribute__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockResourceAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockResourceDataRow"
+    // InternalEntityMockDSL.g:267:1: entryRuleEntityMockResourceDataRow : ruleEntityMockResourceDataRow EOF ;
+    public final void entryRuleEntityMockResourceDataRow() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:268:1: ( ruleEntityMockResourceDataRow EOF )
+            // InternalEntityMockDSL.g:269:1: ruleEntityMockResourceDataRow EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockResourceDataRow();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockResourceDataRow"
+
+
+    // $ANTLR start "ruleEntityMockResourceDataRow"
+    // InternalEntityMockDSL.g:276:1: ruleEntityMockResourceDataRow : ( ( rule__EntityMockResourceDataRow__Group__0 ) ) ;
+    public final void ruleEntityMockResourceDataRow() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:280:2: ( ( ( rule__EntityMockResourceDataRow__Group__0 ) ) )
+            // InternalEntityMockDSL.g:281:2: ( ( rule__EntityMockResourceDataRow__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:281:2: ( ( rule__EntityMockResourceDataRow__Group__0 ) )
+            // InternalEntityMockDSL.g:282:3: ( rule__EntityMockResourceDataRow__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:283:3: ( rule__EntityMockResourceDataRow__Group__0 )
+            // InternalEntityMockDSL.g:283:4: rule__EntityMockResourceDataRow__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockResourceDataRow"
+
+
+    // $ANTLR start "entryRuleEntityMockObjects"
+    // InternalEntityMockDSL.g:292:1: entryRuleEntityMockObjects : ruleEntityMockObjects EOF ;
+    public final void entryRuleEntityMockObjects() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:293:1: ( ruleEntityMockObjects EOF )
+            // InternalEntityMockDSL.g:294:1: ruleEntityMockObjects EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjects();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjects"
+
+
+    // $ANTLR start "ruleEntityMockObjects"
+    // InternalEntityMockDSL.g:301:1: ruleEntityMockObjects : ( ( rule__EntityMockObjects__Group__0 ) ) ;
+    public final void ruleEntityMockObjects() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:305:2: ( ( ( rule__EntityMockObjects__Group__0 ) ) )
+            // InternalEntityMockDSL.g:306:2: ( ( rule__EntityMockObjects__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:306:2: ( ( rule__EntityMockObjects__Group__0 ) )
+            // InternalEntityMockDSL.g:307:3: ( rule__EntityMockObjects__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:308:3: ( rule__EntityMockObjects__Group__0 )
+            // InternalEntityMockDSL.g:308:4: rule__EntityMockObjects__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjects"
+
+
+    // $ANTLR start "entryRuleEntityMockObject"
+    // InternalEntityMockDSL.g:317:1: entryRuleEntityMockObject : ruleEntityMockObject EOF ;
+    public final void entryRuleEntityMockObject() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:318:1: ( ruleEntityMockObject EOF )
+            // InternalEntityMockDSL.g:319:1: ruleEntityMockObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObject"
+
+
+    // $ANTLR start "ruleEntityMockObject"
+    // InternalEntityMockDSL.g:326:1: ruleEntityMockObject : ( ( rule__EntityMockObject__Group__0 ) ) ;
+    public final void ruleEntityMockObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:330:2: ( ( ( rule__EntityMockObject__Group__0 ) ) )
+            // InternalEntityMockDSL.g:331:2: ( ( rule__EntityMockObject__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:331:2: ( ( rule__EntityMockObject__Group__0 ) )
+            // InternalEntityMockDSL.g:332:3: ( rule__EntityMockObject__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:333:3: ( rule__EntityMockObject__Group__0 )
+            // InternalEntityMockDSL.g:333:4: rule__EntityMockObject__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObject"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectEnum"
+    // InternalEntityMockDSL.g:342:1: entryRuleEntityMockObjectEnum : ruleEntityMockObjectEnum EOF ;
+    public final void entryRuleEntityMockObjectEnum() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:343:1: ( ruleEntityMockObjectEnum EOF )
+            // InternalEntityMockDSL.g:344:1: ruleEntityMockObjectEnum EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectEnum();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectEnum"
+
+
+    // $ANTLR start "ruleEntityMockObjectEnum"
+    // InternalEntityMockDSL.g:351:1: ruleEntityMockObjectEnum : ( ( rule__EntityMockObjectEnum__Group__0 ) ) ;
+    public final void ruleEntityMockObjectEnum() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:355:2: ( ( ( rule__EntityMockObjectEnum__Group__0 ) ) )
+            // InternalEntityMockDSL.g:356:2: ( ( rule__EntityMockObjectEnum__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:356:2: ( ( rule__EntityMockObjectEnum__Group__0 ) )
+            // InternalEntityMockDSL.g:357:3: ( rule__EntityMockObjectEnum__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:358:3: ( rule__EntityMockObjectEnum__Group__0 )
+            // InternalEntityMockDSL.g:358:4: rule__EntityMockObjectEnum__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectEnum"
+
+
+    // $ANTLR start "entryRuleIEntityMockObjectAttribute"
+    // InternalEntityMockDSL.g:367:1: entryRuleIEntityMockObjectAttribute : ruleIEntityMockObjectAttribute EOF ;
+    public final void entryRuleIEntityMockObjectAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:368:1: ( ruleIEntityMockObjectAttribute EOF )
+            // InternalEntityMockDSL.g:369:1: ruleIEntityMockObjectAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIEntityMockObjectAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleIEntityMockObjectAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIEntityMockObjectAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIEntityMockObjectAttribute"
+
+
+    // $ANTLR start "ruleIEntityMockObjectAttribute"
+    // InternalEntityMockDSL.g:376:1: ruleIEntityMockObjectAttribute : ( ( rule__IEntityMockObjectAttribute__Alternatives ) ) ;
+    public final void ruleIEntityMockObjectAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:380:2: ( ( ( rule__IEntityMockObjectAttribute__Alternatives ) ) )
+            // InternalEntityMockDSL.g:381:2: ( ( rule__IEntityMockObjectAttribute__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:381:2: ( ( rule__IEntityMockObjectAttribute__Alternatives ) )
+            // InternalEntityMockDSL.g:382:3: ( rule__IEntityMockObjectAttribute__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIEntityMockObjectAttributeAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:383:3: ( rule__IEntityMockObjectAttribute__Alternatives )
+            // InternalEntityMockDSL.g:383:4: rule__IEntityMockObjectAttribute__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__IEntityMockObjectAttribute__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIEntityMockObjectAttributeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIEntityMockObjectAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectPlainValue"
+    // InternalEntityMockDSL.g:392:1: entryRuleEntityMockObjectPlainValue : ruleEntityMockObjectPlainValue EOF ;
+    public final void entryRuleEntityMockObjectPlainValue() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:393:1: ( ruleEntityMockObjectPlainValue EOF )
+            // InternalEntityMockDSL.g:394:1: ruleEntityMockObjectPlainValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectPlainValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectPlainValue"
+
+
+    // $ANTLR start "ruleEntityMockObjectPlainValue"
+    // InternalEntityMockDSL.g:401:1: ruleEntityMockObjectPlainValue : ( ( rule__EntityMockObjectPlainValue__Group__0 ) ) ;
+    public final void ruleEntityMockObjectPlainValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:405:2: ( ( ( rule__EntityMockObjectPlainValue__Group__0 ) ) )
+            // InternalEntityMockDSL.g:406:2: ( ( rule__EntityMockObjectPlainValue__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:406:2: ( ( rule__EntityMockObjectPlainValue__Group__0 ) )
+            // InternalEntityMockDSL.g:407:3: ( rule__EntityMockObjectPlainValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:408:3: ( rule__EntityMockObjectPlainValue__Group__0 )
+            // InternalEntityMockDSL.g:408:4: rule__EntityMockObjectPlainValue__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectPlainValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectResourceValue"
+    // InternalEntityMockDSL.g:417:1: entryRuleEntityMockObjectResourceValue : ruleEntityMockObjectResourceValue EOF ;
+    public final void entryRuleEntityMockObjectResourceValue() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:418:1: ( ruleEntityMockObjectResourceValue EOF )
+            // InternalEntityMockDSL.g:419:1: ruleEntityMockObjectResourceValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectResourceValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectResourceValue"
+
+
+    // $ANTLR start "ruleEntityMockObjectResourceValue"
+    // InternalEntityMockDSL.g:426:1: ruleEntityMockObjectResourceValue : ( ( rule__EntityMockObjectResourceValue__Group__0 ) ) ;
+    public final void ruleEntityMockObjectResourceValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:430:2: ( ( ( rule__EntityMockObjectResourceValue__Group__0 ) ) )
+            // InternalEntityMockDSL.g:431:2: ( ( rule__EntityMockObjectResourceValue__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:431:2: ( ( rule__EntityMockObjectResourceValue__Group__0 ) )
+            // InternalEntityMockDSL.g:432:3: ( rule__EntityMockObjectResourceValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:433:3: ( rule__EntityMockObjectResourceValue__Group__0 )
+            // InternalEntityMockDSL.g:433:4: rule__EntityMockObjectResourceValue__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectResourceValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectArrayValue"
+    // InternalEntityMockDSL.g:442:1: entryRuleEntityMockObjectArrayValue : ruleEntityMockObjectArrayValue EOF ;
+    public final void entryRuleEntityMockObjectArrayValue() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:443:1: ( ruleEntityMockObjectArrayValue EOF )
+            // InternalEntityMockDSL.g:444:1: ruleEntityMockObjectArrayValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectArrayValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectArrayValue"
+
+
+    // $ANTLR start "ruleEntityMockObjectArrayValue"
+    // InternalEntityMockDSL.g:451:1: ruleEntityMockObjectArrayValue : ( ( rule__EntityMockObjectArrayValue__Group__0 ) ) ;
+    public final void ruleEntityMockObjectArrayValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:455:2: ( ( ( rule__EntityMockObjectArrayValue__Group__0 ) ) )
+            // InternalEntityMockDSL.g:456:2: ( ( rule__EntityMockObjectArrayValue__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:456:2: ( ( rule__EntityMockObjectArrayValue__Group__0 ) )
+            // InternalEntityMockDSL.g:457:3: ( rule__EntityMockObjectArrayValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:458:3: ( rule__EntityMockObjectArrayValue__Group__0 )
+            // InternalEntityMockDSL.g:458:4: rule__EntityMockObjectArrayValue__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectArrayValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectItemValue"
+    // InternalEntityMockDSL.g:467:1: entryRuleEntityMockObjectItemValue : ruleEntityMockObjectItemValue EOF ;
+    public final void entryRuleEntityMockObjectItemValue() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:468:1: ( ruleEntityMockObjectItemValue EOF )
+            // InternalEntityMockDSL.g:469:1: ruleEntityMockObjectItemValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectItemValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectItemValue"
+
+
+    // $ANTLR start "ruleEntityMockObjectItemValue"
+    // InternalEntityMockDSL.g:476:1: ruleEntityMockObjectItemValue : ( ( rule__EntityMockObjectItemValue__Group__0 ) ) ;
+    public final void ruleEntityMockObjectItemValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:480:2: ( ( ( rule__EntityMockObjectItemValue__Group__0 ) ) )
+            // InternalEntityMockDSL.g:481:2: ( ( rule__EntityMockObjectItemValue__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:481:2: ( ( rule__EntityMockObjectItemValue__Group__0 ) )
+            // InternalEntityMockDSL.g:482:3: ( rule__EntityMockObjectItemValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:483:3: ( rule__EntityMockObjectItemValue__Group__0 )
+            // InternalEntityMockDSL.g:483:4: rule__EntityMockObjectItemValue__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectItemValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectEmbed"
+    // InternalEntityMockDSL.g:492:1: entryRuleEntityMockObjectEmbed : ruleEntityMockObjectEmbed EOF ;
+    public final void entryRuleEntityMockObjectEmbed() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:493:1: ( ruleEntityMockObjectEmbed EOF )
+            // InternalEntityMockDSL.g:494:1: ruleEntityMockObjectEmbed EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectEmbed();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectEmbed"
+
+
+    // $ANTLR start "ruleEntityMockObjectEmbed"
+    // InternalEntityMockDSL.g:501:1: ruleEntityMockObjectEmbed : ( ( rule__EntityMockObjectEmbed__Group__0 ) ) ;
+    public final void ruleEntityMockObjectEmbed() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:505:2: ( ( ( rule__EntityMockObjectEmbed__Group__0 ) ) )
+            // InternalEntityMockDSL.g:506:2: ( ( rule__EntityMockObjectEmbed__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:506:2: ( ( rule__EntityMockObjectEmbed__Group__0 ) )
+            // InternalEntityMockDSL.g:507:3: ( rule__EntityMockObjectEmbed__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:508:3: ( rule__EntityMockObjectEmbed__Group__0 )
+            // InternalEntityMockDSL.g:508:4: rule__EntityMockObjectEmbed__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectEmbed"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectFunction"
+    // InternalEntityMockDSL.g:517:1: entryRuleEntityMockObjectFunction : ruleEntityMockObjectFunction EOF ;
+    public final void entryRuleEntityMockObjectFunction() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:518:1: ( ruleEntityMockObjectFunction EOF )
+            // InternalEntityMockDSL.g:519:1: ruleEntityMockObjectFunction EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectFunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectFunction"
+
+
+    // $ANTLR start "ruleEntityMockObjectFunction"
+    // InternalEntityMockDSL.g:526:1: ruleEntityMockObjectFunction : ( ( rule__EntityMockObjectFunction__Group__0 ) ) ;
+    public final void ruleEntityMockObjectFunction() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:530:2: ( ( ( rule__EntityMockObjectFunction__Group__0 ) ) )
+            // InternalEntityMockDSL.g:531:2: ( ( rule__EntityMockObjectFunction__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:531:2: ( ( rule__EntityMockObjectFunction__Group__0 ) )
+            // InternalEntityMockDSL.g:532:3: ( rule__EntityMockObjectFunction__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:533:3: ( rule__EntityMockObjectFunction__Group__0 )
+            // InternalEntityMockDSL.g:533:4: rule__EntityMockObjectFunction__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectFunction"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectFunctionParameter"
+    // InternalEntityMockDSL.g:542:1: entryRuleEntityMockObjectFunctionParameter : ruleEntityMockObjectFunctionParameter EOF ;
+    public final void entryRuleEntityMockObjectFunctionParameter() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:543:1: ( ruleEntityMockObjectFunctionParameter EOF )
+            // InternalEntityMockDSL.g:544:1: ruleEntityMockObjectFunctionParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectFunctionParameter"
+
+
+    // $ANTLR start "ruleEntityMockObjectFunctionParameter"
+    // InternalEntityMockDSL.g:551:1: ruleEntityMockObjectFunctionParameter : ( ( rule__EntityMockObjectFunctionParameter__Group__0 ) ) ;
+    public final void ruleEntityMockObjectFunctionParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:555:2: ( ( ( rule__EntityMockObjectFunctionParameter__Group__0 ) ) )
+            // InternalEntityMockDSL.g:556:2: ( ( rule__EntityMockObjectFunctionParameter__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:556:2: ( ( rule__EntityMockObjectFunctionParameter__Group__0 ) )
+            // InternalEntityMockDSL.g:557:3: ( rule__EntityMockObjectFunctionParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:558:3: ( rule__EntityMockObjectFunctionParameter__Group__0 )
+            // InternalEntityMockDSL.g:558:4: rule__EntityMockObjectFunctionParameter__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunctionParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectFunctionParameter"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectFill"
+    // InternalEntityMockDSL.g:567:1: entryRuleEntityMockObjectFill : ruleEntityMockObjectFill EOF ;
+    public final void entryRuleEntityMockObjectFill() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:568:1: ( ruleEntityMockObjectFill EOF )
+            // InternalEntityMockDSL.g:569:1: ruleEntityMockObjectFill EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockObjectFill();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectFill"
+
+
+    // $ANTLR start "ruleEntityMockObjectFill"
+    // InternalEntityMockDSL.g:576:1: ruleEntityMockObjectFill : ( ( rule__EntityMockObjectFill__Group__0 ) ) ;
+    public final void ruleEntityMockObjectFill() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:580:2: ( ( ( rule__EntityMockObjectFill__Group__0 ) ) )
+            // InternalEntityMockDSL.g:581:2: ( ( rule__EntityMockObjectFill__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:581:2: ( ( rule__EntityMockObjectFill__Group__0 ) )
+            // InternalEntityMockDSL.g:582:3: ( rule__EntityMockObjectFill__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:583:3: ( rule__EntityMockObjectFill__Group__0 )
+            // InternalEntityMockDSL.g:583:4: rule__EntityMockObjectFill__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockObjectFill"
+
+
+    // $ANTLR start "entryRulePropertyFillerType"
+    // InternalEntityMockDSL.g:592:1: entryRulePropertyFillerType : rulePropertyFillerType EOF ;
+    public final void entryRulePropertyFillerType() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:593:1: ( rulePropertyFillerType EOF )
+            // InternalEntityMockDSL.g:594:1: rulePropertyFillerType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTypeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTypeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerType"
+
+
+    // $ANTLR start "rulePropertyFillerType"
+    // InternalEntityMockDSL.g:601:1: rulePropertyFillerType : ( ( rule__PropertyFillerType__Alternatives ) ) ;
+    public final void rulePropertyFillerType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:605:2: ( ( ( rule__PropertyFillerType__Alternatives ) ) )
+            // InternalEntityMockDSL.g:606:2: ( ( rule__PropertyFillerType__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:606:2: ( ( rule__PropertyFillerType__Alternatives ) )
+            // InternalEntityMockDSL.g:607:3: ( rule__PropertyFillerType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTypeAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:608:3: ( rule__PropertyFillerType__Alternatives )
+            // InternalEntityMockDSL.g:608:4: rule__PropertyFillerType__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerType"
+
+
+    // $ANTLR start "entryRulePropertyFillerDateFuture"
+    // InternalEntityMockDSL.g:617:1: entryRulePropertyFillerDateFuture : rulePropertyFillerDateFuture EOF ;
+    public final void entryRulePropertyFillerDateFuture() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:618:1: ( rulePropertyFillerDateFuture EOF )
+            // InternalEntityMockDSL.g:619:1: rulePropertyFillerDateFuture EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerDateFuture();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerDateFuture"
+
+
+    // $ANTLR start "rulePropertyFillerDateFuture"
+    // InternalEntityMockDSL.g:626:1: rulePropertyFillerDateFuture : ( ( rule__PropertyFillerDateFuture__Group__0 ) ) ;
+    public final void rulePropertyFillerDateFuture() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:630:2: ( ( ( rule__PropertyFillerDateFuture__Group__0 ) ) )
+            // InternalEntityMockDSL.g:631:2: ( ( rule__PropertyFillerDateFuture__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:631:2: ( ( rule__PropertyFillerDateFuture__Group__0 ) )
+            // InternalEntityMockDSL.g:632:3: ( rule__PropertyFillerDateFuture__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:633:3: ( rule__PropertyFillerDateFuture__Group__0 )
+            // InternalEntityMockDSL.g:633:4: rule__PropertyFillerDateFuture__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateFuture__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerDateFuture"
+
+
+    // $ANTLR start "entryRulePropertyFillerDatePast"
+    // InternalEntityMockDSL.g:642:1: entryRulePropertyFillerDatePast : rulePropertyFillerDatePast EOF ;
+    public final void entryRulePropertyFillerDatePast() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:643:1: ( rulePropertyFillerDatePast EOF )
+            // InternalEntityMockDSL.g:644:1: rulePropertyFillerDatePast EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerDatePast();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerDatePast"
+
+
+    // $ANTLR start "rulePropertyFillerDatePast"
+    // InternalEntityMockDSL.g:651:1: rulePropertyFillerDatePast : ( ( rule__PropertyFillerDatePast__Group__0 ) ) ;
+    public final void rulePropertyFillerDatePast() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:655:2: ( ( ( rule__PropertyFillerDatePast__Group__0 ) ) )
+            // InternalEntityMockDSL.g:656:2: ( ( rule__PropertyFillerDatePast__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:656:2: ( ( rule__PropertyFillerDatePast__Group__0 ) )
+            // InternalEntityMockDSL.g:657:3: ( rule__PropertyFillerDatePast__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:658:3: ( rule__PropertyFillerDatePast__Group__0 )
+            // InternalEntityMockDSL.g:658:4: rule__PropertyFillerDatePast__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDatePast__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerDatePast"
+
+
+    // $ANTLR start "entryRulePropertyFillerBoolean"
+    // InternalEntityMockDSL.g:667:1: entryRulePropertyFillerBoolean : rulePropertyFillerBoolean EOF ;
+    public final void entryRulePropertyFillerBoolean() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:668:1: ( rulePropertyFillerBoolean EOF )
+            // InternalEntityMockDSL.g:669:1: rulePropertyFillerBoolean EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerBooleanRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerBoolean();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerBooleanRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerBoolean"
+
+
+    // $ANTLR start "rulePropertyFillerBoolean"
+    // InternalEntityMockDSL.g:676:1: rulePropertyFillerBoolean : ( ( rule__PropertyFillerBoolean__Group__0 ) ) ;
+    public final void rulePropertyFillerBoolean() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:680:2: ( ( ( rule__PropertyFillerBoolean__Group__0 ) ) )
+            // InternalEntityMockDSL.g:681:2: ( ( rule__PropertyFillerBoolean__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:681:2: ( ( rule__PropertyFillerBoolean__Group__0 ) )
+            // InternalEntityMockDSL.g:682:3: ( rule__PropertyFillerBoolean__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerBooleanAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:683:3: ( rule__PropertyFillerBoolean__Group__0 )
+            // InternalEntityMockDSL.g:683:4: rule__PropertyFillerBoolean__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerBoolean__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerBooleanAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerBoolean"
+
+
+    // $ANTLR start "entryRulePropertyFillerDateRange"
+    // InternalEntityMockDSL.g:692:1: entryRulePropertyFillerDateRange : rulePropertyFillerDateRange EOF ;
+    public final void entryRulePropertyFillerDateRange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:693:1: ( rulePropertyFillerDateRange EOF )
+            // InternalEntityMockDSL.g:694:1: rulePropertyFillerDateRange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerDateRange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerDateRange"
+
+
+    // $ANTLR start "rulePropertyFillerDateRange"
+    // InternalEntityMockDSL.g:701:1: rulePropertyFillerDateRange : ( ( rule__PropertyFillerDateRange__Group__0 ) ) ;
+    public final void rulePropertyFillerDateRange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:705:2: ( ( ( rule__PropertyFillerDateRange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:706:2: ( ( rule__PropertyFillerDateRange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:706:2: ( ( rule__PropertyFillerDateRange__Group__0 ) )
+            // InternalEntityMockDSL.g:707:3: ( rule__PropertyFillerDateRange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:708:3: ( rule__PropertyFillerDateRange__Group__0 )
+            // InternalEntityMockDSL.g:708:4: rule__PropertyFillerDateRange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerDateRange"
+
+
+    // $ANTLR start "entryRulePropertyFillerSignedDoubleRange"
+    // InternalEntityMockDSL.g:717:1: entryRulePropertyFillerSignedDoubleRange : rulePropertyFillerSignedDoubleRange EOF ;
+    public final void entryRulePropertyFillerSignedDoubleRange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:718:1: ( rulePropertyFillerSignedDoubleRange EOF )
+            // InternalEntityMockDSL.g:719:1: rulePropertyFillerSignedDoubleRange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerSignedDoubleRange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerSignedDoubleRange"
+
+
+    // $ANTLR start "rulePropertyFillerSignedDoubleRange"
+    // InternalEntityMockDSL.g:726:1: rulePropertyFillerSignedDoubleRange : ( ( rule__PropertyFillerSignedDoubleRange__Group__0 ) ) ;
+    public final void rulePropertyFillerSignedDoubleRange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:730:2: ( ( ( rule__PropertyFillerSignedDoubleRange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:731:2: ( ( rule__PropertyFillerSignedDoubleRange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:731:2: ( ( rule__PropertyFillerSignedDoubleRange__Group__0 ) )
+            // InternalEntityMockDSL.g:732:3: ( rule__PropertyFillerSignedDoubleRange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:733:3: ( rule__PropertyFillerSignedDoubleRange__Group__0 )
+            // InternalEntityMockDSL.g:733:4: rule__PropertyFillerSignedDoubleRange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerSignedDoubleRange"
+
+
+    // $ANTLR start "entryRulePropertyFillerSignedDoubleRandom"
+    // InternalEntityMockDSL.g:742:1: entryRulePropertyFillerSignedDoubleRandom : rulePropertyFillerSignedDoubleRandom EOF ;
+    public final void entryRulePropertyFillerSignedDoubleRandom() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:743:1: ( rulePropertyFillerSignedDoubleRandom EOF )
+            // InternalEntityMockDSL.g:744:1: rulePropertyFillerSignedDoubleRandom EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerSignedDoubleRandom();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerSignedDoubleRandom"
+
+
+    // $ANTLR start "rulePropertyFillerSignedDoubleRandom"
+    // InternalEntityMockDSL.g:751:1: rulePropertyFillerSignedDoubleRandom : ( ( rule__PropertyFillerSignedDoubleRandom__Group__0 ) ) ;
+    public final void rulePropertyFillerSignedDoubleRandom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:755:2: ( ( ( rule__PropertyFillerSignedDoubleRandom__Group__0 ) ) )
+            // InternalEntityMockDSL.g:756:2: ( ( rule__PropertyFillerSignedDoubleRandom__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:756:2: ( ( rule__PropertyFillerSignedDoubleRandom__Group__0 ) )
+            // InternalEntityMockDSL.g:757:3: ( rule__PropertyFillerSignedDoubleRandom__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:758:3: ( rule__PropertyFillerSignedDoubleRandom__Group__0 )
+            // InternalEntityMockDSL.g:758:4: rule__PropertyFillerSignedDoubleRandom__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRandom__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerSignedDoubleRandom"
+
+
+    // $ANTLR start "entryRulePropertyFillerSignedIntegerRange"
+    // InternalEntityMockDSL.g:767:1: entryRulePropertyFillerSignedIntegerRange : rulePropertyFillerSignedIntegerRange EOF ;
+    public final void entryRulePropertyFillerSignedIntegerRange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:768:1: ( rulePropertyFillerSignedIntegerRange EOF )
+            // InternalEntityMockDSL.g:769:1: rulePropertyFillerSignedIntegerRange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerSignedIntegerRange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerSignedIntegerRange"
+
+
+    // $ANTLR start "rulePropertyFillerSignedIntegerRange"
+    // InternalEntityMockDSL.g:776:1: rulePropertyFillerSignedIntegerRange : ( ( rule__PropertyFillerSignedIntegerRange__Group__0 ) ) ;
+    public final void rulePropertyFillerSignedIntegerRange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:780:2: ( ( ( rule__PropertyFillerSignedIntegerRange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:781:2: ( ( rule__PropertyFillerSignedIntegerRange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:781:2: ( ( rule__PropertyFillerSignedIntegerRange__Group__0 ) )
+            // InternalEntityMockDSL.g:782:3: ( rule__PropertyFillerSignedIntegerRange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:783:3: ( rule__PropertyFillerSignedIntegerRange__Group__0 )
+            // InternalEntityMockDSL.g:783:4: rule__PropertyFillerSignedIntegerRange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerSignedIntegerRange"
+
+
+    // $ANTLR start "entryRulePropertyFillerSignedIntegerRandom"
+    // InternalEntityMockDSL.g:792:1: entryRulePropertyFillerSignedIntegerRandom : rulePropertyFillerSignedIntegerRandom EOF ;
+    public final void entryRulePropertyFillerSignedIntegerRandom() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:793:1: ( rulePropertyFillerSignedIntegerRandom EOF )
+            // InternalEntityMockDSL.g:794:1: rulePropertyFillerSignedIntegerRandom EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerSignedIntegerRandom();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerSignedIntegerRandom"
+
+
+    // $ANTLR start "rulePropertyFillerSignedIntegerRandom"
+    // InternalEntityMockDSL.g:801:1: rulePropertyFillerSignedIntegerRandom : ( ( rule__PropertyFillerSignedIntegerRandom__Group__0 ) ) ;
+    public final void rulePropertyFillerSignedIntegerRandom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:805:2: ( ( ( rule__PropertyFillerSignedIntegerRandom__Group__0 ) ) )
+            // InternalEntityMockDSL.g:806:2: ( ( rule__PropertyFillerSignedIntegerRandom__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:806:2: ( ( rule__PropertyFillerSignedIntegerRandom__Group__0 ) )
+            // InternalEntityMockDSL.g:807:3: ( rule__PropertyFillerSignedIntegerRandom__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:808:3: ( rule__PropertyFillerSignedIntegerRandom__Group__0 )
+            // InternalEntityMockDSL.g:808:4: rule__PropertyFillerSignedIntegerRandom__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRandom__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerSignedIntegerRandom"
+
+
+    // $ANTLR start "entryRulePropertyFillerTextRandom"
+    // InternalEntityMockDSL.g:817:1: entryRulePropertyFillerTextRandom : rulePropertyFillerTextRandom EOF ;
+    public final void entryRulePropertyFillerTextRandom() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:818:1: ( rulePropertyFillerTextRandom EOF )
+            // InternalEntityMockDSL.g:819:1: rulePropertyFillerTextRandom EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerTextRandom();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerTextRandom"
+
+
+    // $ANTLR start "rulePropertyFillerTextRandom"
+    // InternalEntityMockDSL.g:826:1: rulePropertyFillerTextRandom : ( ( rule__PropertyFillerTextRandom__Group__0 ) ) ;
+    public final void rulePropertyFillerTextRandom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:830:2: ( ( ( rule__PropertyFillerTextRandom__Group__0 ) ) )
+            // InternalEntityMockDSL.g:831:2: ( ( rule__PropertyFillerTextRandom__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:831:2: ( ( rule__PropertyFillerTextRandom__Group__0 ) )
+            // InternalEntityMockDSL.g:832:3: ( rule__PropertyFillerTextRandom__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:833:3: ( rule__PropertyFillerTextRandom__Group__0 )
+            // InternalEntityMockDSL.g:833:4: rule__PropertyFillerTextRandom__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextRandom__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerTextRandom"
+
+
+    // $ANTLR start "entryRulePropertyFillerTextParagraphs"
+    // InternalEntityMockDSL.g:842:1: entryRulePropertyFillerTextParagraphs : rulePropertyFillerTextParagraphs EOF ;
+    public final void entryRulePropertyFillerTextParagraphs() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:843:1: ( rulePropertyFillerTextParagraphs EOF )
+            // InternalEntityMockDSL.g:844:1: rulePropertyFillerTextParagraphs EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerTextParagraphs();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerTextParagraphs"
+
+
+    // $ANTLR start "rulePropertyFillerTextParagraphs"
+    // InternalEntityMockDSL.g:851:1: rulePropertyFillerTextParagraphs : ( ( rule__PropertyFillerTextParagraphs__Group__0 ) ) ;
+    public final void rulePropertyFillerTextParagraphs() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:855:2: ( ( ( rule__PropertyFillerTextParagraphs__Group__0 ) ) )
+            // InternalEntityMockDSL.g:856:2: ( ( rule__PropertyFillerTextParagraphs__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:856:2: ( ( rule__PropertyFillerTextParagraphs__Group__0 ) )
+            // InternalEntityMockDSL.g:857:3: ( rule__PropertyFillerTextParagraphs__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:858:3: ( rule__PropertyFillerTextParagraphs__Group__0 )
+            // InternalEntityMockDSL.g:858:4: rule__PropertyFillerTextParagraphs__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextParagraphs__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerTextParagraphs"
+
+
+    // $ANTLR start "entryRulePropertyFillerTextSentences"
+    // InternalEntityMockDSL.g:867:1: entryRulePropertyFillerTextSentences : rulePropertyFillerTextSentences EOF ;
+    public final void entryRulePropertyFillerTextSentences() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:868:1: ( rulePropertyFillerTextSentences EOF )
+            // InternalEntityMockDSL.g:869:1: rulePropertyFillerTextSentences EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerTextSentences();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerTextSentences"
+
+
+    // $ANTLR start "rulePropertyFillerTextSentences"
+    // InternalEntityMockDSL.g:876:1: rulePropertyFillerTextSentences : ( ( rule__PropertyFillerTextSentences__Group__0 ) ) ;
+    public final void rulePropertyFillerTextSentences() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:880:2: ( ( ( rule__PropertyFillerTextSentences__Group__0 ) ) )
+            // InternalEntityMockDSL.g:881:2: ( ( rule__PropertyFillerTextSentences__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:881:2: ( ( rule__PropertyFillerTextSentences__Group__0 ) )
+            // InternalEntityMockDSL.g:882:3: ( rule__PropertyFillerTextSentences__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:883:3: ( rule__PropertyFillerTextSentences__Group__0 )
+            // InternalEntityMockDSL.g:883:4: rule__PropertyFillerTextSentences__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextSentences__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerTextSentences"
+
+
+    // $ANTLR start "entryRulePropertyFillerTextWords"
+    // InternalEntityMockDSL.g:892:1: entryRulePropertyFillerTextWords : rulePropertyFillerTextWords EOF ;
+    public final void entryRulePropertyFillerTextWords() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:893:1: ( rulePropertyFillerTextWords EOF )
+            // InternalEntityMockDSL.g:894:1: rulePropertyFillerTextWords EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerTextWords();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerTextWords"
+
+
+    // $ANTLR start "rulePropertyFillerTextWords"
+    // InternalEntityMockDSL.g:901:1: rulePropertyFillerTextWords : ( ( rule__PropertyFillerTextWords__Group__0 ) ) ;
+    public final void rulePropertyFillerTextWords() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:905:2: ( ( ( rule__PropertyFillerTextWords__Group__0 ) ) )
+            // InternalEntityMockDSL.g:906:2: ( ( rule__PropertyFillerTextWords__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:906:2: ( ( rule__PropertyFillerTextWords__Group__0 ) )
+            // InternalEntityMockDSL.g:907:3: ( rule__PropertyFillerTextWords__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:908:3: ( rule__PropertyFillerTextWords__Group__0 )
+            // InternalEntityMockDSL.g:908:4: rule__PropertyFillerTextWords__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextWords__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerTextWords"
+
+
+    // $ANTLR start "entryRulePropertyFillerUnsignedDoubleRange"
+    // InternalEntityMockDSL.g:917:1: entryRulePropertyFillerUnsignedDoubleRange : rulePropertyFillerUnsignedDoubleRange EOF ;
+    public final void entryRulePropertyFillerUnsignedDoubleRange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:918:1: ( rulePropertyFillerUnsignedDoubleRange EOF )
+            // InternalEntityMockDSL.g:919:1: rulePropertyFillerUnsignedDoubleRange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerUnsignedDoubleRange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerUnsignedDoubleRange"
+
+
+    // $ANTLR start "rulePropertyFillerUnsignedDoubleRange"
+    // InternalEntityMockDSL.g:926:1: rulePropertyFillerUnsignedDoubleRange : ( ( rule__PropertyFillerUnsignedDoubleRange__Group__0 ) ) ;
+    public final void rulePropertyFillerUnsignedDoubleRange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:930:2: ( ( ( rule__PropertyFillerUnsignedDoubleRange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:931:2: ( ( rule__PropertyFillerUnsignedDoubleRange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:931:2: ( ( rule__PropertyFillerUnsignedDoubleRange__Group__0 ) )
+            // InternalEntityMockDSL.g:932:3: ( rule__PropertyFillerUnsignedDoubleRange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:933:3: ( rule__PropertyFillerUnsignedDoubleRange__Group__0 )
+            // InternalEntityMockDSL.g:933:4: rule__PropertyFillerUnsignedDoubleRange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerUnsignedDoubleRange"
+
+
+    // $ANTLR start "entryRulePropertyFillerUnsignedDoubleRandom"
+    // InternalEntityMockDSL.g:942:1: entryRulePropertyFillerUnsignedDoubleRandom : rulePropertyFillerUnsignedDoubleRandom EOF ;
+    public final void entryRulePropertyFillerUnsignedDoubleRandom() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:943:1: ( rulePropertyFillerUnsignedDoubleRandom EOF )
+            // InternalEntityMockDSL.g:944:1: rulePropertyFillerUnsignedDoubleRandom EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerUnsignedDoubleRandom();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerUnsignedDoubleRandom"
+
+
+    // $ANTLR start "rulePropertyFillerUnsignedDoubleRandom"
+    // InternalEntityMockDSL.g:951:1: rulePropertyFillerUnsignedDoubleRandom : ( ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 ) ) ;
+    public final void rulePropertyFillerUnsignedDoubleRandom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:955:2: ( ( ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 ) ) )
+            // InternalEntityMockDSL.g:956:2: ( ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:956:2: ( ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 ) )
+            // InternalEntityMockDSL.g:957:3: ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:958:3: ( rule__PropertyFillerUnsignedDoubleRandom__Group__0 )
+            // InternalEntityMockDSL.g:958:4: rule__PropertyFillerUnsignedDoubleRandom__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerUnsignedDoubleRandom"
+
+
+    // $ANTLR start "entryRulePropertyFillerUnsignedIntegerRange"
+    // InternalEntityMockDSL.g:967:1: entryRulePropertyFillerUnsignedIntegerRange : rulePropertyFillerUnsignedIntegerRange EOF ;
+    public final void entryRulePropertyFillerUnsignedIntegerRange() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:968:1: ( rulePropertyFillerUnsignedIntegerRange EOF )
+            // InternalEntityMockDSL.g:969:1: rulePropertyFillerUnsignedIntegerRange EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerUnsignedIntegerRange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerUnsignedIntegerRange"
+
+
+    // $ANTLR start "rulePropertyFillerUnsignedIntegerRange"
+    // InternalEntityMockDSL.g:976:1: rulePropertyFillerUnsignedIntegerRange : ( ( rule__PropertyFillerUnsignedIntegerRange__Group__0 ) ) ;
+    public final void rulePropertyFillerUnsignedIntegerRange() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:980:2: ( ( ( rule__PropertyFillerUnsignedIntegerRange__Group__0 ) ) )
+            // InternalEntityMockDSL.g:981:2: ( ( rule__PropertyFillerUnsignedIntegerRange__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:981:2: ( ( rule__PropertyFillerUnsignedIntegerRange__Group__0 ) )
+            // InternalEntityMockDSL.g:982:3: ( rule__PropertyFillerUnsignedIntegerRange__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:983:3: ( rule__PropertyFillerUnsignedIntegerRange__Group__0 )
+            // InternalEntityMockDSL.g:983:4: rule__PropertyFillerUnsignedIntegerRange__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerUnsignedIntegerRange"
+
+
+    // $ANTLR start "entryRulePropertyFillerUnsignedIntegerRandom"
+    // InternalEntityMockDSL.g:992:1: entryRulePropertyFillerUnsignedIntegerRandom : rulePropertyFillerUnsignedIntegerRandom EOF ;
+    public final void entryRulePropertyFillerUnsignedIntegerRandom() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:993:1: ( rulePropertyFillerUnsignedIntegerRandom EOF )
+            // InternalEntityMockDSL.g:994:1: rulePropertyFillerUnsignedIntegerRandom EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyFillerUnsignedIntegerRandom();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyFillerUnsignedIntegerRandom"
+
+
+    // $ANTLR start "rulePropertyFillerUnsignedIntegerRandom"
+    // InternalEntityMockDSL.g:1001:1: rulePropertyFillerUnsignedIntegerRandom : ( ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 ) ) ;
+    public final void rulePropertyFillerUnsignedIntegerRandom() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1005:2: ( ( ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1006:2: ( ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1006:2: ( ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 ) )
+            // InternalEntityMockDSL.g:1007:3: ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1008:3: ( rule__PropertyFillerUnsignedIntegerRandom__Group__0 )
+            // InternalEntityMockDSL.g:1008:4: rule__PropertyFillerUnsignedIntegerRandom__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyFillerUnsignedIntegerRandom"
+
+
+    // $ANTLR start "entryRuleEntityMockEntities"
+    // InternalEntityMockDSL.g:1017:1: entryRuleEntityMockEntities : ruleEntityMockEntities EOF ;
+    public final void entryRuleEntityMockEntities() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1018:1: ( ruleEntityMockEntities EOF )
+            // InternalEntityMockDSL.g:1019:1: ruleEntityMockEntities EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockEntities();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockEntities"
+
+
+    // $ANTLR start "ruleEntityMockEntities"
+    // InternalEntityMockDSL.g:1026:1: ruleEntityMockEntities : ( ( rule__EntityMockEntities__Group__0 ) ) ;
+    public final void ruleEntityMockEntities() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1030:2: ( ( ( rule__EntityMockEntities__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1031:2: ( ( rule__EntityMockEntities__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1031:2: ( ( rule__EntityMockEntities__Group__0 ) )
+            // InternalEntityMockDSL.g:1032:3: ( rule__EntityMockEntities__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1033:3: ( rule__EntityMockEntities__Group__0 )
+            // InternalEntityMockDSL.g:1033:4: rule__EntityMockEntities__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockEntities"
+
+
+    // $ANTLR start "entryRuleEntityMockEntity"
+    // InternalEntityMockDSL.g:1042:1: entryRuleEntityMockEntity : ruleEntityMockEntity EOF ;
+    public final void entryRuleEntityMockEntity() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1043:1: ( ruleEntityMockEntity EOF )
+            // InternalEntityMockDSL.g:1044:1: ruleEntityMockEntity EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockEntity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockEntity"
+
+
+    // $ANTLR start "ruleEntityMockEntity"
+    // InternalEntityMockDSL.g:1051:1: ruleEntityMockEntity : ( ( rule__EntityMockEntity__Group__0 ) ) ;
+    public final void ruleEntityMockEntity() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1055:2: ( ( ( rule__EntityMockEntity__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1056:2: ( ( rule__EntityMockEntity__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1056:2: ( ( rule__EntityMockEntity__Group__0 ) )
+            // InternalEntityMockDSL.g:1057:3: ( rule__EntityMockEntity__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1058:3: ( rule__EntityMockEntity__Group__0 )
+            // InternalEntityMockDSL.g:1058:4: rule__EntityMockEntity__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockEntity"
+
+
+    // $ANTLR start "entryRuleIIterate"
+    // InternalEntityMockDSL.g:1067:1: entryRuleIIterate : ruleIIterate EOF ;
+    public final void entryRuleIIterate() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1068:1: ( ruleIIterate EOF )
+            // InternalEntityMockDSL.g:1069:1: ruleIIterate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIIterateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleIIterate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIIterateRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIIterate"
+
+
+    // $ANTLR start "ruleIIterate"
+    // InternalEntityMockDSL.g:1076:1: ruleIIterate : ( ( rule__IIterate__Alternatives ) ) ;
+    public final void ruleIIterate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1080:2: ( ( ( rule__IIterate__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1081:2: ( ( rule__IIterate__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1081:2: ( ( rule__IIterate__Alternatives ) )
+            // InternalEntityMockDSL.g:1082:3: ( rule__IIterate__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIIterateAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1083:3: ( rule__IIterate__Alternatives )
+            // InternalEntityMockDSL.g:1083:4: rule__IIterate__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__IIterate__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIIterateAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIIterate"
+
+
+    // $ANTLR start "entryRuleIntegerIterate"
+    // InternalEntityMockDSL.g:1092:1: entryRuleIntegerIterate : ruleIntegerIterate EOF ;
+    public final void entryRuleIntegerIterate() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1093:1: ( ruleIntegerIterate EOF )
+            // InternalEntityMockDSL.g:1094:1: ruleIntegerIterate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleIntegerIterate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIntegerIterate"
+
+
+    // $ANTLR start "ruleIntegerIterate"
+    // InternalEntityMockDSL.g:1101:1: ruleIntegerIterate : ( ( rule__IntegerIterate__Group__0 ) ) ;
+    public final void ruleIntegerIterate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1105:2: ( ( ( rule__IntegerIterate__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1106:2: ( ( rule__IntegerIterate__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1106:2: ( ( rule__IntegerIterate__Group__0 ) )
+            // InternalEntityMockDSL.g:1107:3: ( rule__IntegerIterate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1108:3: ( rule__IntegerIterate__Group__0 )
+            // InternalEntityMockDSL.g:1108:4: rule__IntegerIterate__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIntegerIterate"
+
+
+    // $ANTLR start "entryRuleDateIterate"
+    // InternalEntityMockDSL.g:1117:1: entryRuleDateIterate : ruleDateIterate EOF ;
+    public final void entryRuleDateIterate() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1118:1: ( ruleDateIterate EOF )
+            // InternalEntityMockDSL.g:1119:1: ruleDateIterate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDateIterate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDateIterate"
+
+
+    // $ANTLR start "ruleDateIterate"
+    // InternalEntityMockDSL.g:1126:1: ruleDateIterate : ( ( rule__DateIterate__Group__0 ) ) ;
+    public final void ruleDateIterate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1130:2: ( ( ( rule__DateIterate__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1131:2: ( ( rule__DateIterate__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1131:2: ( ( rule__DateIterate__Group__0 ) )
+            // InternalEntityMockDSL.g:1132:3: ( rule__DateIterate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1133:3: ( rule__DateIterate__Group__0 )
+            // InternalEntityMockDSL.g:1133:4: rule__DateIterate__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDateIterate"
+
+
+    // $ANTLR start "entryRuleDate"
+    // InternalEntityMockDSL.g:1142:1: entryRuleDate : ruleDate EOF ;
+    public final void entryRuleDate() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1143:1: ( ruleDate EOF )
+            // InternalEntityMockDSL.g:1144:1: ruleDate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDate"
+
+
+    // $ANTLR start "ruleDate"
+    // InternalEntityMockDSL.g:1151:1: ruleDate : ( ( rule__Date__Alternatives ) ) ;
+    public final void ruleDate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1155:2: ( ( ( rule__Date__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1156:2: ( ( rule__Date__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1156:2: ( ( rule__Date__Alternatives ) )
+            // InternalEntityMockDSL.g:1157:3: ( rule__Date__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1158:3: ( rule__Date__Alternatives )
+            // InternalEntityMockDSL.g:1158:4: rule__Date__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__Date__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDate"
+
+
+    // $ANTLR start "entryRuleEntityMockByResourceAttribute"
+    // InternalEntityMockDSL.g:1167:1: entryRuleEntityMockByResourceAttribute : ruleEntityMockByResourceAttribute EOF ;
+    public final void entryRuleEntityMockByResourceAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1168:1: ( ruleEntityMockByResourceAttribute EOF )
+            // InternalEntityMockDSL.g:1169:1: ruleEntityMockByResourceAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockByResourceAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockByResourceAttribute"
+
+
+    // $ANTLR start "ruleEntityMockByResourceAttribute"
+    // InternalEntityMockDSL.g:1176:1: ruleEntityMockByResourceAttribute : ( ( rule__EntityMockByResourceAttribute__Group__0 ) ) ;
+    public final void ruleEntityMockByResourceAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1180:2: ( ( ( rule__EntityMockByResourceAttribute__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1181:2: ( ( rule__EntityMockByResourceAttribute__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1181:2: ( ( rule__EntityMockByResourceAttribute__Group__0 ) )
+            // InternalEntityMockDSL.g:1182:3: ( rule__EntityMockByResourceAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1183:3: ( rule__EntityMockByResourceAttribute__Group__0 )
+            // InternalEntityMockDSL.g:1183:4: rule__EntityMockByResourceAttribute__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockByResourceAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockTemplate"
+    // InternalEntityMockDSL.g:1192:1: entryRuleEntityMockTemplate : ruleEntityMockTemplate EOF ;
+    public final void entryRuleEntityMockTemplate() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1193:1: ( ruleEntityMockTemplate EOF )
+            // InternalEntityMockDSL.g:1194:1: ruleEntityMockTemplate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockTemplate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockTemplate"
+
+
+    // $ANTLR start "ruleEntityMockTemplate"
+    // InternalEntityMockDSL.g:1201:1: ruleEntityMockTemplate : ( ( rule__EntityMockTemplate__Group__0 ) ) ;
+    public final void ruleEntityMockTemplate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1205:2: ( ( ( rule__EntityMockTemplate__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1206:2: ( ( rule__EntityMockTemplate__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1206:2: ( ( rule__EntityMockTemplate__Group__0 ) )
+            // InternalEntityMockDSL.g:1207:3: ( rule__EntityMockTemplate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1208:3: ( rule__EntityMockTemplate__Group__0 )
+            // InternalEntityMockDSL.g:1208:4: rule__EntityMockTemplate__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockTemplate"
+
+
+    // $ANTLR start "entryRuleIEntityMockAttribute"
+    // InternalEntityMockDSL.g:1217:1: entryRuleIEntityMockAttribute : ruleIEntityMockAttribute EOF ;
+    public final void entryRuleIEntityMockAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1218:1: ( ruleIEntityMockAttribute EOF )
+            // InternalEntityMockDSL.g:1219:1: ruleIEntityMockAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIEntityMockAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleIEntityMockAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIEntityMockAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIEntityMockAttribute"
+
+
+    // $ANTLR start "ruleIEntityMockAttribute"
+    // InternalEntityMockDSL.g:1226:1: ruleIEntityMockAttribute : ( ( rule__IEntityMockAttribute__Alternatives ) ) ;
+    public final void ruleIEntityMockAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1230:2: ( ( ( rule__IEntityMockAttribute__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1231:2: ( ( rule__IEntityMockAttribute__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1231:2: ( ( rule__IEntityMockAttribute__Alternatives ) )
+            // InternalEntityMockDSL.g:1232:3: ( rule__IEntityMockAttribute__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIEntityMockAttributeAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1233:3: ( rule__IEntityMockAttribute__Alternatives )
+            // InternalEntityMockDSL.g:1233:4: rule__IEntityMockAttribute__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__IEntityMockAttribute__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIEntityMockAttributeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIEntityMockAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityFunction"
+    // InternalEntityMockDSL.g:1242:1: entryRuleEntityMockEntityFunction : ruleEntityMockEntityFunction EOF ;
+    public final void entryRuleEntityMockEntityFunction() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1243:1: ( ruleEntityMockEntityFunction EOF )
+            // InternalEntityMockDSL.g:1244:1: ruleEntityMockEntityFunction EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockEntityFunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityFunction"
+
+
+    // $ANTLR start "ruleEntityMockEntityFunction"
+    // InternalEntityMockDSL.g:1251:1: ruleEntityMockEntityFunction : ( ( rule__EntityMockEntityFunction__Group__0 ) ) ;
+    public final void ruleEntityMockEntityFunction() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1255:2: ( ( ( rule__EntityMockEntityFunction__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1256:2: ( ( rule__EntityMockEntityFunction__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1256:2: ( ( rule__EntityMockEntityFunction__Group__0 ) )
+            // InternalEntityMockDSL.g:1257:3: ( rule__EntityMockEntityFunction__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1258:3: ( rule__EntityMockEntityFunction__Group__0 )
+            // InternalEntityMockDSL.g:1258:4: rule__EntityMockEntityFunction__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockEntityFunction"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityFunctionParameter"
+    // InternalEntityMockDSL.g:1267:1: entryRuleEntityMockEntityFunctionParameter : ruleEntityMockEntityFunctionParameter EOF ;
+    public final void entryRuleEntityMockEntityFunctionParameter() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1268:1: ( ruleEntityMockEntityFunctionParameter EOF )
+            // InternalEntityMockDSL.g:1269:1: ruleEntityMockEntityFunctionParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockEntityFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionParameterRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityFunctionParameter"
+
+
+    // $ANTLR start "ruleEntityMockEntityFunctionParameter"
+    // InternalEntityMockDSL.g:1276:1: ruleEntityMockEntityFunctionParameter : ( ( rule__EntityMockEntityFunctionParameter__Alternatives ) ) ;
+    public final void ruleEntityMockEntityFunctionParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1280:2: ( ( ( rule__EntityMockEntityFunctionParameter__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1281:2: ( ( rule__EntityMockEntityFunctionParameter__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1281:2: ( ( rule__EntityMockEntityFunctionParameter__Alternatives ) )
+            // InternalEntityMockDSL.g:1282:3: ( rule__EntityMockEntityFunctionParameter__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1283:3: ( rule__EntityMockEntityFunctionParameter__Alternatives )
+            // InternalEntityMockDSL.g:1283:4: rule__EntityMockEntityFunctionParameter__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunctionParameter__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockEntityFunctionParameter"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityNestedAttribute"
+    // InternalEntityMockDSL.g:1292:1: entryRuleEntityMockEntityNestedAttribute : ruleEntityMockEntityNestedAttribute EOF ;
+    public final void entryRuleEntityMockEntityNestedAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1293:1: ( ruleEntityMockEntityNestedAttribute EOF )
+            // InternalEntityMockDSL.g:1294:1: ruleEntityMockEntityNestedAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockEntityNestedAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityNestedAttribute"
+
+
+    // $ANTLR start "ruleEntityMockEntityNestedAttribute"
+    // InternalEntityMockDSL.g:1301:1: ruleEntityMockEntityNestedAttribute : ( ( rule__EntityMockEntityNestedAttribute__Group__0 ) ) ;
+    public final void ruleEntityMockEntityNestedAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1305:2: ( ( ( rule__EntityMockEntityNestedAttribute__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1306:2: ( ( rule__EntityMockEntityNestedAttribute__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1306:2: ( ( rule__EntityMockEntityNestedAttribute__Group__0 ) )
+            // InternalEntityMockDSL.g:1307:3: ( rule__EntityMockEntityNestedAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1308:3: ( rule__EntityMockEntityNestedAttribute__Group__0 )
+            // InternalEntityMockDSL.g:1308:4: rule__EntityMockEntityNestedAttribute__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockEntityNestedAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockReferencedObjectAttribute"
+    // InternalEntityMockDSL.g:1317:1: entryRuleEntityMockReferencedObjectAttribute : ruleEntityMockReferencedObjectAttribute EOF ;
+    public final void entryRuleEntityMockReferencedObjectAttribute() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1318:1: ( ruleEntityMockReferencedObjectAttribute EOF )
+            // InternalEntityMockDSL.g:1319:1: ruleEntityMockReferencedObjectAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockReferencedObjectAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockReferencedObjectAttribute"
+
+
+    // $ANTLR start "ruleEntityMockReferencedObjectAttribute"
+    // InternalEntityMockDSL.g:1326:1: ruleEntityMockReferencedObjectAttribute : ( ( rule__EntityMockReferencedObjectAttribute__Group__0 ) ) ;
+    public final void ruleEntityMockReferencedObjectAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1330:2: ( ( ( rule__EntityMockReferencedObjectAttribute__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1331:2: ( ( rule__EntityMockReferencedObjectAttribute__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1331:2: ( ( rule__EntityMockReferencedObjectAttribute__Group__0 ) )
+            // InternalEntityMockDSL.g:1332:3: ( rule__EntityMockReferencedObjectAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1333:3: ( rule__EntityMockReferencedObjectAttribute__Group__0 )
+            // InternalEntityMockDSL.g:1333:4: rule__EntityMockReferencedObjectAttribute__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockReferencedObjectAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeByObject"
+    // InternalEntityMockDSL.g:1342:1: entryRuleEntityMockAttributeByObject : ruleEntityMockAttributeByObject EOF ;
+    public final void entryRuleEntityMockAttributeByObject() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1343:1: ( ruleEntityMockAttributeByObject EOF )
+            // InternalEntityMockDSL.g:1344:1: ruleEntityMockAttributeByObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockAttributeByObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeByObject"
+
+
+    // $ANTLR start "ruleEntityMockAttributeByObject"
+    // InternalEntityMockDSL.g:1351:1: ruleEntityMockAttributeByObject : ( ( rule__EntityMockAttributeByObject__Alternatives ) ) ;
+    public final void ruleEntityMockAttributeByObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1355:2: ( ( ( rule__EntityMockAttributeByObject__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1356:2: ( ( rule__EntityMockAttributeByObject__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1356:2: ( ( rule__EntityMockAttributeByObject__Alternatives ) )
+            // InternalEntityMockDSL.g:1357:3: ( rule__EntityMockAttributeByObject__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1358:3: ( rule__EntityMockAttributeByObject__Alternatives )
+            // InternalEntityMockDSL.g:1358:4: rule__EntityMockAttributeByObject__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockAttributeByObject"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeFiller"
+    // InternalEntityMockDSL.g:1367:1: entryRuleEntityMockAttributeFiller : ruleEntityMockAttributeFiller EOF ;
+    public final void entryRuleEntityMockAttributeFiller() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1368:1: ( ruleEntityMockAttributeFiller EOF )
+            // InternalEntityMockDSL.g:1369:1: ruleEntityMockAttributeFiller EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockAttributeFiller();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeFiller"
+
+
+    // $ANTLR start "ruleEntityMockAttributeFiller"
+    // InternalEntityMockDSL.g:1376:1: ruleEntityMockAttributeFiller : ( ( rule__EntityMockAttributeFiller__Group__0 ) ) ;
+    public final void ruleEntityMockAttributeFiller() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1380:2: ( ( ( rule__EntityMockAttributeFiller__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1381:2: ( ( rule__EntityMockAttributeFiller__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1381:2: ( ( rule__EntityMockAttributeFiller__Group__0 ) )
+            // InternalEntityMockDSL.g:1382:3: ( rule__EntityMockAttributeFiller__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1383:3: ( rule__EntityMockAttributeFiller__Group__0 )
+            // InternalEntityMockDSL.g:1383:4: rule__EntityMockAttributeFiller__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockAttributeFiller"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeByReference"
+    // InternalEntityMockDSL.g:1392:1: entryRuleEntityMockAttributeByReference : ruleEntityMockAttributeByReference EOF ;
+    public final void entryRuleEntityMockAttributeByReference() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1393:1: ( ruleEntityMockAttributeByReference EOF )
+            // InternalEntityMockDSL.g:1394:1: ruleEntityMockAttributeByReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEntityMockAttributeByReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeByReference"
+
+
+    // $ANTLR start "ruleEntityMockAttributeByReference"
+    // InternalEntityMockDSL.g:1401:1: ruleEntityMockAttributeByReference : ( ( rule__EntityMockAttributeByReference__Group__0 ) ) ;
+    public final void ruleEntityMockAttributeByReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1405:2: ( ( ( rule__EntityMockAttributeByReference__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1406:2: ( ( rule__EntityMockAttributeByReference__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1406:2: ( ( rule__EntityMockAttributeByReference__Group__0 ) )
+            // InternalEntityMockDSL.g:1407:3: ( rule__EntityMockAttributeByReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1408:3: ( rule__EntityMockAttributeByReference__Group__0 )
+            // InternalEntityMockDSL.g:1408:4: rule__EntityMockAttributeByReference__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEntityMockAttributeByReference"
+
+
+    // $ANTLR start "entryRuleSignedNumber"
+    // InternalEntityMockDSL.g:1417:1: entryRuleSignedNumber : ruleSignedNumber EOF ;
+    public final void entryRuleSignedNumber() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1418:1: ( ruleSignedNumber EOF )
+            // InternalEntityMockDSL.g:1419:1: ruleSignedNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignedNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleSignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignedNumberRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignedNumber"
+
+
+    // $ANTLR start "ruleSignedNumber"
+    // InternalEntityMockDSL.g:1426:1: ruleSignedNumber : ( ( rule__SignedNumber__Group__0 ) ) ;
+    public final void ruleSignedNumber() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1430:2: ( ( ( rule__SignedNumber__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1431:2: ( ( rule__SignedNumber__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1431:2: ( ( rule__SignedNumber__Group__0 ) )
+            // InternalEntityMockDSL.g:1432:3: ( rule__SignedNumber__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignedNumberAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1433:3: ( rule__SignedNumber__Group__0 )
+            // InternalEntityMockDSL.g:1433:4: rule__SignedNumber__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__SignedNumber__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignedNumberAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignedNumber"
+
+
+    // $ANTLR start "entryRuleUnsignedNumber"
+    // InternalEntityMockDSL.g:1442:1: entryRuleUnsignedNumber : ruleUnsignedNumber EOF ;
+    public final void entryRuleUnsignedNumber() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1443:1: ( ruleUnsignedNumber EOF )
+            // InternalEntityMockDSL.g:1444:1: ruleUnsignedNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnsignedNumber"
+
+
+    // $ANTLR start "ruleUnsignedNumber"
+    // InternalEntityMockDSL.g:1451:1: ruleUnsignedNumber : ( ( rule__UnsignedNumber__Group__0 ) ) ;
+    public final void ruleUnsignedNumber() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1455:2: ( ( ( rule__UnsignedNumber__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1456:2: ( ( rule__UnsignedNumber__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1456:2: ( ( rule__UnsignedNumber__Group__0 ) )
+            // InternalEntityMockDSL.g:1457:3: ( rule__UnsignedNumber__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1458:3: ( rule__UnsignedNumber__Group__0 )
+            // InternalEntityMockDSL.g:1458:4: rule__UnsignedNumber__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__UnsignedNumber__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnsignedNumber"
+
+
+    // $ANTLR start "entryRuleSINT"
+    // InternalEntityMockDSL.g:1467:1: entryRuleSINT : ruleSINT EOF ;
+    public final void entryRuleSINT() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1468:1: ( ruleSINT EOF )
+            // InternalEntityMockDSL.g:1469:1: ruleSINT EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSINTRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSINTRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSINT"
+
+
+    // $ANTLR start "ruleSINT"
+    // InternalEntityMockDSL.g:1476:1: ruleSINT : ( ( rule__SINT__Group__0 ) ) ;
+    public final void ruleSINT() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1480:2: ( ( ( rule__SINT__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1481:2: ( ( rule__SINT__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1481:2: ( ( rule__SINT__Group__0 ) )
+            // InternalEntityMockDSL.g:1482:3: ( rule__SINT__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSINTAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1483:3: ( rule__SINT__Group__0 )
+            // InternalEntityMockDSL.g:1483:4: rule__SINT__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__SINT__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSINTAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSINT"
+
+
+    // $ANTLR start "entryRuleXImportDeclaration"
+    // InternalEntityMockDSL.g:1492:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
+    public final void entryRuleXImportDeclaration() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1493:1: ( ruleXImportDeclaration EOF )
+            // InternalEntityMockDSL.g:1494:1: ruleXImportDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXImportDeclaration"
+
+
+    // $ANTLR start "ruleXImportDeclaration"
+    // InternalEntityMockDSL.g:1501:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
+    public final void ruleXImportDeclaration() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1505:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1506:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1506:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalEntityMockDSL.g:1507:3: ( rule__XImportDeclaration__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1508:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalEntityMockDSL.g:1508:4: rule__XImportDeclaration__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXImportDeclaration"
+
+
+    // $ANTLR start "entryRuleXAnnotation"
+    // InternalEntityMockDSL.g:1517:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
+    public final void entryRuleXAnnotation() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1518:1: ( ruleXAnnotation EOF )
+            // InternalEntityMockDSL.g:1519:1: ruleXAnnotation EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAnnotation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAnnotation"
+
+
+    // $ANTLR start "ruleXAnnotation"
+    // InternalEntityMockDSL.g:1526:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
+    public final void ruleXAnnotation() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1530:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1531:2: ( ( rule__XAnnotation__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1531:2: ( ( rule__XAnnotation__Group__0 ) )
+            // InternalEntityMockDSL.g:1532:3: ( rule__XAnnotation__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1533:3: ( rule__XAnnotation__Group__0 )
+            // InternalEntityMockDSL.g:1533:4: rule__XAnnotation__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAnnotation"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValuePair"
+    // InternalEntityMockDSL.g:1542:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
+    public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1543:1: ( ruleXAnnotationElementValuePair EOF )
+            // InternalEntityMockDSL.g:1544:1: ruleXAnnotationElementValuePair EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAnnotationElementValuePair();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValuePair"
+
+
+    // $ANTLR start "ruleXAnnotationElementValuePair"
+    // InternalEntityMockDSL.g:1551:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
+    public final void ruleXAnnotationElementValuePair() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1555:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1556:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1556:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            // InternalEntityMockDSL.g:1557:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1558:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            // InternalEntityMockDSL.g:1558:4: rule__XAnnotationElementValuePair__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAnnotationElementValuePair"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
+    // InternalEntityMockDSL.g:1567:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
+    public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1568:1: ( ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalEntityMockDSL.g:1569:1: ruleXAnnotationElementValueOrCommaList EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAnnotationElementValueOrCommaList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"
+
+
+    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
+    // InternalEntityMockDSL.g:1576:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
+    public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1580:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1581:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1581:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            // InternalEntityMockDSL.g:1582:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1583:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            // InternalEntityMockDSL.g:1583:4: rule__XAnnotationElementValueOrCommaList__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValue"
+    // InternalEntityMockDSL.g:1592:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
+    public final void entryRuleXAnnotationElementValue() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1593:1: ( ruleXAnnotationElementValue EOF )
+            // InternalEntityMockDSL.g:1594:1: ruleXAnnotationElementValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAnnotationElementValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValue"
+
+
+    // $ANTLR start "ruleXAnnotationElementValue"
+    // InternalEntityMockDSL.g:1601:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
+    public final void ruleXAnnotationElementValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1605:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1606:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1606:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            // InternalEntityMockDSL.g:1607:3: ( rule__XAnnotationElementValue__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1608:3: ( rule__XAnnotationElementValue__Alternatives )
+            // InternalEntityMockDSL.g:1608:4: rule__XAnnotationElementValue__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAnnotationElementValue"
+
+
+    // $ANTLR start "entryRuleXAnnotationOrExpression"
+    // InternalEntityMockDSL.g:1617:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
+    public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1618:1: ( ruleXAnnotationOrExpression EOF )
+            // InternalEntityMockDSL.g:1619:1: ruleXAnnotationOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationOrExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationOrExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAnnotationOrExpression"
+
+
+    // $ANTLR start "ruleXAnnotationOrExpression"
+    // InternalEntityMockDSL.g:1626:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
+    public final void ruleXAnnotationOrExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1630:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1631:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1631:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            // InternalEntityMockDSL.g:1632:3: ( rule__XAnnotationOrExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1633:3: ( rule__XAnnotationOrExpression__Alternatives )
+            // InternalEntityMockDSL.g:1633:4: rule__XAnnotationOrExpression__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationOrExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAnnotationOrExpression"
+
+
+    // $ANTLR start "entryRuleXExpression"
+    // InternalEntityMockDSL.g:1642:1: entryRuleXExpression : ruleXExpression EOF ;
+    public final void entryRuleXExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1643:1: ( ruleXExpression EOF )
+            // InternalEntityMockDSL.g:1644:1: ruleXExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXExpression"
+
+
+    // $ANTLR start "ruleXExpression"
+    // InternalEntityMockDSL.g:1651:1: ruleXExpression : ( ruleXAssignment ) ;
+    public final void ruleXExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1655:2: ( ( ruleXAssignment ) )
+            // InternalEntityMockDSL.g:1656:2: ( ruleXAssignment )
+            {
+            // InternalEntityMockDSL.g:1656:2: ( ruleXAssignment )
+            // InternalEntityMockDSL.g:1657:3: ruleXAssignment
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXExpression"
+
+
+    // $ANTLR start "entryRuleXAssignment"
+    // InternalEntityMockDSL.g:1667:1: entryRuleXAssignment : ruleXAssignment EOF ;
+    public final void entryRuleXAssignment() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1668:1: ( ruleXAssignment EOF )
+            // InternalEntityMockDSL.g:1669:1: ruleXAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAssignment"
+
+
+    // $ANTLR start "ruleXAssignment"
+    // InternalEntityMockDSL.g:1676:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
+    public final void ruleXAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1680:2: ( ( ( rule__XAssignment__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1681:2: ( ( rule__XAssignment__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1681:2: ( ( rule__XAssignment__Alternatives ) )
+            // InternalEntityMockDSL.g:1682:3: ( rule__XAssignment__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1683:3: ( rule__XAssignment__Alternatives )
+            // InternalEntityMockDSL.g:1683:4: rule__XAssignment__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAssignment"
+
+
+    // $ANTLR start "entryRuleOpSingleAssign"
+    // InternalEntityMockDSL.g:1692:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
+    public final void entryRuleOpSingleAssign() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1693:1: ( ruleOpSingleAssign EOF )
+            // InternalEntityMockDSL.g:1694:1: ruleOpSingleAssign EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpSingleAssignRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpSingleAssign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpSingleAssignRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpSingleAssign"
+
+
+    // $ANTLR start "ruleOpSingleAssign"
+    // InternalEntityMockDSL.g:1701:1: ruleOpSingleAssign : ( '=' ) ;
+    public final void ruleOpSingleAssign() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1705:2: ( ( '=' ) )
+            // InternalEntityMockDSL.g:1706:2: ( '=' )
+            {
+            // InternalEntityMockDSL.g:1706:2: ( '=' )
+            // InternalEntityMockDSL.g:1707:3: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
+            }
+            match(input,13,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpSingleAssign"
+
+
+    // $ANTLR start "entryRuleOpMultiAssign"
+    // InternalEntityMockDSL.g:1717:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
+    public final void entryRuleOpMultiAssign() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1718:1: ( ruleOpMultiAssign EOF )
+            // InternalEntityMockDSL.g:1719:1: ruleOpMultiAssign EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpMultiAssign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpMultiAssign"
+
+
+    // $ANTLR start "ruleOpMultiAssign"
+    // InternalEntityMockDSL.g:1726:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
+    public final void ruleOpMultiAssign() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1730:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1731:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1731:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            // InternalEntityMockDSL.g:1732:3: ( rule__OpMultiAssign__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1733:3: ( rule__OpMultiAssign__Alternatives )
+            // InternalEntityMockDSL.g:1733:4: rule__OpMultiAssign__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpMultiAssign"
+
+
+    // $ANTLR start "entryRuleXOrExpression"
+    // InternalEntityMockDSL.g:1742:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
+    public final void entryRuleXOrExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1743:1: ( ruleXOrExpression EOF )
+            // InternalEntityMockDSL.g:1744:1: ruleXOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXOrExpression"
+
+
+    // $ANTLR start "ruleXOrExpression"
+    // InternalEntityMockDSL.g:1751:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
+    public final void ruleXOrExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1755:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1756:2: ( ( rule__XOrExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1756:2: ( ( rule__XOrExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:1757:3: ( rule__XOrExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1758:3: ( rule__XOrExpression__Group__0 )
+            // InternalEntityMockDSL.g:1758:4: rule__XOrExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXOrExpression"
+
+
+    // $ANTLR start "entryRuleOpOr"
+    // InternalEntityMockDSL.g:1767:1: entryRuleOpOr : ruleOpOr EOF ;
+    public final void entryRuleOpOr() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1768:1: ( ruleOpOr EOF )
+            // InternalEntityMockDSL.g:1769:1: ruleOpOr EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOrRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpOr();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOrRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpOr"
+
+
+    // $ANTLR start "ruleOpOr"
+    // InternalEntityMockDSL.g:1776:1: ruleOpOr : ( '||' ) ;
+    public final void ruleOpOr() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1780:2: ( ( '||' ) )
+            // InternalEntityMockDSL.g:1781:2: ( '||' )
+            {
+            // InternalEntityMockDSL.g:1781:2: ( '||' )
+            // InternalEntityMockDSL.g:1782:3: '||'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
+            }
+            match(input,14,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpOr"
+
+
+    // $ANTLR start "entryRuleXAndExpression"
+    // InternalEntityMockDSL.g:1792:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
+    public final void entryRuleXAndExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1793:1: ( ruleXAndExpression EOF )
+            // InternalEntityMockDSL.g:1794:1: ruleXAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAndExpression"
+
+
+    // $ANTLR start "ruleXAndExpression"
+    // InternalEntityMockDSL.g:1801:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
+    public final void ruleXAndExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1805:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1806:2: ( ( rule__XAndExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1806:2: ( ( rule__XAndExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:1807:3: ( rule__XAndExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1808:3: ( rule__XAndExpression__Group__0 )
+            // InternalEntityMockDSL.g:1808:4: rule__XAndExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAndExpression"
+
+
+    // $ANTLR start "entryRuleOpAnd"
+    // InternalEntityMockDSL.g:1817:1: entryRuleOpAnd : ruleOpAnd EOF ;
+    public final void entryRuleOpAnd() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1818:1: ( ruleOpAnd EOF )
+            // InternalEntityMockDSL.g:1819:1: ruleOpAnd EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpAndRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpAnd();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpAndRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpAnd"
+
+
+    // $ANTLR start "ruleOpAnd"
+    // InternalEntityMockDSL.g:1826:1: ruleOpAnd : ( '&&' ) ;
+    public final void ruleOpAnd() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1830:2: ( ( '&&' ) )
+            // InternalEntityMockDSL.g:1831:2: ( '&&' )
+            {
+            // InternalEntityMockDSL.g:1831:2: ( '&&' )
+            // InternalEntityMockDSL.g:1832:3: '&&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
+            }
+            match(input,15,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpAnd"
+
+
+    // $ANTLR start "entryRuleXEqualityExpression"
+    // InternalEntityMockDSL.g:1842:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
+    public final void entryRuleXEqualityExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1843:1: ( ruleXEqualityExpression EOF )
+            // InternalEntityMockDSL.g:1844:1: ruleXEqualityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXEqualityExpression"
+
+
+    // $ANTLR start "ruleXEqualityExpression"
+    // InternalEntityMockDSL.g:1851:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
+    public final void ruleXEqualityExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1855:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1856:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1856:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:1857:3: ( rule__XEqualityExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1858:3: ( rule__XEqualityExpression__Group__0 )
+            // InternalEntityMockDSL.g:1858:4: rule__XEqualityExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXEqualityExpression"
+
+
+    // $ANTLR start "entryRuleOpEquality"
+    // InternalEntityMockDSL.g:1867:1: entryRuleOpEquality : ruleOpEquality EOF ;
+    public final void entryRuleOpEquality() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1868:1: ( ruleOpEquality EOF )
+            // InternalEntityMockDSL.g:1869:1: ruleOpEquality EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpEqualityRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpEquality();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpEqualityRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpEquality"
+
+
+    // $ANTLR start "ruleOpEquality"
+    // InternalEntityMockDSL.g:1876:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
+    public final void ruleOpEquality() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1880:2: ( ( ( rule__OpEquality__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1881:2: ( ( rule__OpEquality__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1881:2: ( ( rule__OpEquality__Alternatives ) )
+            // InternalEntityMockDSL.g:1882:3: ( rule__OpEquality__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1883:3: ( rule__OpEquality__Alternatives )
+            // InternalEntityMockDSL.g:1883:4: rule__OpEquality__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpEquality__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpEqualityAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpEquality"
+
+
+    // $ANTLR start "entryRuleXRelationalExpression"
+    // InternalEntityMockDSL.g:1892:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
+    public final void entryRuleXRelationalExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1893:1: ( ruleXRelationalExpression EOF )
+            // InternalEntityMockDSL.g:1894:1: ruleXRelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXRelationalExpression"
+
+
+    // $ANTLR start "ruleXRelationalExpression"
+    // InternalEntityMockDSL.g:1901:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
+    public final void ruleXRelationalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1905:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1906:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1906:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:1907:3: ( rule__XRelationalExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1908:3: ( rule__XRelationalExpression__Group__0 )
+            // InternalEntityMockDSL.g:1908:4: rule__XRelationalExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXRelationalExpression"
+
+
+    // $ANTLR start "entryRuleOpCompare"
+    // InternalEntityMockDSL.g:1917:1: entryRuleOpCompare : ruleOpCompare EOF ;
+    public final void entryRuleOpCompare() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1918:1: ( ruleOpCompare EOF )
+            // InternalEntityMockDSL.g:1919:1: ruleOpCompare EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpCompareRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpCompare();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpCompareRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpCompare"
+
+
+    // $ANTLR start "ruleOpCompare"
+    // InternalEntityMockDSL.g:1926:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
+    public final void ruleOpCompare() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1930:2: ( ( ( rule__OpCompare__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1931:2: ( ( rule__OpCompare__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1931:2: ( ( rule__OpCompare__Alternatives ) )
+            // InternalEntityMockDSL.g:1932:3: ( rule__OpCompare__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpCompareAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1933:3: ( rule__OpCompare__Alternatives )
+            // InternalEntityMockDSL.g:1933:4: rule__OpCompare__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpCompare__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpCompareAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpCompare"
+
+
+    // $ANTLR start "entryRuleXOtherOperatorExpression"
+    // InternalEntityMockDSL.g:1942:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
+    public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1943:1: ( ruleXOtherOperatorExpression EOF )
+            // InternalEntityMockDSL.g:1944:1: ruleXOtherOperatorExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXOtherOperatorExpression"
+
+
+    // $ANTLR start "ruleXOtherOperatorExpression"
+    // InternalEntityMockDSL.g:1951:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
+    public final void ruleXOtherOperatorExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1955:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:1956:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:1956:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:1957:3: ( rule__XOtherOperatorExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:1958:3: ( rule__XOtherOperatorExpression__Group__0 )
+            // InternalEntityMockDSL.g:1958:4: rule__XOtherOperatorExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXOtherOperatorExpression"
+
+
+    // $ANTLR start "entryRuleOpOther"
+    // InternalEntityMockDSL.g:1967:1: entryRuleOpOther : ruleOpOther EOF ;
+    public final void entryRuleOpOther() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1968:1: ( ruleOpOther EOF )
+            // InternalEntityMockDSL.g:1969:1: ruleOpOther EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpOther();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpOther"
+
+
+    // $ANTLR start "ruleOpOther"
+    // InternalEntityMockDSL.g:1976:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
+    public final void ruleOpOther() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:1980:2: ( ( ( rule__OpOther__Alternatives ) ) )
+            // InternalEntityMockDSL.g:1981:2: ( ( rule__OpOther__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:1981:2: ( ( rule__OpOther__Alternatives ) )
+            // InternalEntityMockDSL.g:1982:3: ( rule__OpOther__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:1983:3: ( rule__OpOther__Alternatives )
+            // InternalEntityMockDSL.g:1983:4: rule__OpOther__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpOther"
+
+
+    // $ANTLR start "entryRuleXAdditiveExpression"
+    // InternalEntityMockDSL.g:1992:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
+    public final void entryRuleXAdditiveExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:1993:1: ( ruleXAdditiveExpression EOF )
+            // InternalEntityMockDSL.g:1994:1: ruleXAdditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXAdditiveExpression"
+
+
+    // $ANTLR start "ruleXAdditiveExpression"
+    // InternalEntityMockDSL.g:2001:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
+    public final void ruleXAdditiveExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2005:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2006:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2006:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2007:3: ( rule__XAdditiveExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2008:3: ( rule__XAdditiveExpression__Group__0 )
+            // InternalEntityMockDSL.g:2008:4: rule__XAdditiveExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXAdditiveExpression"
+
+
+    // $ANTLR start "entryRuleOpAdd"
+    // InternalEntityMockDSL.g:2017:1: entryRuleOpAdd : ruleOpAdd EOF ;
+    public final void entryRuleOpAdd() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2018:1: ( ruleOpAdd EOF )
+            // InternalEntityMockDSL.g:2019:1: ruleOpAdd EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpAddRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpAdd();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpAddRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpAdd"
+
+
+    // $ANTLR start "ruleOpAdd"
+    // InternalEntityMockDSL.g:2026:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
+    public final void ruleOpAdd() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2030:2: ( ( ( rule__OpAdd__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2031:2: ( ( rule__OpAdd__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2031:2: ( ( rule__OpAdd__Alternatives ) )
+            // InternalEntityMockDSL.g:2032:3: ( rule__OpAdd__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpAddAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2033:3: ( rule__OpAdd__Alternatives )
+            // InternalEntityMockDSL.g:2033:4: rule__OpAdd__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpAdd__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpAddAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpAdd"
+
+
+    // $ANTLR start "entryRuleXMultiplicativeExpression"
+    // InternalEntityMockDSL.g:2042:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
+    public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2043:1: ( ruleXMultiplicativeExpression EOF )
+            // InternalEntityMockDSL.g:2044:1: ruleXMultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXMultiplicativeExpression"
+
+
+    // $ANTLR start "ruleXMultiplicativeExpression"
+    // InternalEntityMockDSL.g:2051:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
+    public final void ruleXMultiplicativeExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2055:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2056:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2056:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2057:3: ( rule__XMultiplicativeExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2058:3: ( rule__XMultiplicativeExpression__Group__0 )
+            // InternalEntityMockDSL.g:2058:4: rule__XMultiplicativeExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXMultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleOpMulti"
+    // InternalEntityMockDSL.g:2067:1: entryRuleOpMulti : ruleOpMulti EOF ;
+    public final void entryRuleOpMulti() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2068:1: ( ruleOpMulti EOF )
+            // InternalEntityMockDSL.g:2069:1: ruleOpMulti EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpMulti();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpMulti"
+
+
+    // $ANTLR start "ruleOpMulti"
+    // InternalEntityMockDSL.g:2076:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
+    public final void ruleOpMulti() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2080:2: ( ( ( rule__OpMulti__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2081:2: ( ( rule__OpMulti__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2081:2: ( ( rule__OpMulti__Alternatives ) )
+            // InternalEntityMockDSL.g:2082:3: ( rule__OpMulti__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2083:3: ( rule__OpMulti__Alternatives )
+            // InternalEntityMockDSL.g:2083:4: rule__OpMulti__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpMulti__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpMulti"
+
+
+    // $ANTLR start "entryRuleXUnaryOperation"
+    // InternalEntityMockDSL.g:2092:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
+    public final void entryRuleXUnaryOperation() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2093:1: ( ruleXUnaryOperation EOF )
+            // InternalEntityMockDSL.g:2094:1: ruleXUnaryOperation EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXUnaryOperation"
+
+
+    // $ANTLR start "ruleXUnaryOperation"
+    // InternalEntityMockDSL.g:2101:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
+    public final void ruleXUnaryOperation() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2105:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2106:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2106:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            // InternalEntityMockDSL.g:2107:3: ( rule__XUnaryOperation__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2108:3: ( rule__XUnaryOperation__Alternatives )
+            // InternalEntityMockDSL.g:2108:4: rule__XUnaryOperation__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXUnaryOperation"
+
+
+    // $ANTLR start "entryRuleOpUnary"
+    // InternalEntityMockDSL.g:2117:1: entryRuleOpUnary : ruleOpUnary EOF ;
+    public final void entryRuleOpUnary() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2118:1: ( ruleOpUnary EOF )
+            // InternalEntityMockDSL.g:2119:1: ruleOpUnary EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpUnaryRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpUnary();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpUnaryRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpUnary"
+
+
+    // $ANTLR start "ruleOpUnary"
+    // InternalEntityMockDSL.g:2126:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
+    public final void ruleOpUnary() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2130:2: ( ( ( rule__OpUnary__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2131:2: ( ( rule__OpUnary__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2131:2: ( ( rule__OpUnary__Alternatives ) )
+            // InternalEntityMockDSL.g:2132:3: ( rule__OpUnary__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2133:3: ( rule__OpUnary__Alternatives )
+            // InternalEntityMockDSL.g:2133:4: rule__OpUnary__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpUnary__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpUnaryAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpUnary"
+
+
+    // $ANTLR start "entryRuleXCastedExpression"
+    // InternalEntityMockDSL.g:2142:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
+    public final void entryRuleXCastedExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2143:1: ( ruleXCastedExpression EOF )
+            // InternalEntityMockDSL.g:2144:1: ruleXCastedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXCastedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXCastedExpression"
+
+
+    // $ANTLR start "ruleXCastedExpression"
+    // InternalEntityMockDSL.g:2151:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
+    public final void ruleXCastedExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2155:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2156:2: ( ( rule__XCastedExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2156:2: ( ( rule__XCastedExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2157:3: ( rule__XCastedExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2158:3: ( rule__XCastedExpression__Group__0 )
+            // InternalEntityMockDSL.g:2158:4: rule__XCastedExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXCastedExpression"
+
+
+    // $ANTLR start "entryRuleXPostfixOperation"
+    // InternalEntityMockDSL.g:2167:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
+    public final void entryRuleXPostfixOperation() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2168:1: ( ruleXPostfixOperation EOF )
+            // InternalEntityMockDSL.g:2169:1: ruleXPostfixOperation EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXPostfixOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXPostfixOperation"
+
+
+    // $ANTLR start "ruleXPostfixOperation"
+    // InternalEntityMockDSL.g:2176:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
+    public final void ruleXPostfixOperation() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2180:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2181:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2181:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            // InternalEntityMockDSL.g:2182:3: ( rule__XPostfixOperation__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2183:3: ( rule__XPostfixOperation__Group__0 )
+            // InternalEntityMockDSL.g:2183:4: rule__XPostfixOperation__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXPostfixOperation"
+
+
+    // $ANTLR start "entryRuleOpPostfix"
+    // InternalEntityMockDSL.g:2192:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
+    public final void entryRuleOpPostfix() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2193:1: ( ruleOpPostfix EOF )
+            // InternalEntityMockDSL.g:2194:1: ruleOpPostfix EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpPostfixRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleOpPostfix();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpPostfixRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOpPostfix"
+
+
+    // $ANTLR start "ruleOpPostfix"
+    // InternalEntityMockDSL.g:2201:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
+    public final void ruleOpPostfix() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2205:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2206:2: ( ( rule__OpPostfix__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2206:2: ( ( rule__OpPostfix__Alternatives ) )
+            // InternalEntityMockDSL.g:2207:3: ( rule__OpPostfix__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2208:3: ( rule__OpPostfix__Alternatives )
+            // InternalEntityMockDSL.g:2208:4: rule__OpPostfix__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpPostfix__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpPostfixAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOpPostfix"
+
+
+    // $ANTLR start "entryRuleXMemberFeatureCall"
+    // InternalEntityMockDSL.g:2217:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
+    public final void entryRuleXMemberFeatureCall() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2218:1: ( ruleXMemberFeatureCall EOF )
+            // InternalEntityMockDSL.g:2219:1: ruleXMemberFeatureCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXMemberFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXMemberFeatureCall"
+
+
+    // $ANTLR start "ruleXMemberFeatureCall"
+    // InternalEntityMockDSL.g:2226:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
+    public final void ruleXMemberFeatureCall() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2230:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2231:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2231:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            // InternalEntityMockDSL.g:2232:3: ( rule__XMemberFeatureCall__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2233:3: ( rule__XMemberFeatureCall__Group__0 )
+            // InternalEntityMockDSL.g:2233:4: rule__XMemberFeatureCall__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXMemberFeatureCall"
+
+
+    // $ANTLR start "entryRuleXPrimaryExpression"
+    // InternalEntityMockDSL.g:2242:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
+    public final void entryRuleXPrimaryExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2243:1: ( ruleXPrimaryExpression EOF )
+            // InternalEntityMockDSL.g:2244:1: ruleXPrimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPrimaryExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXPrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPrimaryExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXPrimaryExpression"
+
+
+    // $ANTLR start "ruleXPrimaryExpression"
+    // InternalEntityMockDSL.g:2251:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
+    public final void ruleXPrimaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2255:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2256:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2256:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            // InternalEntityMockDSL.g:2257:3: ( rule__XPrimaryExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2258:3: ( rule__XPrimaryExpression__Alternatives )
+            // InternalEntityMockDSL.g:2258:4: rule__XPrimaryExpression__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPrimaryExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXPrimaryExpression"
+
+
+    // $ANTLR start "entryRuleXLiteral"
+    // InternalEntityMockDSL.g:2267:1: entryRuleXLiteral : ruleXLiteral EOF ;
+    public final void entryRuleXLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2268:1: ( ruleXLiteral EOF )
+            // InternalEntityMockDSL.g:2269:1: ruleXLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXLiteral"
+
+
+    // $ANTLR start "ruleXLiteral"
+    // InternalEntityMockDSL.g:2276:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
+    public final void ruleXLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2280:2: ( ( ( rule__XLiteral__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2281:2: ( ( rule__XLiteral__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2281:2: ( ( rule__XLiteral__Alternatives ) )
+            // InternalEntityMockDSL.g:2282:3: ( rule__XLiteral__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXLiteralAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2283:3: ( rule__XLiteral__Alternatives )
+            // InternalEntityMockDSL.g:2283:4: rule__XLiteral__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XLiteral__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXLiteralAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXLiteral"
+
+
+    // $ANTLR start "entryRuleXCollectionLiteral"
+    // InternalEntityMockDSL.g:2292:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
+    public final void entryRuleXCollectionLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2293:1: ( ruleXCollectionLiteral EOF )
+            // InternalEntityMockDSL.g:2294:1: ruleXCollectionLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCollectionLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXCollectionLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCollectionLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXCollectionLiteral"
+
+
+    // $ANTLR start "ruleXCollectionLiteral"
+    // InternalEntityMockDSL.g:2301:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
+    public final void ruleXCollectionLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2305:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2306:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2306:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            // InternalEntityMockDSL.g:2307:3: ( rule__XCollectionLiteral__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2308:3: ( rule__XCollectionLiteral__Alternatives )
+            // InternalEntityMockDSL.g:2308:4: rule__XCollectionLiteral__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCollectionLiteral__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXCollectionLiteral"
+
+
+    // $ANTLR start "entryRuleXSetLiteral"
+    // InternalEntityMockDSL.g:2317:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
+    public final void entryRuleXSetLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2318:1: ( ruleXSetLiteral EOF )
+            // InternalEntityMockDSL.g:2319:1: ruleXSetLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXSetLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXSetLiteral"
+
+
+    // $ANTLR start "ruleXSetLiteral"
+    // InternalEntityMockDSL.g:2326:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
+    public final void ruleXSetLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2330:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2331:2: ( ( rule__XSetLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2331:2: ( ( rule__XSetLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2332:3: ( rule__XSetLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2333:3: ( rule__XSetLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2333:4: rule__XSetLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXSetLiteral"
+
+
+    // $ANTLR start "entryRuleXListLiteral"
+    // InternalEntityMockDSL.g:2342:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
+    public final void entryRuleXListLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2343:1: ( ruleXListLiteral EOF )
+            // InternalEntityMockDSL.g:2344:1: ruleXListLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXListLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXListLiteral"
+
+
+    // $ANTLR start "ruleXListLiteral"
+    // InternalEntityMockDSL.g:2351:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
+    public final void ruleXListLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2355:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2356:2: ( ( rule__XListLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2356:2: ( ( rule__XListLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2357:3: ( rule__XListLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2358:3: ( rule__XListLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2358:4: rule__XListLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXListLiteral"
+
+
+    // $ANTLR start "entryRuleXClosure"
+    // InternalEntityMockDSL.g:2367:1: entryRuleXClosure : ruleXClosure EOF ;
+    public final void entryRuleXClosure() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2368:1: ( ruleXClosure EOF )
+            // InternalEntityMockDSL.g:2369:1: ruleXClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXClosure"
+
+
+    // $ANTLR start "ruleXClosure"
+    // InternalEntityMockDSL.g:2376:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
+    public final void ruleXClosure() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2380:2: ( ( ( rule__XClosure__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2381:2: ( ( rule__XClosure__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2381:2: ( ( rule__XClosure__Group__0 ) )
+            // InternalEntityMockDSL.g:2382:3: ( rule__XClosure__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2383:3: ( rule__XClosure__Group__0 )
+            // InternalEntityMockDSL.g:2383:4: rule__XClosure__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXClosure"
+
+
+    // $ANTLR start "entryRuleXExpressionInClosure"
+    // InternalEntityMockDSL.g:2392:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
+    public final void entryRuleXExpressionInClosure() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2393:1: ( ruleXExpressionInClosure EOF )
+            // InternalEntityMockDSL.g:2394:1: ruleXExpressionInClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXExpressionInClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXExpressionInClosure"
+
+
+    // $ANTLR start "ruleXExpressionInClosure"
+    // InternalEntityMockDSL.g:2401:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
+    public final void ruleXExpressionInClosure() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2405:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2406:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2406:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            // InternalEntityMockDSL.g:2407:3: ( rule__XExpressionInClosure__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2408:3: ( rule__XExpressionInClosure__Group__0 )
+            // InternalEntityMockDSL.g:2408:4: rule__XExpressionInClosure__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXExpressionInClosure"
+
+
+    // $ANTLR start "entryRuleXShortClosure"
+    // InternalEntityMockDSL.g:2417:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
+    public final void entryRuleXShortClosure() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2418:1: ( ruleXShortClosure EOF )
+            // InternalEntityMockDSL.g:2419:1: ruleXShortClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXShortClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXShortClosure"
+
+
+    // $ANTLR start "ruleXShortClosure"
+    // InternalEntityMockDSL.g:2426:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
+    public final void ruleXShortClosure() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2430:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2431:2: ( ( rule__XShortClosure__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2431:2: ( ( rule__XShortClosure__Group__0 ) )
+            // InternalEntityMockDSL.g:2432:3: ( rule__XShortClosure__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2433:3: ( rule__XShortClosure__Group__0 )
+            // InternalEntityMockDSL.g:2433:4: rule__XShortClosure__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXShortClosure"
+
+
+    // $ANTLR start "entryRuleXParenthesizedExpression"
+    // InternalEntityMockDSL.g:2442:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
+    public final void entryRuleXParenthesizedExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2443:1: ( ruleXParenthesizedExpression EOF )
+            // InternalEntityMockDSL.g:2444:1: ruleXParenthesizedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXParenthesizedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXParenthesizedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXParenthesizedExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXParenthesizedExpression"
+
+
+    // $ANTLR start "ruleXParenthesizedExpression"
+    // InternalEntityMockDSL.g:2451:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
+    public final void ruleXParenthesizedExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2455:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2456:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2456:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2457:3: ( rule__XParenthesizedExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2458:3: ( rule__XParenthesizedExpression__Group__0 )
+            // InternalEntityMockDSL.g:2458:4: rule__XParenthesizedExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XParenthesizedExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXParenthesizedExpression"
+
+
+    // $ANTLR start "entryRuleXIfExpression"
+    // InternalEntityMockDSL.g:2467:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
+    public final void entryRuleXIfExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2468:1: ( ruleXIfExpression EOF )
+            // InternalEntityMockDSL.g:2469:1: ruleXIfExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXIfExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXIfExpression"
+
+
+    // $ANTLR start "ruleXIfExpression"
+    // InternalEntityMockDSL.g:2476:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
+    public final void ruleXIfExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2480:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2481:2: ( ( rule__XIfExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2481:2: ( ( rule__XIfExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2482:3: ( rule__XIfExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2483:3: ( rule__XIfExpression__Group__0 )
+            // InternalEntityMockDSL.g:2483:4: rule__XIfExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXIfExpression"
+
+
+    // $ANTLR start "entryRuleXSwitchExpression"
+    // InternalEntityMockDSL.g:2492:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
+    public final void entryRuleXSwitchExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2493:1: ( ruleXSwitchExpression EOF )
+            // InternalEntityMockDSL.g:2494:1: ruleXSwitchExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXSwitchExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXSwitchExpression"
+
+
+    // $ANTLR start "ruleXSwitchExpression"
+    // InternalEntityMockDSL.g:2501:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
+    public final void ruleXSwitchExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2505:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2506:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2506:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2507:3: ( rule__XSwitchExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2508:3: ( rule__XSwitchExpression__Group__0 )
+            // InternalEntityMockDSL.g:2508:4: rule__XSwitchExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXSwitchExpression"
+
+
+    // $ANTLR start "entryRuleXCasePart"
+    // InternalEntityMockDSL.g:2517:1: entryRuleXCasePart : ruleXCasePart EOF ;
+    public final void entryRuleXCasePart() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2518:1: ( ruleXCasePart EOF )
+            // InternalEntityMockDSL.g:2519:1: ruleXCasePart EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXCasePart();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXCasePart"
+
+
+    // $ANTLR start "ruleXCasePart"
+    // InternalEntityMockDSL.g:2526:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
+    public final void ruleXCasePart() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2530:2: ( ( ( rule__XCasePart__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2531:2: ( ( rule__XCasePart__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2531:2: ( ( rule__XCasePart__Group__0 ) )
+            // InternalEntityMockDSL.g:2532:3: ( rule__XCasePart__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2533:3: ( rule__XCasePart__Group__0 )
+            // InternalEntityMockDSL.g:2533:4: rule__XCasePart__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXCasePart"
+
+
+    // $ANTLR start "entryRuleXForLoopExpression"
+    // InternalEntityMockDSL.g:2542:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
+    public final void entryRuleXForLoopExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2543:1: ( ruleXForLoopExpression EOF )
+            // InternalEntityMockDSL.g:2544:1: ruleXForLoopExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXForLoopExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXForLoopExpression"
+
+
+    // $ANTLR start "ruleXForLoopExpression"
+    // InternalEntityMockDSL.g:2551:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
+    public final void ruleXForLoopExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2555:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2556:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2556:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2557:3: ( rule__XForLoopExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2558:3: ( rule__XForLoopExpression__Group__0 )
+            // InternalEntityMockDSL.g:2558:4: rule__XForLoopExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXForLoopExpression"
+
+
+    // $ANTLR start "entryRuleXBasicForLoopExpression"
+    // InternalEntityMockDSL.g:2567:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
+    public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2568:1: ( ruleXBasicForLoopExpression EOF )
+            // InternalEntityMockDSL.g:2569:1: ruleXBasicForLoopExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXBasicForLoopExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXBasicForLoopExpression"
+
+
+    // $ANTLR start "ruleXBasicForLoopExpression"
+    // InternalEntityMockDSL.g:2576:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
+    public final void ruleXBasicForLoopExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2580:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2581:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2581:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2582:3: ( rule__XBasicForLoopExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2583:3: ( rule__XBasicForLoopExpression__Group__0 )
+            // InternalEntityMockDSL.g:2583:4: rule__XBasicForLoopExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXBasicForLoopExpression"
+
+
+    // $ANTLR start "entryRuleXWhileExpression"
+    // InternalEntityMockDSL.g:2592:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
+    public final void entryRuleXWhileExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2593:1: ( ruleXWhileExpression EOF )
+            // InternalEntityMockDSL.g:2594:1: ruleXWhileExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXWhileExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXWhileExpression"
+
+
+    // $ANTLR start "ruleXWhileExpression"
+    // InternalEntityMockDSL.g:2601:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
+    public final void ruleXWhileExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2605:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2606:2: ( ( rule__XWhileExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2606:2: ( ( rule__XWhileExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2607:3: ( rule__XWhileExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2608:3: ( rule__XWhileExpression__Group__0 )
+            // InternalEntityMockDSL.g:2608:4: rule__XWhileExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXWhileExpression"
+
+
+    // $ANTLR start "entryRuleXDoWhileExpression"
+    // InternalEntityMockDSL.g:2617:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
+    public final void entryRuleXDoWhileExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2618:1: ( ruleXDoWhileExpression EOF )
+            // InternalEntityMockDSL.g:2619:1: ruleXDoWhileExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXDoWhileExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXDoWhileExpression"
+
+
+    // $ANTLR start "ruleXDoWhileExpression"
+    // InternalEntityMockDSL.g:2626:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
+    public final void ruleXDoWhileExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2630:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2631:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2631:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2632:3: ( rule__XDoWhileExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2633:3: ( rule__XDoWhileExpression__Group__0 )
+            // InternalEntityMockDSL.g:2633:4: rule__XDoWhileExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXDoWhileExpression"
+
+
+    // $ANTLR start "entryRuleXBlockExpression"
+    // InternalEntityMockDSL.g:2642:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
+    public final void entryRuleXBlockExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2643:1: ( ruleXBlockExpression EOF )
+            // InternalEntityMockDSL.g:2644:1: ruleXBlockExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXBlockExpression"
+
+
+    // $ANTLR start "ruleXBlockExpression"
+    // InternalEntityMockDSL.g:2651:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
+    public final void ruleXBlockExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2655:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2656:2: ( ( rule__XBlockExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2656:2: ( ( rule__XBlockExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:2657:3: ( rule__XBlockExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2658:3: ( rule__XBlockExpression__Group__0 )
+            // InternalEntityMockDSL.g:2658:4: rule__XBlockExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXBlockExpression"
+
+
+    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
+    // InternalEntityMockDSL.g:2667:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
+    public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2668:1: ( ruleXExpressionOrVarDeclaration EOF )
+            // InternalEntityMockDSL.g:2669:1: ruleXExpressionOrVarDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionOrVarDeclarationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"
+
+
+    // $ANTLR start "ruleXExpressionOrVarDeclaration"
+    // InternalEntityMockDSL.g:2676:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
+    public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2680:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2681:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2681:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            // InternalEntityMockDSL.g:2682:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2683:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            // InternalEntityMockDSL.g:2683:4: rule__XExpressionOrVarDeclaration__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__XExpressionOrVarDeclaration__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXExpressionOrVarDeclaration"
+
+
+    // $ANTLR start "entryRuleXVariableDeclaration"
+    // InternalEntityMockDSL.g:2692:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
+    public final void entryRuleXVariableDeclaration() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2693:1: ( ruleXVariableDeclaration EOF )
+            // InternalEntityMockDSL.g:2694:1: ruleXVariableDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXVariableDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXVariableDeclaration"
+
+
+    // $ANTLR start "ruleXVariableDeclaration"
+    // InternalEntityMockDSL.g:2701:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
+    public final void ruleXVariableDeclaration() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2705:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2706:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2706:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            // InternalEntityMockDSL.g:2707:3: ( rule__XVariableDeclaration__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2708:3: ( rule__XVariableDeclaration__Group__0 )
+            // InternalEntityMockDSL.g:2708:4: rule__XVariableDeclaration__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXVariableDeclaration"
+
+
+    // $ANTLR start "entryRuleJvmFormalParameter"
+    // InternalEntityMockDSL.g:2717:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
+    public final void entryRuleJvmFormalParameter() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2718:1: ( ruleJvmFormalParameter EOF )
+            // InternalEntityMockDSL.g:2719:1: ruleJvmFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmFormalParameter"
+
+
+    // $ANTLR start "ruleJvmFormalParameter"
+    // InternalEntityMockDSL.g:2726:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
+    public final void ruleJvmFormalParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2730:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2731:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2731:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            // InternalEntityMockDSL.g:2732:3: ( rule__JvmFormalParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2733:3: ( rule__JvmFormalParameter__Group__0 )
+            // InternalEntityMockDSL.g:2733:4: rule__JvmFormalParameter__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmFormalParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmFormalParameter"
+
+
+    // $ANTLR start "entryRuleFullJvmFormalParameter"
+    // InternalEntityMockDSL.g:2742:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
+    public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2743:1: ( ruleFullJvmFormalParameter EOF )
+            // InternalEntityMockDSL.g:2744:1: ruleFullJvmFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleFullJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFullJvmFormalParameter"
+
+
+    // $ANTLR start "ruleFullJvmFormalParameter"
+    // InternalEntityMockDSL.g:2751:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
+    public final void ruleFullJvmFormalParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2755:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2756:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2756:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            // InternalEntityMockDSL.g:2757:3: ( rule__FullJvmFormalParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2758:3: ( rule__FullJvmFormalParameter__Group__0 )
+            // InternalEntityMockDSL.g:2758:4: rule__FullJvmFormalParameter__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__FullJvmFormalParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFullJvmFormalParameter"
+
+
+    // $ANTLR start "entryRuleXFeatureCall"
+    // InternalEntityMockDSL.g:2767:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
+    public final void entryRuleXFeatureCall() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2768:1: ( ruleXFeatureCall EOF )
+            // InternalEntityMockDSL.g:2769:1: ruleXFeatureCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXFeatureCall"
+
+
+    // $ANTLR start "ruleXFeatureCall"
+    // InternalEntityMockDSL.g:2776:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
+    public final void ruleXFeatureCall() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2780:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2781:2: ( ( rule__XFeatureCall__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2781:2: ( ( rule__XFeatureCall__Group__0 ) )
+            // InternalEntityMockDSL.g:2782:3: ( rule__XFeatureCall__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2783:3: ( rule__XFeatureCall__Group__0 )
+            // InternalEntityMockDSL.g:2783:4: rule__XFeatureCall__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXFeatureCall"
+
+
+    // $ANTLR start "entryRuleFeatureCallID"
+    // InternalEntityMockDSL.g:2792:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
+    public final void entryRuleFeatureCallID() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2793:1: ( ruleFeatureCallID EOF )
+            // InternalEntityMockDSL.g:2794:1: ruleFeatureCallID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFeatureCallIDRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleFeatureCallID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFeatureCallIDRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFeatureCallID"
+
+
+    // $ANTLR start "ruleFeatureCallID"
+    // InternalEntityMockDSL.g:2801:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
+    public final void ruleFeatureCallID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2805:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2806:2: ( ( rule__FeatureCallID__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2806:2: ( ( rule__FeatureCallID__Alternatives ) )
+            // InternalEntityMockDSL.g:2807:3: ( rule__FeatureCallID__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2808:3: ( rule__FeatureCallID__Alternatives )
+            // InternalEntityMockDSL.g:2808:4: rule__FeatureCallID__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__FeatureCallID__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFeatureCallID"
+
+
+    // $ANTLR start "entryRuleIdOrSuper"
+    // InternalEntityMockDSL.g:2817:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
+    public final void entryRuleIdOrSuper() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2818:1: ( ruleIdOrSuper EOF )
+            // InternalEntityMockDSL.g:2819:1: ruleIdOrSuper EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIdOrSuperRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIdOrSuperRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIdOrSuper"
+
+
+    // $ANTLR start "ruleIdOrSuper"
+    // InternalEntityMockDSL.g:2826:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
+    public final void ruleIdOrSuper() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2830:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
+            // InternalEntityMockDSL.g:2831:2: ( ( rule__IdOrSuper__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:2831:2: ( ( rule__IdOrSuper__Alternatives ) )
+            // InternalEntityMockDSL.g:2832:3: ( rule__IdOrSuper__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:2833:3: ( rule__IdOrSuper__Alternatives )
+            // InternalEntityMockDSL.g:2833:4: rule__IdOrSuper__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__IdOrSuper__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIdOrSuper"
+
+
+    // $ANTLR start "entryRuleXConstructorCall"
+    // InternalEntityMockDSL.g:2842:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
+    public final void entryRuleXConstructorCall() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2843:1: ( ruleXConstructorCall EOF )
+            // InternalEntityMockDSL.g:2844:1: ruleXConstructorCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXConstructorCall();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXConstructorCall"
+
+
+    // $ANTLR start "ruleXConstructorCall"
+    // InternalEntityMockDSL.g:2851:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
+    public final void ruleXConstructorCall() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2855:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2856:2: ( ( rule__XConstructorCall__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2856:2: ( ( rule__XConstructorCall__Group__0 ) )
+            // InternalEntityMockDSL.g:2857:3: ( rule__XConstructorCall__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2858:3: ( rule__XConstructorCall__Group__0 )
+            // InternalEntityMockDSL.g:2858:4: rule__XConstructorCall__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXConstructorCall"
+
+
+    // $ANTLR start "entryRuleXBooleanLiteral"
+    // InternalEntityMockDSL.g:2867:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
+    public final void entryRuleXBooleanLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2868:1: ( ruleXBooleanLiteral EOF )
+            // InternalEntityMockDSL.g:2869:1: ruleXBooleanLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXBooleanLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXBooleanLiteral"
+
+
+    // $ANTLR start "ruleXBooleanLiteral"
+    // InternalEntityMockDSL.g:2876:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
+    public final void ruleXBooleanLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2880:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2881:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2881:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2882:3: ( rule__XBooleanLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2883:3: ( rule__XBooleanLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2883:4: rule__XBooleanLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBooleanLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXBooleanLiteral"
+
+
+    // $ANTLR start "entryRuleXNullLiteral"
+    // InternalEntityMockDSL.g:2892:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
+    public final void entryRuleXNullLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2893:1: ( ruleXNullLiteral EOF )
+            // InternalEntityMockDSL.g:2894:1: ruleXNullLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNullLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXNullLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNullLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXNullLiteral"
+
+
+    // $ANTLR start "ruleXNullLiteral"
+    // InternalEntityMockDSL.g:2901:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
+    public final void ruleXNullLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2905:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2906:2: ( ( rule__XNullLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2906:2: ( ( rule__XNullLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2907:3: ( rule__XNullLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNullLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2908:3: ( rule__XNullLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2908:4: rule__XNullLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XNullLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNullLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXNullLiteral"
+
+
+    // $ANTLR start "entryRuleXNumberLiteral"
+    // InternalEntityMockDSL.g:2917:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
+    public final void entryRuleXNumberLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2918:1: ( ruleXNumberLiteral EOF )
+            // InternalEntityMockDSL.g:2919:1: ruleXNumberLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNumberLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXNumberLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNumberLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXNumberLiteral"
+
+
+    // $ANTLR start "ruleXNumberLiteral"
+    // InternalEntityMockDSL.g:2926:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
+    public final void ruleXNumberLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2930:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2931:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2931:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2932:3: ( rule__XNumberLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2933:3: ( rule__XNumberLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2933:4: rule__XNumberLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XNumberLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNumberLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXNumberLiteral"
+
+
+    // $ANTLR start "entryRuleXStringLiteral"
+    // InternalEntityMockDSL.g:2942:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
+    public final void entryRuleXStringLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2943:1: ( ruleXStringLiteral EOF )
+            // InternalEntityMockDSL.g:2944:1: ruleXStringLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXStringLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXStringLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXStringLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXStringLiteral"
+
+
+    // $ANTLR start "ruleXStringLiteral"
+    // InternalEntityMockDSL.g:2951:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
+    public final void ruleXStringLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2955:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2956:2: ( ( rule__XStringLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2956:2: ( ( rule__XStringLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2957:3: ( rule__XStringLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXStringLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2958:3: ( rule__XStringLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2958:4: rule__XStringLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XStringLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXStringLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXStringLiteral"
+
+
+    // $ANTLR start "entryRuleXTypeLiteral"
+    // InternalEntityMockDSL.g:2967:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
+    public final void entryRuleXTypeLiteral() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2968:1: ( ruleXTypeLiteral EOF )
+            // InternalEntityMockDSL.g:2969:1: ruleXTypeLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXTypeLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXTypeLiteral"
+
+
+    // $ANTLR start "ruleXTypeLiteral"
+    // InternalEntityMockDSL.g:2976:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
+    public final void ruleXTypeLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:2980:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
+            // InternalEntityMockDSL.g:2981:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:2981:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            // InternalEntityMockDSL.g:2982:3: ( rule__XTypeLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:2983:3: ( rule__XTypeLiteral__Group__0 )
+            // InternalEntityMockDSL.g:2983:4: rule__XTypeLiteral__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXTypeLiteral"
+
+
+    // $ANTLR start "entryRuleXThrowExpression"
+    // InternalEntityMockDSL.g:2992:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
+    public final void entryRuleXThrowExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:2993:1: ( ruleXThrowExpression EOF )
+            // InternalEntityMockDSL.g:2994:1: ruleXThrowExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXThrowExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXThrowExpression"
+
+
+    // $ANTLR start "ruleXThrowExpression"
+    // InternalEntityMockDSL.g:3001:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
+    public final void ruleXThrowExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3005:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3006:2: ( ( rule__XThrowExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3006:2: ( ( rule__XThrowExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:3007:3: ( rule__XThrowExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3008:3: ( rule__XThrowExpression__Group__0 )
+            // InternalEntityMockDSL.g:3008:4: rule__XThrowExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XThrowExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXThrowExpression"
+
+
+    // $ANTLR start "entryRuleXReturnExpression"
+    // InternalEntityMockDSL.g:3017:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
+    public final void entryRuleXReturnExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3018:1: ( ruleXReturnExpression EOF )
+            // InternalEntityMockDSL.g:3019:1: ruleXReturnExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXReturnExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXReturnExpression"
+
+
+    // $ANTLR start "ruleXReturnExpression"
+    // InternalEntityMockDSL.g:3026:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
+    public final void ruleXReturnExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3030:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3031:2: ( ( rule__XReturnExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3031:2: ( ( rule__XReturnExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:3032:3: ( rule__XReturnExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3033:3: ( rule__XReturnExpression__Group__0 )
+            // InternalEntityMockDSL.g:3033:4: rule__XReturnExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XReturnExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXReturnExpression"
+
+
+    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
+    // InternalEntityMockDSL.g:3042:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
+    public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3043:1: ( ruleXTryCatchFinallyExpression EOF )
+            // InternalEntityMockDSL.g:3044:1: ruleXTryCatchFinallyExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXTryCatchFinallyExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXTryCatchFinallyExpression"
+
+
+    // $ANTLR start "ruleXTryCatchFinallyExpression"
+    // InternalEntityMockDSL.g:3051:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
+    public final void ruleXTryCatchFinallyExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3055:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3056:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3056:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:3057:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3058:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            // InternalEntityMockDSL.g:3058:4: rule__XTryCatchFinallyExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXTryCatchFinallyExpression"
+
+
+    // $ANTLR start "entryRuleXSynchronizedExpression"
+    // InternalEntityMockDSL.g:3067:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
+    public final void entryRuleXSynchronizedExpression() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3068:1: ( ruleXSynchronizedExpression EOF )
+            // InternalEntityMockDSL.g:3069:1: ruleXSynchronizedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXSynchronizedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXSynchronizedExpression"
+
+
+    // $ANTLR start "ruleXSynchronizedExpression"
+    // InternalEntityMockDSL.g:3076:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
+    public final void ruleXSynchronizedExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3080:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3081:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3081:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            // InternalEntityMockDSL.g:3082:3: ( rule__XSynchronizedExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3083:3: ( rule__XSynchronizedExpression__Group__0 )
+            // InternalEntityMockDSL.g:3083:4: rule__XSynchronizedExpression__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXSynchronizedExpression"
+
+
+    // $ANTLR start "entryRuleXCatchClause"
+    // InternalEntityMockDSL.g:3092:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
+    public final void entryRuleXCatchClause() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3093:1: ( ruleXCatchClause EOF )
+            // InternalEntityMockDSL.g:3094:1: ruleXCatchClause EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXCatchClause();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXCatchClause"
+
+
+    // $ANTLR start "ruleXCatchClause"
+    // InternalEntityMockDSL.g:3101:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
+    public final void ruleXCatchClause() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3105:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3106:2: ( ( rule__XCatchClause__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3106:2: ( ( rule__XCatchClause__Group__0 ) )
+            // InternalEntityMockDSL.g:3107:3: ( rule__XCatchClause__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3108:3: ( rule__XCatchClause__Group__0 )
+            // InternalEntityMockDSL.g:3108:4: rule__XCatchClause__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXCatchClause"
+
+
+    // $ANTLR start "entryRuleQualifiedName"
+    // InternalEntityMockDSL.g:3117:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
+    public final void entryRuleQualifiedName() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3118:1: ( ruleQualifiedName EOF )
+            // InternalEntityMockDSL.g:3119:1: ruleQualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedName"
+
+
+    // $ANTLR start "ruleQualifiedName"
+    // InternalEntityMockDSL.g:3126:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
+    public final void ruleQualifiedName() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3130:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3131:2: ( ( rule__QualifiedName__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3131:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalEntityMockDSL.g:3132:3: ( rule__QualifiedName__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3133:3: ( rule__QualifiedName__Group__0 )
+            // InternalEntityMockDSL.g:3133:4: rule__QualifiedName__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $ANTLR start "entryRuleNumber"
+    // InternalEntityMockDSL.g:3142:1: entryRuleNumber : ruleNumber EOF ;
+    public final void entryRuleNumber() throws RecognitionException {
+         
+        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+
+        try {
+            // InternalEntityMockDSL.g:3146:1: ( ruleNumber EOF )
+            // InternalEntityMockDSL.g:3147:1: ruleNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	myHiddenTokenState.restore();
+
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNumber"
+
+
+    // $ANTLR start "ruleNumber"
+    // InternalEntityMockDSL.g:3157:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
+    public final void ruleNumber() throws RecognitionException {
+
+        		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3162:2: ( ( ( rule__Number__Alternatives ) ) )
+            // InternalEntityMockDSL.g:3163:2: ( ( rule__Number__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:3163:2: ( ( rule__Number__Alternatives ) )
+            // InternalEntityMockDSL.g:3164:3: ( rule__Number__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:3165:3: ( rule__Number__Alternatives )
+            // InternalEntityMockDSL.g:3165:4: rule__Number__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__Number__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+            	myHiddenTokenState.restore();
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNumber"
+
+
+    // $ANTLR start "entryRuleJvmTypeReference"
+    // InternalEntityMockDSL.g:3175:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
+    public final void entryRuleJvmTypeReference() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3176:1: ( ruleJvmTypeReference EOF )
+            // InternalEntityMockDSL.g:3177:1: ruleJvmTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmTypeReference"
+
+
+    // $ANTLR start "ruleJvmTypeReference"
+    // InternalEntityMockDSL.g:3184:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
+    public final void ruleJvmTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3188:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
+            // InternalEntityMockDSL.g:3189:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:3189:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalEntityMockDSL.g:3190:3: ( rule__JvmTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:3191:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalEntityMockDSL.g:3191:4: rule__JvmTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmTypeReference"
+
+
+    // $ANTLR start "entryRuleArrayBrackets"
+    // InternalEntityMockDSL.g:3200:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
+    public final void entryRuleArrayBrackets() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3201:1: ( ruleArrayBrackets EOF )
+            // InternalEntityMockDSL.g:3202:1: ruleArrayBrackets EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleArrayBrackets"
+
+
+    // $ANTLR start "ruleArrayBrackets"
+    // InternalEntityMockDSL.g:3209:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
+    public final void ruleArrayBrackets() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3213:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3214:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3214:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalEntityMockDSL.g:3215:3: ( rule__ArrayBrackets__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3216:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalEntityMockDSL.g:3216:4: rule__ArrayBrackets__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleArrayBrackets"
+
+
+    // $ANTLR start "entryRuleXFunctionTypeRef"
+    // InternalEntityMockDSL.g:3225:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
+    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3226:1: ( ruleXFunctionTypeRef EOF )
+            // InternalEntityMockDSL.g:3227:1: ruleXFunctionTypeRef EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXFunctionTypeRef();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXFunctionTypeRef"
+
+
+    // $ANTLR start "ruleXFunctionTypeRef"
+    // InternalEntityMockDSL.g:3234:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
+    public final void ruleXFunctionTypeRef() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3238:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3239:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3239:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalEntityMockDSL.g:3240:3: ( rule__XFunctionTypeRef__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3241:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalEntityMockDSL.g:3241:4: rule__XFunctionTypeRef__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXFunctionTypeRef"
+
+
+    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
+    // InternalEntityMockDSL.g:3250:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
+    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3251:1: ( ruleJvmParameterizedTypeReference EOF )
+            // InternalEntityMockDSL.g:3252:1: ruleJvmParameterizedTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "ruleJvmParameterizedTypeReference"
+    // InternalEntityMockDSL.g:3259:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
+    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3263:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3264:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3264:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalEntityMockDSL.g:3265:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3266:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalEntityMockDSL.g:3266:4: rule__JvmParameterizedTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // InternalEntityMockDSL.g:3275:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
+    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3276:1: ( ruleJvmArgumentTypeReference EOF )
+            // InternalEntityMockDSL.g:3277:1: ruleJvmArgumentTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "ruleJvmArgumentTypeReference"
+    // InternalEntityMockDSL.g:3284:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
+    public final void ruleJvmArgumentTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3288:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
+            // InternalEntityMockDSL.g:3289:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:3289:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalEntityMockDSL.g:3290:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:3291:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalEntityMockDSL.g:3291:4: rule__JvmArgumentTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmArgumentTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmWildcardTypeReference"
+    // InternalEntityMockDSL.g:3300:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
+    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3301:1: ( ruleJvmWildcardTypeReference EOF )
+            // InternalEntityMockDSL.g:3302:1: ruleJvmWildcardTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmWildcardTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "ruleJvmWildcardTypeReference"
+    // InternalEntityMockDSL.g:3309:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
+    public final void ruleJvmWildcardTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3313:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3314:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3314:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalEntityMockDSL.g:3315:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3316:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalEntityMockDSL.g:3316:4: rule__JvmWildcardTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // InternalEntityMockDSL.g:3325:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
+    public final void entryRuleJvmUpperBound() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3326:1: ( ruleJvmUpperBound EOF )
+            // InternalEntityMockDSL.g:3327:1: ruleJvmUpperBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBound"
+
+
+    // $ANTLR start "ruleJvmUpperBound"
+    // InternalEntityMockDSL.g:3334:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
+    public final void ruleJvmUpperBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3338:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3339:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3339:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalEntityMockDSL.g:3340:3: ( rule__JvmUpperBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3341:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalEntityMockDSL.g:3341:4: rule__JvmUpperBound__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBound"
+
+
+    // $ANTLR start "entryRuleJvmUpperBoundAnded"
+    // InternalEntityMockDSL.g:3350:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
+    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3351:1: ( ruleJvmUpperBoundAnded EOF )
+            // InternalEntityMockDSL.g:3352:1: ruleJvmUpperBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "ruleJvmUpperBoundAnded"
+    // InternalEntityMockDSL.g:3359:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmUpperBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3363:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3364:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3364:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalEntityMockDSL.g:3365:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3366:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalEntityMockDSL.g:3366:4: rule__JvmUpperBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "entryRuleJvmLowerBound"
+    // InternalEntityMockDSL.g:3375:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
+    public final void entryRuleJvmLowerBound() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3376:1: ( ruleJvmLowerBound EOF )
+            // InternalEntityMockDSL.g:3377:1: ruleJvmLowerBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBound"
+
+
+    // $ANTLR start "ruleJvmLowerBound"
+    // InternalEntityMockDSL.g:3384:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
+    public final void ruleJvmLowerBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3388:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3389:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3389:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalEntityMockDSL.g:3390:3: ( rule__JvmLowerBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3391:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalEntityMockDSL.g:3391:4: rule__JvmLowerBound__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBound"
+
+
+    // $ANTLR start "entryRuleJvmLowerBoundAnded"
+    // InternalEntityMockDSL.g:3400:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
+    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3401:1: ( ruleJvmLowerBoundAnded EOF )
+            // InternalEntityMockDSL.g:3402:1: ruleJvmLowerBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "ruleJvmLowerBoundAnded"
+    // InternalEntityMockDSL.g:3409:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmLowerBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3413:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3414:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3414:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalEntityMockDSL.g:3415:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3416:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalEntityMockDSL.g:3416:4: rule__JvmLowerBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
+    // InternalEntityMockDSL.g:3425:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
+    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3426:1: ( ruleQualifiedNameWithWildcard EOF )
+            // InternalEntityMockDSL.g:3427:1: ruleQualifiedNameWithWildcard EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "ruleQualifiedNameWithWildcard"
+    // InternalEntityMockDSL.g:3434:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
+    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3438:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
+            // InternalEntityMockDSL.g:3439:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            {
+            // InternalEntityMockDSL.g:3439:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalEntityMockDSL.g:3440:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3441:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalEntityMockDSL.g:3441:4: rule__QualifiedNameWithWildcard__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "entryRuleValidID"
+    // InternalEntityMockDSL.g:3450:1: entryRuleValidID : ruleValidID EOF ;
+    public final void entryRuleValidID() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3451:1: ( ruleValidID EOF )
+            // InternalEntityMockDSL.g:3452:1: ruleValidID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValidIDRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValidID"
+
+
+    // $ANTLR start "ruleValidID"
+    // InternalEntityMockDSL.g:3459:1: ruleValidID : ( RULE_ID ) ;
+    public final void ruleValidID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3463:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:3464:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:3464:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:3465:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValidID"
+
+
+    // $ANTLR start "entryRuleXImportSection"
+    // InternalEntityMockDSL.g:3475:1: entryRuleXImportSection : ruleXImportSection EOF ;
+    public final void entryRuleXImportSection() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3476:1: ( ruleXImportSection EOF )
+            // InternalEntityMockDSL.g:3477:1: ruleXImportSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportSectionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXImportSection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportSectionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXImportSection"
+
+
+    // $ANTLR start "ruleXImportSection"
+    // InternalEntityMockDSL.g:3484:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
+    public final void ruleXImportSection() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3488:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
+            // InternalEntityMockDSL.g:3489:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            {
+            // InternalEntityMockDSL.g:3489:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            // InternalEntityMockDSL.g:3490:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            {
+            // InternalEntityMockDSL.g:3490:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
+            // InternalEntityMockDSL.g:3491:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
+            }
+            // InternalEntityMockDSL.g:3492:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            // InternalEntityMockDSL.g:3492:5: rule__XImportSection__ImportDeclarationsAssignment
+            {
+            pushFollow(FOLLOW_3);
+            rule__XImportSection__ImportDeclarationsAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:3495:3: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            // InternalEntityMockDSL.g:3496:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
+            }
+            // InternalEntityMockDSL.g:3497:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==48) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:3497:5: rule__XImportSection__ImportDeclarationsAssignment
+            	    {
+            	    pushFollow(FOLLOW_3);
+            	    rule__XImportSection__ImportDeclarationsAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXImportSection"
+
+
+    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
+    // InternalEntityMockDSL.g:3507:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
+    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        try {
+            // InternalEntityMockDSL.g:3508:1: ( ruleQualifiedNameInStaticImport EOF )
+            // InternalEntityMockDSL.g:3509:1: ruleQualifiedNameInStaticImport EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleQualifiedNameInStaticImport"
+    // InternalEntityMockDSL.g:3516:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
+    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3520:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
+            // InternalEntityMockDSL.g:3521:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            {
+            // InternalEntityMockDSL.g:3521:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalEntityMockDSL.g:3522:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            {
+            // InternalEntityMockDSL.g:3522:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
+            // InternalEntityMockDSL.g:3523:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3524:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalEntityMockDSL.g:3524:5: rule__QualifiedNameInStaticImport__Group__0
+            {
+            pushFollow(FOLLOW_4);
+            rule__QualifiedNameInStaticImport__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:3527:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalEntityMockDSL.g:3528:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // InternalEntityMockDSL.g:3529:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0==RULE_ID) ) {
+                    int LA2_2 = input.LA(2);
+
+                    if ( (LA2_2==44) ) {
+                        alt2=1;
+                    }
+
+
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:3529:5: rule__QualifiedNameInStaticImport__Group__0
+            	    {
+            	    pushFollow(FOLLOW_4);
+            	    rule__QualifiedNameInStaticImport__Group__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleEDateStepType"
+    // InternalEntityMockDSL.g:3539:1: ruleEDateStepType : ( ( rule__EDateStepType__Alternatives ) ) ;
+    public final void ruleEDateStepType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3543:1: ( ( ( rule__EDateStepType__Alternatives ) ) )
+            // InternalEntityMockDSL.g:3544:2: ( ( rule__EDateStepType__Alternatives ) )
+            {
+            // InternalEntityMockDSL.g:3544:2: ( ( rule__EDateStepType__Alternatives ) )
+            // InternalEntityMockDSL.g:3545:3: ( rule__EDateStepType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDateStepTypeAccess().getAlternatives()); 
+            }
+            // InternalEntityMockDSL.g:3546:3: ( rule__EDateStepType__Alternatives )
+            // InternalEntityMockDSL.g:3546:4: rule__EDateStepType__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__EDateStepType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDateStepTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEDateStepType"
+
+
+    // $ANTLR start "rule__IEntityMockObjectAttribute__Alternatives"
+    // InternalEntityMockDSL.g:3554:1: rule__IEntityMockObjectAttribute__Alternatives : ( ( ruleEntityMockObjectResourceValue ) | ( ruleEntityMockObjectPlainValue ) | ( ruleEntityMockObjectArrayValue ) | ( ruleEntityMockObjectEmbed ) | ( ruleEntityMockObjectFill ) );
+    public final void rule__IEntityMockObjectAttribute__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3558:1: ( ( ruleEntityMockObjectResourceValue ) | ( ruleEntityMockObjectPlainValue ) | ( ruleEntityMockObjectArrayValue ) | ( ruleEntityMockObjectEmbed ) | ( ruleEntityMockObjectFill ) )
+            int alt3=5;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==73) ) {
+                int LA3_1 = input.LA(2);
+
+                if ( (LA3_1==RULE_ID) ) {
+                    switch ( input.LA(3) ) {
+                    case 68:
+                        {
+                        alt3=2;
+                        }
+                        break;
+                    case 75:
+                        {
+                        alt3=1;
+                        }
+                        break;
+                    case 76:
+                        {
+                        alt3=3;
+                        }
+                        break;
+                    case 82:
+                        {
+                        alt3=5;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 3, 3, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 3, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA3_0==78) ) {
+                alt3=4;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3559:2: ( ruleEntityMockObjectResourceValue )
+                    {
+                    // InternalEntityMockDSL.g:3559:2: ( ruleEntityMockObjectResourceValue )
+                    // InternalEntityMockDSL.g:3560:3: ruleEntityMockObjectResourceValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockObjectResourceValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3565:2: ( ruleEntityMockObjectPlainValue )
+                    {
+                    // InternalEntityMockDSL.g:3565:2: ( ruleEntityMockObjectPlainValue )
+                    // InternalEntityMockDSL.g:3566:3: ruleEntityMockObjectPlainValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockObjectPlainValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3571:2: ( ruleEntityMockObjectArrayValue )
+                    {
+                    // InternalEntityMockDSL.g:3571:2: ( ruleEntityMockObjectArrayValue )
+                    // InternalEntityMockDSL.g:3572:3: ruleEntityMockObjectArrayValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockObjectArrayValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:3577:2: ( ruleEntityMockObjectEmbed )
+                    {
+                    // InternalEntityMockDSL.g:3577:2: ( ruleEntityMockObjectEmbed )
+                    // InternalEntityMockDSL.g:3578:3: ruleEntityMockObjectEmbed
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockObjectEmbed();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:3583:2: ( ruleEntityMockObjectFill )
+                    {
+                    // InternalEntityMockDSL.g:3583:2: ( ruleEntityMockObjectFill )
+                    // InternalEntityMockDSL.g:3584:3: ruleEntityMockObjectFill
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockObjectFill();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IEntityMockObjectAttribute__Alternatives"
+
+
+    // $ANTLR start "rule__PropertyFillerType__Alternatives"
+    // InternalEntityMockDSL.g:3593:1: rule__PropertyFillerType__Alternatives : ( ( rulePropertyFillerDateFuture ) | ( rulePropertyFillerDatePast ) | ( rulePropertyFillerDateRange ) | ( rulePropertyFillerBoolean ) | ( rulePropertyFillerSignedDoubleRange ) | ( rulePropertyFillerSignedDoubleRandom ) | ( rulePropertyFillerSignedIntegerRange ) | ( rulePropertyFillerSignedIntegerRandom ) | ( rulePropertyFillerTextRandom ) | ( rulePropertyFillerTextParagraphs ) | ( rulePropertyFillerTextSentences ) | ( rulePropertyFillerTextWords ) | ( rulePropertyFillerUnsignedDoubleRange ) | ( rulePropertyFillerUnsignedDoubleRandom ) | ( rulePropertyFillerUnsignedIntegerRange ) | ( rulePropertyFillerUnsignedIntegerRandom ) );
+    public final void rule__PropertyFillerType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3597:1: ( ( rulePropertyFillerDateFuture ) | ( rulePropertyFillerDatePast ) | ( rulePropertyFillerDateRange ) | ( rulePropertyFillerBoolean ) | ( rulePropertyFillerSignedDoubleRange ) | ( rulePropertyFillerSignedDoubleRandom ) | ( rulePropertyFillerSignedIntegerRange ) | ( rulePropertyFillerSignedIntegerRandom ) | ( rulePropertyFillerTextRandom ) | ( rulePropertyFillerTextParagraphs ) | ( rulePropertyFillerTextSentences ) | ( rulePropertyFillerTextWords ) | ( rulePropertyFillerUnsignedDoubleRange ) | ( rulePropertyFillerUnsignedDoubleRandom ) | ( rulePropertyFillerUnsignedIntegerRange ) | ( rulePropertyFillerUnsignedIntegerRandom ) )
+            int alt4=16;
+            switch ( input.LA(1) ) {
+            case 83:
+                {
+                alt4=1;
+                }
+                break;
+            case 84:
+                {
+                alt4=2;
+                }
+                break;
+            case 86:
+                {
+                alt4=3;
+                }
+                break;
+            case 85:
+                {
+                alt4=4;
+                }
+                break;
+            case 89:
+                {
+                alt4=5;
+                }
+                break;
+            case 92:
+                {
+                alt4=6;
+                }
+                break;
+            case 93:
+                {
+                alt4=7;
+                }
+                break;
+            case 94:
+                {
+                alt4=8;
+                }
+                break;
+            case 95:
+                {
+                alt4=9;
+                }
+                break;
+            case 96:
+                {
+                alt4=10;
+                }
+                break;
+            case 97:
+                {
+                alt4=11;
+                }
+                break;
+            case 98:
+                {
+                alt4=12;
+                }
+                break;
+            case 99:
+                {
+                alt4=13;
+                }
+                break;
+            case 100:
+                {
+                alt4=14;
+                }
+                break;
+            case 101:
+                {
+                alt4=15;
+                }
+                break;
+            case 102:
+                {
+                alt4=16;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 4, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt4) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3598:2: ( rulePropertyFillerDateFuture )
+                    {
+                    // InternalEntityMockDSL.g:3598:2: ( rulePropertyFillerDateFuture )
+                    // InternalEntityMockDSL.g:3599:3: rulePropertyFillerDateFuture
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerDateFuture();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3604:2: ( rulePropertyFillerDatePast )
+                    {
+                    // InternalEntityMockDSL.g:3604:2: ( rulePropertyFillerDatePast )
+                    // InternalEntityMockDSL.g:3605:3: rulePropertyFillerDatePast
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerDatePast();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3610:2: ( rulePropertyFillerDateRange )
+                    {
+                    // InternalEntityMockDSL.g:3610:2: ( rulePropertyFillerDateRange )
+                    // InternalEntityMockDSL.g:3611:3: rulePropertyFillerDateRange
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerDateRange();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:3616:2: ( rulePropertyFillerBoolean )
+                    {
+                    // InternalEntityMockDSL.g:3616:2: ( rulePropertyFillerBoolean )
+                    // InternalEntityMockDSL.g:3617:3: rulePropertyFillerBoolean
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerBoolean();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:3622:2: ( rulePropertyFillerSignedDoubleRange )
+                    {
+                    // InternalEntityMockDSL.g:3622:2: ( rulePropertyFillerSignedDoubleRange )
+                    // InternalEntityMockDSL.g:3623:3: rulePropertyFillerSignedDoubleRange
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerSignedDoubleRange();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:3628:2: ( rulePropertyFillerSignedDoubleRandom )
+                    {
+                    // InternalEntityMockDSL.g:3628:2: ( rulePropertyFillerSignedDoubleRandom )
+                    // InternalEntityMockDSL.g:3629:3: rulePropertyFillerSignedDoubleRandom
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerSignedDoubleRandom();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:3634:2: ( rulePropertyFillerSignedIntegerRange )
+                    {
+                    // InternalEntityMockDSL.g:3634:2: ( rulePropertyFillerSignedIntegerRange )
+                    // InternalEntityMockDSL.g:3635:3: rulePropertyFillerSignedIntegerRange
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerSignedIntegerRange();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalEntityMockDSL.g:3640:2: ( rulePropertyFillerSignedIntegerRandom )
+                    {
+                    // InternalEntityMockDSL.g:3640:2: ( rulePropertyFillerSignedIntegerRandom )
+                    // InternalEntityMockDSL.g:3641:3: rulePropertyFillerSignedIntegerRandom
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerSignedIntegerRandom();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalEntityMockDSL.g:3646:2: ( rulePropertyFillerTextRandom )
+                    {
+                    // InternalEntityMockDSL.g:3646:2: ( rulePropertyFillerTextRandom )
+                    // InternalEntityMockDSL.g:3647:3: rulePropertyFillerTextRandom
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerTextRandom();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalEntityMockDSL.g:3652:2: ( rulePropertyFillerTextParagraphs )
+                    {
+                    // InternalEntityMockDSL.g:3652:2: ( rulePropertyFillerTextParagraphs )
+                    // InternalEntityMockDSL.g:3653:3: rulePropertyFillerTextParagraphs
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerTextParagraphs();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalEntityMockDSL.g:3658:2: ( rulePropertyFillerTextSentences )
+                    {
+                    // InternalEntityMockDSL.g:3658:2: ( rulePropertyFillerTextSentences )
+                    // InternalEntityMockDSL.g:3659:3: rulePropertyFillerTextSentences
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerTextSentences();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalEntityMockDSL.g:3664:2: ( rulePropertyFillerTextWords )
+                    {
+                    // InternalEntityMockDSL.g:3664:2: ( rulePropertyFillerTextWords )
+                    // InternalEntityMockDSL.g:3665:3: rulePropertyFillerTextWords
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerTextWords();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalEntityMockDSL.g:3670:2: ( rulePropertyFillerUnsignedDoubleRange )
+                    {
+                    // InternalEntityMockDSL.g:3670:2: ( rulePropertyFillerUnsignedDoubleRange )
+                    // InternalEntityMockDSL.g:3671:3: rulePropertyFillerUnsignedDoubleRange
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerUnsignedDoubleRange();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalEntityMockDSL.g:3676:2: ( rulePropertyFillerUnsignedDoubleRandom )
+                    {
+                    // InternalEntityMockDSL.g:3676:2: ( rulePropertyFillerUnsignedDoubleRandom )
+                    // InternalEntityMockDSL.g:3677:3: rulePropertyFillerUnsignedDoubleRandom
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerUnsignedDoubleRandom();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalEntityMockDSL.g:3682:2: ( rulePropertyFillerUnsignedIntegerRange )
+                    {
+                    // InternalEntityMockDSL.g:3682:2: ( rulePropertyFillerUnsignedIntegerRange )
+                    // InternalEntityMockDSL.g:3683:3: rulePropertyFillerUnsignedIntegerRange
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerUnsignedIntegerRange();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalEntityMockDSL.g:3688:2: ( rulePropertyFillerUnsignedIntegerRandom )
+                    {
+                    // InternalEntityMockDSL.g:3688:2: ( rulePropertyFillerUnsignedIntegerRandom )
+                    // InternalEntityMockDSL.g:3689:3: rulePropertyFillerUnsignedIntegerRandom
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyFillerUnsignedIntegerRandom();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerType__Alternatives"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Alternatives_2_0"
+    // InternalEntityMockDSL.g:3698:1: rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 : ( ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 ) ) | ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) ) );
+    public final void rule__PropertyFillerSignedDoubleRange__Alternatives_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3702:1: ( ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 ) ) | ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) ) )
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==RULE_INT||LA5_0==36) ) {
+                alt5=1;
+            }
+            else if ( (LA5_0==RULE_ID) ) {
+                alt5=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 5, 0, input);
+
+                throw nvae;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3703:2: ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3703:2: ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 ) )
+                    // InternalEntityMockDSL.g:3704:3: ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3705:3: ( rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 )
+                    // InternalEntityMockDSL.g:3705:4: rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3709:2: ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3709:2: ( ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) )
+                    // InternalEntityMockDSL.g:3710:3: ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3711:3: ( rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 )
+                    // InternalEntityMockDSL.g:3711:4: rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Alternatives_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Alternatives_2_2"
+    // InternalEntityMockDSL.g:3719:1: rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 : ( ( ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 ) ) | ( ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 ) ) );
+    public final void rule__PropertyFillerSignedDoubleRange__Alternatives_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3723:1: ( ( ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 ) ) | ( ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 ) ) )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==RULE_INT||LA6_0==36) ) {
+                alt6=1;
+            }
+            else if ( (LA6_0==RULE_ID) ) {
+                alt6=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3724:2: ( ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3724:2: ( ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 ) )
+                    // InternalEntityMockDSL.g:3725:3: ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3726:3: ( rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 )
+                    // InternalEntityMockDSL.g:3726:4: rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3730:2: ( ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3730:2: ( ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 ) )
+                    // InternalEntityMockDSL.g:3731:3: ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3732:3: ( rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 )
+                    // InternalEntityMockDSL.g:3732:4: rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Alternatives_2_2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Alternatives_3_0"
+    // InternalEntityMockDSL.g:3740:1: rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 : ( ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 ) ) | ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) ) );
+    public final void rule__PropertyFillerSignedIntegerRange__Alternatives_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3744:1: ( ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 ) ) | ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) ) )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==RULE_INT||LA7_0==36) ) {
+                alt7=1;
+            }
+            else if ( (LA7_0==RULE_ID) ) {
+                alt7=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3745:2: ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3745:2: ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 ) )
+                    // InternalEntityMockDSL.g:3746:3: ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3747:3: ( rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 )
+                    // InternalEntityMockDSL.g:3747:4: rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3751:2: ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3751:2: ( ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) )
+                    // InternalEntityMockDSL.g:3752:3: ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3753:3: ( rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 )
+                    // InternalEntityMockDSL.g:3753:4: rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Alternatives_3_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Alternatives_3_2"
+    // InternalEntityMockDSL.g:3761:1: rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 : ( ( ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 ) ) | ( ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 ) ) );
+    public final void rule__PropertyFillerSignedIntegerRange__Alternatives_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3765:1: ( ( ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 ) ) | ( ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 ) ) )
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==RULE_INT||LA8_0==36) ) {
+                alt8=1;
+            }
+            else if ( (LA8_0==RULE_ID) ) {
+                alt8=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 8, 0, input);
+
+                throw nvae;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3766:2: ( ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3766:2: ( ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 ) )
+                    // InternalEntityMockDSL.g:3767:3: ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3768:3: ( rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 )
+                    // InternalEntityMockDSL.g:3768:4: rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3772:2: ( ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3772:2: ( ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 ) )
+                    // InternalEntityMockDSL.g:3773:3: ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3774:3: ( rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 )
+                    // InternalEntityMockDSL.g:3774:4: rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Alternatives_3_2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0"
+    // InternalEntityMockDSL.g:3782:1: rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 : ( ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 ) ) | ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) ) );
+    public final void rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3786:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 ) ) | ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) ) )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==RULE_INT) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==RULE_ID) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3787:2: ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3787:2: ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 ) )
+                    // InternalEntityMockDSL.g:3788:3: ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3789:3: ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 )
+                    // InternalEntityMockDSL.g:3789:4: rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeAssignment_2_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3793:2: ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3793:2: ( ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 ) )
+                    // InternalEntityMockDSL.g:3794:3: ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3795:3: ( rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 )
+                    // InternalEntityMockDSL.g:3795:4: rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefAssignment_2_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2"
+    // InternalEntityMockDSL.g:3803:1: rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 : ( ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 ) ) | ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 ) ) );
+    public final void rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3807:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 ) ) | ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 ) ) )
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==RULE_INT) ) {
+                alt10=1;
+            }
+            else if ( (LA10_0==RULE_ID) ) {
+                alt10=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 10, 0, input);
+
+                throw nvae;
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3808:2: ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3808:2: ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 ) )
+                    // InternalEntityMockDSL.g:3809:3: ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3810:3: ( rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 )
+                    // InternalEntityMockDSL.g:3810:4: rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeAssignment_2_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3814:2: ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3814:2: ( ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 ) )
+                    // InternalEntityMockDSL.g:3815:3: ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3816:3: ( rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 )
+                    // InternalEntityMockDSL.g:3816:4: rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefAssignment_2_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0"
+    // InternalEntityMockDSL.g:3824:1: rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 : ( ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 ) ) | ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) ) );
+    public final void rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3828:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 ) ) | ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) ) )
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==RULE_INT) ) {
+                alt11=1;
+            }
+            else if ( (LA11_0==RULE_ID) ) {
+                alt11=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 11, 0, input);
+
+                throw nvae;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3829:2: ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3829:2: ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 ) )
+                    // InternalEntityMockDSL.g:3830:3: ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3831:3: ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 )
+                    // InternalEntityMockDSL.g:3831:4: rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeAssignment_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3835:2: ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3835:2: ( ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 ) )
+                    // InternalEntityMockDSL.g:3836:3: ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3837:3: ( rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 )
+                    // InternalEntityMockDSL.g:3837:4: rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefAssignment_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2"
+    // InternalEntityMockDSL.g:3845:1: rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 : ( ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 ) ) | ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 ) ) );
+    public final void rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3849:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 ) ) | ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 ) ) )
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==RULE_INT) ) {
+                alt12=1;
+            }
+            else if ( (LA12_0==RULE_ID) ) {
+                alt12=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 12, 0, input);
+
+                throw nvae;
+            }
+            switch (alt12) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3850:2: ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3850:2: ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 ) )
+                    // InternalEntityMockDSL.g:3851:3: ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3852:3: ( rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 )
+                    // InternalEntityMockDSL.g:3852:4: rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeAssignment_3_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3856:2: ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3856:2: ( ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 ) )
+                    // InternalEntityMockDSL.g:3857:3: ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3858:3: ( rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 )
+                    // InternalEntityMockDSL.g:3858:4: rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefAssignment_3_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Alternatives_4"
+    // InternalEntityMockDSL.g:3866:1: rule__EntityMockEntity__Alternatives_4 : ( ( ( rule__EntityMockEntity__Group_4_0__0 ) ) | ( ( rule__EntityMockEntity__Group_4_1__0 ) ) | ( ( rule__EntityMockEntity__Group_4_2__0 ) ) );
+    public final void rule__EntityMockEntity__Alternatives_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3870:1: ( ( ( rule__EntityMockEntity__Group_4_0__0 ) ) | ( ( rule__EntityMockEntity__Group_4_1__0 ) ) | ( ( rule__EntityMockEntity__Group_4_2__0 ) ) )
+            int alt13=3;
+            switch ( input.LA(1) ) {
+            case 106:
+                {
+                alt13=1;
+                }
+                break;
+            case 65:
+                {
+                alt13=2;
+                }
+                break;
+            case 108:
+                {
+                alt13=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 13, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt13) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3871:2: ( ( rule__EntityMockEntity__Group_4_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3871:2: ( ( rule__EntityMockEntity__Group_4_0__0 ) )
+                    // InternalEntityMockDSL.g:3872:3: ( rule__EntityMockEntity__Group_4_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getGroup_4_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3873:3: ( rule__EntityMockEntity__Group_4_0__0 )
+                    // InternalEntityMockDSL.g:3873:4: rule__EntityMockEntity__Group_4_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__Group_4_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getGroup_4_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3877:2: ( ( rule__EntityMockEntity__Group_4_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3877:2: ( ( rule__EntityMockEntity__Group_4_1__0 ) )
+                    // InternalEntityMockDSL.g:3878:3: ( rule__EntityMockEntity__Group_4_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getGroup_4_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3879:3: ( rule__EntityMockEntity__Group_4_1__0 )
+                    // InternalEntityMockDSL.g:3879:4: rule__EntityMockEntity__Group_4_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__Group_4_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getGroup_4_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3883:2: ( ( rule__EntityMockEntity__Group_4_2__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3883:2: ( ( rule__EntityMockEntity__Group_4_2__0 ) )
+                    // InternalEntityMockDSL.g:3884:3: ( rule__EntityMockEntity__Group_4_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getGroup_4_2()); 
+                    }
+                    // InternalEntityMockDSL.g:3885:3: ( rule__EntityMockEntity__Group_4_2__0 )
+                    // InternalEntityMockDSL.g:3885:4: rule__EntityMockEntity__Group_4_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__Group_4_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getGroup_4_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Alternatives_4"
+
+
+    // $ANTLR start "rule__IIterate__Alternatives"
+    // InternalEntityMockDSL.g:3893:1: rule__IIterate__Alternatives : ( ( ruleIntegerIterate ) | ( ruleDateIterate ) );
+    public final void rule__IIterate__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3897:1: ( ( ruleIntegerIterate ) | ( ruleDateIterate ) )
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==109) ) {
+                alt14=1;
+            }
+            else if ( (LA14_0==111) ) {
+                alt14=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 14, 0, input);
+
+                throw nvae;
+            }
+            switch (alt14) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3898:2: ( ruleIntegerIterate )
+                    {
+                    // InternalEntityMockDSL.g:3898:2: ( ruleIntegerIterate )
+                    // InternalEntityMockDSL.g:3899:3: ruleIntegerIterate
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleIntegerIterate();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3904:2: ( ruleDateIterate )
+                    {
+                    // InternalEntityMockDSL.g:3904:2: ( ruleDateIterate )
+                    // InternalEntityMockDSL.g:3905:3: ruleDateIterate
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleDateIterate();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IIterate__Alternatives"
+
+
+    // $ANTLR start "rule__Date__Alternatives"
+    // InternalEntityMockDSL.g:3914:1: rule__Date__Alternatives : ( ( ( rule__Date__YesterdayAssignment_0 ) ) | ( ( rule__Date__TodayAssignment_1 ) ) | ( ( rule__Date__TomorrowAssignment_2 ) ) | ( ( rule__Date__Group_3__0 ) ) );
+    public final void rule__Date__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3918:1: ( ( ( rule__Date__YesterdayAssignment_0 ) ) | ( ( rule__Date__TodayAssignment_1 ) ) | ( ( rule__Date__TomorrowAssignment_2 ) ) | ( ( rule__Date__Group_3__0 ) ) )
+            int alt15=4;
+            switch ( input.LA(1) ) {
+            case 149:
+                {
+                alt15=1;
+                }
+                break;
+            case 150:
+                {
+                alt15=2;
+                }
+                break;
+            case 151:
+                {
+                alt15=3;
+                }
+                break;
+            case RULE_INT:
+                {
+                alt15=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 15, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt15) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3919:2: ( ( rule__Date__YesterdayAssignment_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3919:2: ( ( rule__Date__YesterdayAssignment_0 ) )
+                    // InternalEntityMockDSL.g:3920:3: ( rule__Date__YesterdayAssignment_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDateAccess().getYesterdayAssignment_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3921:3: ( rule__Date__YesterdayAssignment_0 )
+                    // InternalEntityMockDSL.g:3921:4: rule__Date__YesterdayAssignment_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Date__YesterdayAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDateAccess().getYesterdayAssignment_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3925:2: ( ( rule__Date__TodayAssignment_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3925:2: ( ( rule__Date__TodayAssignment_1 ) )
+                    // InternalEntityMockDSL.g:3926:3: ( rule__Date__TodayAssignment_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDateAccess().getTodayAssignment_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3927:3: ( rule__Date__TodayAssignment_1 )
+                    // InternalEntityMockDSL.g:3927:4: rule__Date__TodayAssignment_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Date__TodayAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDateAccess().getTodayAssignment_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3931:2: ( ( rule__Date__TomorrowAssignment_2 ) )
+                    {
+                    // InternalEntityMockDSL.g:3931:2: ( ( rule__Date__TomorrowAssignment_2 ) )
+                    // InternalEntityMockDSL.g:3932:3: ( rule__Date__TomorrowAssignment_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDateAccess().getTomorrowAssignment_2()); 
+                    }
+                    // InternalEntityMockDSL.g:3933:3: ( rule__Date__TomorrowAssignment_2 )
+                    // InternalEntityMockDSL.g:3933:4: rule__Date__TomorrowAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Date__TomorrowAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDateAccess().getTomorrowAssignment_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:3937:2: ( ( rule__Date__Group_3__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3937:2: ( ( rule__Date__Group_3__0 ) )
+                    // InternalEntityMockDSL.g:3938:3: ( rule__Date__Group_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDateAccess().getGroup_3()); 
+                    }
+                    // InternalEntityMockDSL.g:3939:3: ( rule__Date__Group_3__0 )
+                    // InternalEntityMockDSL.g:3939:4: rule__Date__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Date__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDateAccess().getGroup_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Alternatives"
+
+
+    // $ANTLR start "rule__IEntityMockAttribute__Alternatives"
+    // InternalEntityMockDSL.g:3947:1: rule__IEntityMockAttribute__Alternatives : ( ( ruleEntityMockAttributeByObject ) | ( ruleEntityMockAttributeFiller ) | ( ruleEntityMockAttributeByReference ) );
+    public final void rule__IEntityMockAttribute__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3951:1: ( ( ruleEntityMockAttributeByObject ) | ( ruleEntityMockAttributeFiller ) | ( ruleEntityMockAttributeByReference ) )
+            int alt16=3;
+            switch ( input.LA(1) ) {
+            case 73:
+                {
+                int LA16_1 = input.LA(2);
+
+                if ( (LA16_1==RULE_ID) ) {
+                    int LA16_4 = input.LA(3);
+
+                    if ( (LA16_4==82) ) {
+                        alt16=2;
+                    }
+                    else if ( (LA16_4==113) ) {
+                        alt16=1;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 16, 4, input);
+
+                        throw nvae;
+                    }
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 16, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 117:
+                {
+                alt16=1;
+                }
+                break;
+            case 118:
+                {
+                alt16=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 16, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt16) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3952:2: ( ruleEntityMockAttributeByObject )
+                    {
+                    // InternalEntityMockDSL.g:3952:2: ( ruleEntityMockAttributeByObject )
+                    // InternalEntityMockDSL.g:3953:3: ruleEntityMockAttributeByObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockAttributeByObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3958:2: ( ruleEntityMockAttributeFiller )
+                    {
+                    // InternalEntityMockDSL.g:3958:2: ( ruleEntityMockAttributeFiller )
+                    // InternalEntityMockDSL.g:3959:3: ruleEntityMockAttributeFiller
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockAttributeFiller();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3964:2: ( ruleEntityMockAttributeByReference )
+                    {
+                    // InternalEntityMockDSL.g:3964:2: ( ruleEntityMockAttributeByReference )
+                    // InternalEntityMockDSL.g:3965:3: ruleEntityMockAttributeByReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleEntityMockAttributeByReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IEntityMockAttribute__Alternatives"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunctionParameter__Alternatives"
+    // InternalEntityMockDSL.g:3974:1: rule__EntityMockEntityFunctionParameter__Alternatives : ( ( ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 ) ) | ( ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 ) ) );
+    public final void rule__EntityMockEntityFunctionParameter__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3978:1: ( ( ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 ) ) | ( ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 ) ) )
+            int alt17=2;
+            int LA17_0 = input.LA(1);
+
+            if ( (LA17_0==RULE_ID) ) {
+                int LA17_1 = input.LA(2);
+
+                if ( (LA17_1==44) ) {
+                    alt17=2;
+                }
+                else if ( (LA17_1==EOF||(LA17_1>=69 && LA17_1<=70)) ) {
+                    alt17=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 17, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 17, 0, input);
+
+                throw nvae;
+            }
+            switch (alt17) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3979:2: ( ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:3979:2: ( ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 ) )
+                    // InternalEntityMockDSL.g:3980:3: ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefAssignment_0()); 
+                    }
+                    // InternalEntityMockDSL.g:3981:3: ( rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 )
+                    // InternalEntityMockDSL.g:3981:4: rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefAssignment_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3985:2: ( ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:3985:2: ( ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 ) )
+                    // InternalEntityMockDSL.g:3986:3: ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeAssignment_1()); 
+                    }
+                    // InternalEntityMockDSL.g:3987:3: ( rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 )
+                    // InternalEntityMockDSL.g:3987:4: rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeAssignment_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunctionParameter__Alternatives"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Alternatives"
+    // InternalEntityMockDSL.g:3995:1: rule__EntityMockAttributeByObject__Alternatives : ( ( ( rule__EntityMockAttributeByObject__Group_0__0 ) ) | ( ( rule__EntityMockAttributeByObject__Group_1__0 ) ) );
+    public final void rule__EntityMockAttributeByObject__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:3999:1: ( ( ( rule__EntityMockAttributeByObject__Group_0__0 ) ) | ( ( rule__EntityMockAttributeByObject__Group_1__0 ) ) )
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( (LA18_0==73) ) {
+                alt18=1;
+            }
+            else if ( (LA18_0==117) ) {
+                alt18=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 18, 0, input);
+
+                throw nvae;
+            }
+            switch (alt18) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4000:2: ( ( rule__EntityMockAttributeByObject__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4000:2: ( ( rule__EntityMockAttributeByObject__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:4001:3: ( rule__EntityMockAttributeByObject__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4002:3: ( rule__EntityMockAttributeByObject__Group_0__0 )
+                    // InternalEntityMockDSL.g:4002:4: rule__EntityMockAttributeByObject__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockAttributeByObject__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4006:2: ( ( rule__EntityMockAttributeByObject__Group_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4006:2: ( ( rule__EntityMockAttributeByObject__Group_1__0 ) )
+                    // InternalEntityMockDSL.g:4007:3: ( rule__EntityMockAttributeByObject__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4008:3: ( rule__EntityMockAttributeByObject__Group_1__0 )
+                    // InternalEntityMockDSL.g:4008:4: rule__EntityMockAttributeByObject__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockAttributeByObject__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Alternatives"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Alternatives_3"
+    // InternalEntityMockDSL.g:4016:1: rule__EntityMockAttributeByReference__Alternatives_3 : ( ( 'existingEntities' ) | ( ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 ) ) );
+    public final void rule__EntityMockAttributeByReference__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4020:1: ( ( 'existingEntities' ) | ( ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 ) ) )
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==16) ) {
+                alt19=1;
+            }
+            else if ( (LA19_0==RULE_ID) ) {
+                alt19=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 19, 0, input);
+
+                throw nvae;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4021:2: ( 'existingEntities' )
+                    {
+                    // InternalEntityMockDSL.g:4021:2: ( 'existingEntities' )
+                    // InternalEntityMockDSL.g:4022:3: 'existingEntities'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0()); 
+                    }
+                    match(input,16,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4027:2: ( ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4027:2: ( ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 ) )
+                    // InternalEntityMockDSL.g:4028:3: ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityAssignment_3_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4029:3: ( rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 )
+                    // InternalEntityMockDSL.g:4029:4: rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityAssignment_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Alternatives_3"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Alternatives_2"
+    // InternalEntityMockDSL.g:4037:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );
+    public final void rule__XImportDeclaration__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4041:1: ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) )
+            int alt20=4;
+            alt20 = dfa20.predict(input);
+            switch (alt20) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4042:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4042:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    // InternalEntityMockDSL.g:4043:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4044:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    // InternalEntityMockDSL.g:4044:4: rule__XImportDeclaration__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4048:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4048:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    // InternalEntityMockDSL.g:4049:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4050:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    // InternalEntityMockDSL.g:4050:4: rule__XImportDeclaration__ImportedTypeAssignment_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ImportedTypeAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4054:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    {
+                    // InternalEntityMockDSL.g:4054:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    // InternalEntityMockDSL.g:4055:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); 
+                    }
+                    // InternalEntityMockDSL.g:4056:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    // InternalEntityMockDSL.g:4056:4: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ImportedNamespaceAssignment_2_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4060:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4060:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    // InternalEntityMockDSL.g:4061:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); 
+                    }
+                    // InternalEntityMockDSL.g:4062:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    // InternalEntityMockDSL.g:4062:4: rule__XImportDeclaration__Group_2_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__Group_2_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Alternatives_2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Alternatives_2_0_3"
+    // InternalEntityMockDSL.g:4070:1: rule__XImportDeclaration__Alternatives_2_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) );
+    public final void rule__XImportDeclaration__Alternatives_2_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4074:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) )
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==37) ) {
+                alt21=1;
+            }
+            else if ( (LA21_0==RULE_ID) ) {
+                alt21=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 21, 0, input);
+
+                throw nvae;
+            }
+            switch (alt21) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4075:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4075:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    // InternalEntityMockDSL.g:4076:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4077:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    // InternalEntityMockDSL.g:4077:4: rule__XImportDeclaration__WildcardAssignment_2_0_3_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__WildcardAssignment_2_0_3_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4081:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4081:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    // InternalEntityMockDSL.g:4082:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4083:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    // InternalEntityMockDSL.g:4083:4: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__MemberNameAssignment_2_0_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Alternatives_2_0_3"
+
+
+    // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
+    // InternalEntityMockDSL.g:4091:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
+    public final void rule__XAnnotation__Alternatives_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4095:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
+            int alt22=2;
+            alt22 = dfa22.predict(input);
+            switch (alt22) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4096:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4096:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    // InternalEntityMockDSL.g:4097:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4098:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    // InternalEntityMockDSL.g:4098:4: rule__XAnnotation__Group_3_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotation__Group_3_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4102:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4102:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    // InternalEntityMockDSL.g:4103:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4104:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    // InternalEntityMockDSL.g:4104:4: rule__XAnnotation__ValueAssignment_3_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotation__ValueAssignment_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Alternatives_3_1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Alternatives"
+    // InternalEntityMockDSL.g:4112:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
+    public final void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4116:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
+            int alt23=2;
+            alt23 = dfa23.predict(input);
+            switch (alt23) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4117:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4117:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:4118:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4119:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    // InternalEntityMockDSL.g:4119:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValueOrCommaList__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4123:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4123:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    // InternalEntityMockDSL.g:4124:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4125:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    // InternalEntityMockDSL.g:4125:4: rule__XAnnotationElementValueOrCommaList__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValueOrCommaList__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Alternatives"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Alternatives"
+    // InternalEntityMockDSL.g:4133:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
+    public final void rule__XAnnotationElementValue__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4137:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
+            int alt24=2;
+            alt24 = dfa24.predict(input);
+            switch (alt24) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4138:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4138:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:4139:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4140:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    // InternalEntityMockDSL.g:4140:4: rule__XAnnotationElementValue__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValue__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4144:2: ( ruleXAnnotationOrExpression )
+                    {
+                    // InternalEntityMockDSL.g:4144:2: ( ruleXAnnotationOrExpression )
+                    // InternalEntityMockDSL.g:4145:3: ruleXAnnotationOrExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXAnnotationOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Alternatives"
+
+
+    // $ANTLR start "rule__XAnnotationOrExpression__Alternatives"
+    // InternalEntityMockDSL.g:4154:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
+    public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4158:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
+            int alt25=2;
+            int LA25_0 = input.LA(1);
+
+            if ( (LA25_0==122) ) {
+                alt25=1;
+            }
+            else if ( ((LA25_0>=RULE_ID && LA25_0<=RULE_STRING)||LA25_0==28||(LA25_0>=35 && LA25_0<=36)||LA25_0==41||(LA25_0>=46 && LA25_0<=51)||LA25_0==57||LA25_0==68||(LA25_0>=124 && LA25_0<=125)||LA25_0==127||LA25_0==129||(LA25_0>=133 && LA25_0<=141)||LA25_0==143||LA25_0==156) ) {
+                alt25=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 25, 0, input);
+
+                throw nvae;
+            }
+            switch (alt25) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4159:2: ( ruleXAnnotation )
+                    {
+                    // InternalEntityMockDSL.g:4159:2: ( ruleXAnnotation )
+                    // InternalEntityMockDSL.g:4160:3: ruleXAnnotation
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXAnnotation();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4165:2: ( ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:4165:2: ( ruleXExpression )
+                    // InternalEntityMockDSL.g:4166:3: ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationOrExpression__Alternatives"
+
+
+    // $ANTLR start "rule__XAssignment__Alternatives"
+    // InternalEntityMockDSL.g:4175:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
+    public final void rule__XAssignment__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4179:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
+            int alt26=2;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                int LA26_1 = input.LA(2);
+
+                if ( (LA26_1==EOF||(LA26_1>=RULE_ID && LA26_1<=RULE_STRING)||(LA26_1>=14 && LA26_1<=15)||(LA26_1>=17 && LA26_1<=51)||(LA26_1>=57 && LA26_1<=58)||(LA26_1>=68 && LA26_1<=70)||LA26_1==73||LA26_1==113||LA26_1==121||(LA26_1>=123 && LA26_1<=144)||(LA26_1>=153 && LA26_1<=154)||LA26_1==156) ) {
+                    alt26=2;
+                }
+                else if ( (LA26_1==13) ) {
+                    alt26=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 46:
+                {
+                int LA26_2 = input.LA(2);
+
+                if ( (LA26_2==13) ) {
+                    alt26=1;
+                }
+                else if ( (LA26_2==EOF||(LA26_2>=RULE_ID && LA26_2<=RULE_STRING)||(LA26_2>=14 && LA26_2<=15)||(LA26_2>=17 && LA26_2<=51)||(LA26_2>=57 && LA26_2<=58)||(LA26_2>=68 && LA26_2<=70)||LA26_2==73||LA26_2==113||LA26_2==121||(LA26_2>=123 && LA26_2<=144)||(LA26_2>=153 && LA26_2<=154)||LA26_2==156) ) {
+                    alt26=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 47:
+                {
+                int LA26_3 = input.LA(2);
+
+                if ( (LA26_3==13) ) {
+                    alt26=1;
+                }
+                else if ( (LA26_3==EOF||(LA26_3>=RULE_ID && LA26_3<=RULE_STRING)||(LA26_3>=14 && LA26_3<=15)||(LA26_3>=17 && LA26_3<=51)||(LA26_3>=57 && LA26_3<=58)||(LA26_3>=68 && LA26_3<=70)||LA26_3==73||LA26_3==113||LA26_3==121||(LA26_3>=123 && LA26_3<=144)||(LA26_3>=153 && LA26_3<=154)||LA26_3==156) ) {
+                    alt26=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 48:
+                {
+                int LA26_4 = input.LA(2);
+
+                if ( (LA26_4==13) ) {
+                    alt26=1;
+                }
+                else if ( (LA26_4==EOF||(LA26_4>=RULE_ID && LA26_4<=RULE_STRING)||(LA26_4>=14 && LA26_4<=15)||(LA26_4>=17 && LA26_4<=51)||(LA26_4>=57 && LA26_4<=58)||(LA26_4>=68 && LA26_4<=70)||LA26_4==73||LA26_4==113||LA26_4==121||(LA26_4>=123 && LA26_4<=144)||(LA26_4>=153 && LA26_4<=154)||LA26_4==156) ) {
+                    alt26=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 49:
+                {
+                int LA26_5 = input.LA(2);
+
+                if ( (LA26_5==13) ) {
+                    alt26=1;
+                }
+                else if ( (LA26_5==EOF||(LA26_5>=RULE_ID && LA26_5<=RULE_STRING)||(LA26_5>=14 && LA26_5<=15)||(LA26_5>=17 && LA26_5<=51)||(LA26_5>=57 && LA26_5<=58)||(LA26_5>=68 && LA26_5<=70)||LA26_5==73||LA26_5==113||LA26_5==121||(LA26_5>=123 && LA26_5<=144)||(LA26_5>=153 && LA26_5<=154)||LA26_5==156) ) {
+                    alt26=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 5, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case RULE_HEX:
+            case RULE_INT:
+            case RULE_DECIMAL:
+            case RULE_STRING:
+            case 28:
+            case 35:
+            case 36:
+            case 41:
+            case 50:
+            case 51:
+            case 57:
+            case 68:
+            case 124:
+            case 125:
+            case 127:
+            case 129:
+            case 133:
+            case 134:
+            case 135:
+            case 136:
+            case 137:
+            case 138:
+            case 139:
+            case 140:
+            case 141:
+            case 143:
+            case 156:
+                {
+                alt26=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 26, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt26) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4180:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4180:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:4181:3: ( rule__XAssignment__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4182:3: ( rule__XAssignment__Group_0__0 )
+                    // InternalEntityMockDSL.g:4182:4: rule__XAssignment__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAssignment__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAssignmentAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4186:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4186:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    // InternalEntityMockDSL.g:4187:3: ( rule__XAssignment__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4188:3: ( rule__XAssignment__Group_1__0 )
+                    // InternalEntityMockDSL.g:4188:4: rule__XAssignment__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAssignment__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXAssignmentAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Alternatives"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Alternatives"
+    // InternalEntityMockDSL.g:4196:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
+    public final void rule__OpMultiAssign__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4200:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
+            int alt27=7;
+            switch ( input.LA(1) ) {
+            case 17:
+                {
+                alt27=1;
+                }
+                break;
+            case 18:
+                {
+                alt27=2;
+                }
+                break;
+            case 19:
+                {
+                alt27=3;
+                }
+                break;
+            case 20:
+                {
+                alt27=4;
+                }
+                break;
+            case 21:
+                {
+                alt27=5;
+                }
+                break;
+            case 28:
+                {
+                alt27=6;
+                }
+                break;
+            case 27:
+                {
+                alt27=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 27, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt27) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4201:2: ( '+=' )
+                    {
+                    // InternalEntityMockDSL.g:4201:2: ( '+=' )
+                    // InternalEntityMockDSL.g:4202:3: '+='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
+                    }
+                    match(input,17,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4207:2: ( '-=' )
+                    {
+                    // InternalEntityMockDSL.g:4207:2: ( '-=' )
+                    // InternalEntityMockDSL.g:4208:3: '-='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
+                    }
+                    match(input,18,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4213:2: ( '*=' )
+                    {
+                    // InternalEntityMockDSL.g:4213:2: ( '*=' )
+                    // InternalEntityMockDSL.g:4214:3: '*='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
+                    }
+                    match(input,19,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4219:2: ( '/=' )
+                    {
+                    // InternalEntityMockDSL.g:4219:2: ( '/=' )
+                    // InternalEntityMockDSL.g:4220:3: '/='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
+                    }
+                    match(input,20,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:4225:2: ( '%=' )
+                    {
+                    // InternalEntityMockDSL.g:4225:2: ( '%=' )
+                    // InternalEntityMockDSL.g:4226:3: '%='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
+                    }
+                    match(input,21,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:4231:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4231:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    // InternalEntityMockDSL.g:4232:3: ( rule__OpMultiAssign__Group_5__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
+                    }
+                    // InternalEntityMockDSL.g:4233:3: ( rule__OpMultiAssign__Group_5__0 )
+                    // InternalEntityMockDSL.g:4233:4: rule__OpMultiAssign__Group_5__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpMultiAssign__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:4237:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4237:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    // InternalEntityMockDSL.g:4238:3: ( rule__OpMultiAssign__Group_6__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
+                    }
+                    // InternalEntityMockDSL.g:4239:3: ( rule__OpMultiAssign__Group_6__0 )
+                    // InternalEntityMockDSL.g:4239:4: rule__OpMultiAssign__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpMultiAssign__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Alternatives"
+
+
+    // $ANTLR start "rule__OpEquality__Alternatives"
+    // InternalEntityMockDSL.g:4247:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
+    public final void rule__OpEquality__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4251:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
+            int alt28=4;
+            switch ( input.LA(1) ) {
+            case 22:
+                {
+                alt28=1;
+                }
+                break;
+            case 23:
+                {
+                alt28=2;
+                }
+                break;
+            case 24:
+                {
+                alt28=3;
+                }
+                break;
+            case 25:
+                {
+                alt28=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 28, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt28) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4252:2: ( '==' )
+                    {
+                    // InternalEntityMockDSL.g:4252:2: ( '==' )
+                    // InternalEntityMockDSL.g:4253:3: '=='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
+                    }
+                    match(input,22,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4258:2: ( '!=' )
+                    {
+                    // InternalEntityMockDSL.g:4258:2: ( '!=' )
+                    // InternalEntityMockDSL.g:4259:3: '!='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
+                    }
+                    match(input,23,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4264:2: ( '===' )
+                    {
+                    // InternalEntityMockDSL.g:4264:2: ( '===' )
+                    // InternalEntityMockDSL.g:4265:3: '==='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
+                    }
+                    match(input,24,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4270:2: ( '!==' )
+                    {
+                    // InternalEntityMockDSL.g:4270:2: ( '!==' )
+                    // InternalEntityMockDSL.g:4271:3: '!=='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
+                    }
+                    match(input,25,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpEquality__Alternatives"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Alternatives_1"
+    // InternalEntityMockDSL.g:4280:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
+    public final void rule__XRelationalExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4284:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
+            int alt29=2;
+            int LA29_0 = input.LA(1);
+
+            if ( (LA29_0==126) ) {
+                alt29=1;
+            }
+            else if ( ((LA29_0>=26 && LA29_0<=28)) ) {
+                alt29=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 29, 0, input);
+
+                throw nvae;
+            }
+            switch (alt29) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4285:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4285:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    // InternalEntityMockDSL.g:4286:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4287:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    // InternalEntityMockDSL.g:4287:4: rule__XRelationalExpression__Group_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XRelationalExpression__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4291:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4291:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    // InternalEntityMockDSL.g:4292:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4293:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    // InternalEntityMockDSL.g:4293:4: rule__XRelationalExpression__Group_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XRelationalExpression__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__OpCompare__Alternatives"
+    // InternalEntityMockDSL.g:4301:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
+    public final void rule__OpCompare__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4305:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
+            int alt30=4;
+            switch ( input.LA(1) ) {
+            case 26:
+                {
+                alt30=1;
+                }
+                break;
+            case 28:
+                {
+                int LA30_2 = input.LA(2);
+
+                if ( (LA30_2==EOF||(LA30_2>=RULE_ID && LA30_2<=RULE_STRING)||LA30_2==28||(LA30_2>=35 && LA30_2<=36)||LA30_2==41||(LA30_2>=46 && LA30_2<=51)||LA30_2==57||LA30_2==68||(LA30_2>=124 && LA30_2<=125)||LA30_2==127||LA30_2==129||(LA30_2>=133 && LA30_2<=141)||LA30_2==143||LA30_2==156) ) {
+                    alt30=4;
+                }
+                else if ( (LA30_2==13) ) {
+                    alt30=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 30, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 27:
+                {
+                alt30=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 30, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt30) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4306:2: ( '>=' )
+                    {
+                    // InternalEntityMockDSL.g:4306:2: ( '>=' )
+                    // InternalEntityMockDSL.g:4307:3: '>='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
+                    }
+                    match(input,26,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4312:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4312:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    // InternalEntityMockDSL.g:4313:3: ( rule__OpCompare__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpCompareAccess().getGroup_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4314:3: ( rule__OpCompare__Group_1__0 )
+                    // InternalEntityMockDSL.g:4314:4: rule__OpCompare__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpCompare__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpCompareAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4318:2: ( '>' )
+                    {
+                    // InternalEntityMockDSL.g:4318:2: ( '>' )
+                    // InternalEntityMockDSL.g:4319:3: '>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
+                    }
+                    match(input,27,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4324:2: ( '<' )
+                    {
+                    // InternalEntityMockDSL.g:4324:2: ( '<' )
+                    // InternalEntityMockDSL.g:4325:3: '<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
+                    }
+                    match(input,28,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpCompare__Alternatives"
+
+
+    // $ANTLR start "rule__OpOther__Alternatives"
+    // InternalEntityMockDSL.g:4334:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
+    public final void rule__OpOther__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4338:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
+            int alt31=9;
+            alt31 = dfa31.predict(input);
+            switch (alt31) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4339:2: ( '->' )
+                    {
+                    // InternalEntityMockDSL.g:4339:2: ( '->' )
+                    // InternalEntityMockDSL.g:4340:3: '->'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
+                    }
+                    match(input,29,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4345:2: ( '..<' )
+                    {
+                    // InternalEntityMockDSL.g:4345:2: ( '..<' )
+                    // InternalEntityMockDSL.g:4346:3: '..<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
+                    }
+                    match(input,30,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4351:2: ( ( rule__OpOther__Group_2__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4351:2: ( ( rule__OpOther__Group_2__0 ) )
+                    // InternalEntityMockDSL.g:4352:3: ( rule__OpOther__Group_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGroup_2()); 
+                    }
+                    // InternalEntityMockDSL.g:4353:3: ( rule__OpOther__Group_2__0 )
+                    // InternalEntityMockDSL.g:4353:4: rule__OpOther__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpOther__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGroup_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4357:2: ( '..' )
+                    {
+                    // InternalEntityMockDSL.g:4357:2: ( '..' )
+                    // InternalEntityMockDSL.g:4358:3: '..'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
+                    }
+                    match(input,31,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:4363:2: ( '=>' )
+                    {
+                    // InternalEntityMockDSL.g:4363:2: ( '=>' )
+                    // InternalEntityMockDSL.g:4364:3: '=>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
+                    }
+                    match(input,32,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:4369:2: ( ( rule__OpOther__Group_5__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4369:2: ( ( rule__OpOther__Group_5__0 ) )
+                    // InternalEntityMockDSL.g:4370:3: ( rule__OpOther__Group_5__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGroup_5()); 
+                    }
+                    // InternalEntityMockDSL.g:4371:3: ( rule__OpOther__Group_5__0 )
+                    // InternalEntityMockDSL.g:4371:4: rule__OpOther__Group_5__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpOther__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGroup_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:4375:2: ( ( rule__OpOther__Group_6__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4375:2: ( ( rule__OpOther__Group_6__0 ) )
+                    // InternalEntityMockDSL.g:4376:3: ( rule__OpOther__Group_6__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGroup_6()); 
+                    }
+                    // InternalEntityMockDSL.g:4377:3: ( rule__OpOther__Group_6__0 )
+                    // InternalEntityMockDSL.g:4377:4: rule__OpOther__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpOther__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGroup_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalEntityMockDSL.g:4381:2: ( '<>' )
+                    {
+                    // InternalEntityMockDSL.g:4381:2: ( '<>' )
+                    // InternalEntityMockDSL.g:4382:3: '<>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
+                    }
+                    match(input,33,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalEntityMockDSL.g:4387:2: ( '?:' )
+                    {
+                    // InternalEntityMockDSL.g:4387:2: ( '?:' )
+                    // InternalEntityMockDSL.g:4388:3: '?:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
+                    }
+                    match(input,34,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Alternatives"
+
+
+    // $ANTLR start "rule__OpOther__Alternatives_5_1"
+    // InternalEntityMockDSL.g:4397:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
+    public final void rule__OpOther__Alternatives_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4401:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==27) ) {
+                int LA32_1 = input.LA(2);
+
+                if ( (LA32_1==EOF||(LA32_1>=RULE_ID && LA32_1<=RULE_STRING)||LA32_1==28||(LA32_1>=35 && LA32_1<=36)||LA32_1==41||(LA32_1>=46 && LA32_1<=51)||LA32_1==57||LA32_1==68||(LA32_1>=124 && LA32_1<=125)||LA32_1==127||LA32_1==129||(LA32_1>=133 && LA32_1<=141)||LA32_1==143||LA32_1==156) ) {
+                    alt32=2;
+                }
+                else if ( (LA32_1==27) ) {
+                    alt32=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 32, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 32, 0, input);
+
+                throw nvae;
+            }
+            switch (alt32) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4402:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4402:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    // InternalEntityMockDSL.g:4403:3: ( rule__OpOther__Group_5_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4404:3: ( rule__OpOther__Group_5_1_0__0 )
+                    // InternalEntityMockDSL.g:4404:4: rule__OpOther__Group_5_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpOther__Group_5_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4408:2: ( '>' )
+                    {
+                    // InternalEntityMockDSL.g:4408:2: ( '>' )
+                    // InternalEntityMockDSL.g:4409:3: '>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
+                    }
+                    match(input,27,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Alternatives_5_1"
+
+
+    // $ANTLR start "rule__OpOther__Alternatives_6_1"
+    // InternalEntityMockDSL.g:4418:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
+    public final void rule__OpOther__Alternatives_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4422:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
+            int alt33=3;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==28) ) {
+                int LA33_1 = input.LA(2);
+
+                if ( (synpred72_InternalEntityMockDSL()) ) {
+                    alt33=1;
+                }
+                else if ( (synpred73_InternalEntityMockDSL()) ) {
+                    alt33=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 33, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA33_0==32) ) {
+                alt33=3;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 33, 0, input);
+
+                throw nvae;
+            }
+            switch (alt33) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4423:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4423:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    // InternalEntityMockDSL.g:4424:3: ( rule__OpOther__Group_6_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4425:3: ( rule__OpOther__Group_6_1_0__0 )
+                    // InternalEntityMockDSL.g:4425:4: rule__OpOther__Group_6_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__OpOther__Group_6_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4429:2: ( '<' )
+                    {
+                    // InternalEntityMockDSL.g:4429:2: ( '<' )
+                    // InternalEntityMockDSL.g:4430:3: '<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
+                    }
+                    match(input,28,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4435:2: ( '=>' )
+                    {
+                    // InternalEntityMockDSL.g:4435:2: ( '=>' )
+                    // InternalEntityMockDSL.g:4436:3: '=>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
+                    }
+                    match(input,32,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Alternatives_6_1"
+
+
+    // $ANTLR start "rule__OpAdd__Alternatives"
+    // InternalEntityMockDSL.g:4445:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
+    public final void rule__OpAdd__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4449:1: ( ( '+' ) | ( '-' ) )
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==35) ) {
+                alt34=1;
+            }
+            else if ( (LA34_0==36) ) {
+                alt34=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 34, 0, input);
+
+                throw nvae;
+            }
+            switch (alt34) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4450:2: ( '+' )
+                    {
+                    // InternalEntityMockDSL.g:4450:2: ( '+' )
+                    // InternalEntityMockDSL.g:4451:3: '+'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
+                    }
+                    match(input,35,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4456:2: ( '-' )
+                    {
+                    // InternalEntityMockDSL.g:4456:2: ( '-' )
+                    // InternalEntityMockDSL.g:4457:3: '-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
+                    }
+                    match(input,36,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpAdd__Alternatives"
+
+
+    // $ANTLR start "rule__OpMulti__Alternatives"
+    // InternalEntityMockDSL.g:4466:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
+    public final void rule__OpMulti__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4470:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
+            int alt35=4;
+            switch ( input.LA(1) ) {
+            case 37:
+                {
+                alt35=1;
+                }
+                break;
+            case 38:
+                {
+                alt35=2;
+                }
+                break;
+            case 39:
+                {
+                alt35=3;
+                }
+                break;
+            case 40:
+                {
+                alt35=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 35, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt35) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4471:2: ( '*' )
+                    {
+                    // InternalEntityMockDSL.g:4471:2: ( '*' )
+                    // InternalEntityMockDSL.g:4472:3: '*'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
+                    }
+                    match(input,37,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4477:2: ( '**' )
+                    {
+                    // InternalEntityMockDSL.g:4477:2: ( '**' )
+                    // InternalEntityMockDSL.g:4478:3: '**'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
+                    }
+                    match(input,38,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4483:2: ( '/' )
+                    {
+                    // InternalEntityMockDSL.g:4483:2: ( '/' )
+                    // InternalEntityMockDSL.g:4484:3: '/'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
+                    }
+                    match(input,39,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4489:2: ( '%' )
+                    {
+                    // InternalEntityMockDSL.g:4489:2: ( '%' )
+                    // InternalEntityMockDSL.g:4490:3: '%'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
+                    }
+                    match(input,40,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMulti__Alternatives"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Alternatives"
+    // InternalEntityMockDSL.g:4499:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
+    public final void rule__XUnaryOperation__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4503:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
+            int alt36=2;
+            int LA36_0 = input.LA(1);
+
+            if ( ((LA36_0>=35 && LA36_0<=36)||LA36_0==41) ) {
+                alt36=1;
+            }
+            else if ( ((LA36_0>=RULE_ID && LA36_0<=RULE_STRING)||LA36_0==28||(LA36_0>=46 && LA36_0<=51)||LA36_0==57||LA36_0==68||(LA36_0>=124 && LA36_0<=125)||LA36_0==127||LA36_0==129||(LA36_0>=133 && LA36_0<=141)||LA36_0==143||LA36_0==156) ) {
+                alt36=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 36, 0, input);
+
+                throw nvae;
+            }
+            switch (alt36) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4504:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4504:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:4505:3: ( rule__XUnaryOperation__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4506:3: ( rule__XUnaryOperation__Group_0__0 )
+                    // InternalEntityMockDSL.g:4506:4: rule__XUnaryOperation__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XUnaryOperation__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4510:2: ( ruleXCastedExpression )
+                    {
+                    // InternalEntityMockDSL.g:4510:2: ( ruleXCastedExpression )
+                    // InternalEntityMockDSL.g:4511:3: ruleXCastedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXCastedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Alternatives"
+
+
+    // $ANTLR start "rule__OpUnary__Alternatives"
+    // InternalEntityMockDSL.g:4520:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
+    public final void rule__OpUnary__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4524:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
+            int alt37=3;
+            switch ( input.LA(1) ) {
+            case 41:
+                {
+                alt37=1;
+                }
+                break;
+            case 36:
+                {
+                alt37=2;
+                }
+                break;
+            case 35:
+                {
+                alt37=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 37, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt37) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4525:2: ( '!' )
+                    {
+                    // InternalEntityMockDSL.g:4525:2: ( '!' )
+                    // InternalEntityMockDSL.g:4526:3: '!'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
+                    }
+                    match(input,41,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4531:2: ( '-' )
+                    {
+                    // InternalEntityMockDSL.g:4531:2: ( '-' )
+                    // InternalEntityMockDSL.g:4532:3: '-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
+                    }
+                    match(input,36,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4537:2: ( '+' )
+                    {
+                    // InternalEntityMockDSL.g:4537:2: ( '+' )
+                    // InternalEntityMockDSL.g:4538:3: '+'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
+                    }
+                    match(input,35,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpUnary__Alternatives"
+
+
+    // $ANTLR start "rule__OpPostfix__Alternatives"
+    // InternalEntityMockDSL.g:4547:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
+    public final void rule__OpPostfix__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4551:1: ( ( '++' ) | ( '--' ) )
+            int alt38=2;
+            int LA38_0 = input.LA(1);
+
+            if ( (LA38_0==42) ) {
+                alt38=1;
+            }
+            else if ( (LA38_0==43) ) {
+                alt38=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 38, 0, input);
+
+                throw nvae;
+            }
+            switch (alt38) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4552:2: ( '++' )
+                    {
+                    // InternalEntityMockDSL.g:4552:2: ( '++' )
+                    // InternalEntityMockDSL.g:4553:3: '++'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
+                    }
+                    match(input,42,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4558:2: ( '--' )
+                    {
+                    // InternalEntityMockDSL.g:4558:2: ( '--' )
+                    // InternalEntityMockDSL.g:4559:3: '--'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
+                    }
+                    match(input,43,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpPostfix__Alternatives"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1"
+    // InternalEntityMockDSL.g:4568:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
+    public final void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4572:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
+            int alt39=2;
+            alt39 = dfa39.predict(input);
+            switch (alt39) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4573:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4573:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    // InternalEntityMockDSL.g:4574:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4575:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    // InternalEntityMockDSL.g:4575:4: rule__XMemberFeatureCall__Group_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4579:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4579:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    // InternalEntityMockDSL.g:4580:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4581:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    // InternalEntityMockDSL.g:4581:4: rule__XMemberFeatureCall__Group_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Alternatives_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1"
+    // InternalEntityMockDSL.g:4589:1: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) );
+    public final void rule__XMemberFeatureCall__Alternatives_1_0_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4593:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
+            int alt40=2;
+            int LA40_0 = input.LA(1);
+
+            if ( (LA40_0==44) ) {
+                alt40=1;
+            }
+            else if ( (LA40_0==153) ) {
+                alt40=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 40, 0, input);
+
+                throw nvae;
+            }
+            switch (alt40) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4594:2: ( '.' )
+                    {
+                    // InternalEntityMockDSL.g:4594:2: ( '.' )
+                    // InternalEntityMockDSL.g:4595:3: '.'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
+                    }
+                    match(input,44,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4600:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4600:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    // InternalEntityMockDSL.g:4601:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4602:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    // InternalEntityMockDSL.g:4602:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1"
+    // InternalEntityMockDSL.g:4610:1: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) );
+    public final void rule__XMemberFeatureCall__Alternatives_1_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4614:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
+            int alt41=3;
+            switch ( input.LA(1) ) {
+            case 44:
+                {
+                alt41=1;
+                }
+                break;
+            case 154:
+                {
+                alt41=2;
+                }
+                break;
+            case 153:
+                {
+                alt41=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 41, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt41) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4615:2: ( '.' )
+                    {
+                    // InternalEntityMockDSL.g:4615:2: ( '.' )
+                    // InternalEntityMockDSL.g:4616:3: '.'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); 
+                    }
+                    match(input,44,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4621:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4621:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    // InternalEntityMockDSL.g:4622:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4623:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    // InternalEntityMockDSL.g:4623:4: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4627:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    {
+                    // InternalEntityMockDSL.g:4627:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    // InternalEntityMockDSL.g:4628:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); 
+                    }
+                    // InternalEntityMockDSL.g:4629:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    // InternalEntityMockDSL.g:4629:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_3_1"
+    // InternalEntityMockDSL.g:4637:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );
+    public final void rule__XMemberFeatureCall__Alternatives_1_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4641:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) )
+            int alt42=2;
+            alt42 = dfa42.predict(input);
+            switch (alt42) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4642:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4642:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    // InternalEntityMockDSL.g:4643:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4644:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    // InternalEntityMockDSL.g:4644:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4648:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4648:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    // InternalEntityMockDSL.g:4649:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4650:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    // InternalEntityMockDSL.g:4650:4: rule__XMemberFeatureCall__Group_1_1_3_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Group_1_1_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Alternatives_1_1_3_1"
+
+
+    // $ANTLR start "rule__XPrimaryExpression__Alternatives"
+    // InternalEntityMockDSL.g:4658:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );
+    public final void rule__XPrimaryExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4662:1: ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) )
+            int alt43=15;
+            alt43 = dfa43.predict(input);
+            switch (alt43) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4663:2: ( ruleXConstructorCall )
+                    {
+                    // InternalEntityMockDSL.g:4663:2: ( ruleXConstructorCall )
+                    // InternalEntityMockDSL.g:4664:3: ruleXConstructorCall
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXConstructorCall();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4669:2: ( ruleXBlockExpression )
+                    {
+                    // InternalEntityMockDSL.g:4669:2: ( ruleXBlockExpression )
+                    // InternalEntityMockDSL.g:4670:3: ruleXBlockExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXBlockExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4675:2: ( ruleXSwitchExpression )
+                    {
+                    // InternalEntityMockDSL.g:4675:2: ( ruleXSwitchExpression )
+                    // InternalEntityMockDSL.g:4676:3: ruleXSwitchExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXSwitchExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4681:2: ( ( ruleXSynchronizedExpression ) )
+                    {
+                    // InternalEntityMockDSL.g:4681:2: ( ( ruleXSynchronizedExpression ) )
+                    // InternalEntityMockDSL.g:4682:3: ( ruleXSynchronizedExpression )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
+                    }
+                    // InternalEntityMockDSL.g:4683:3: ( ruleXSynchronizedExpression )
+                    // InternalEntityMockDSL.g:4683:4: ruleXSynchronizedExpression
+                    {
+                    pushFollow(FOLLOW_2);
+                    ruleXSynchronizedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:4687:2: ( ruleXFeatureCall )
+                    {
+                    // InternalEntityMockDSL.g:4687:2: ( ruleXFeatureCall )
+                    // InternalEntityMockDSL.g:4688:3: ruleXFeatureCall
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXFeatureCall();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:4693:2: ( ruleXLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4693:2: ( ruleXLiteral )
+                    // InternalEntityMockDSL.g:4694:3: ruleXLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:4699:2: ( ruleXIfExpression )
+                    {
+                    // InternalEntityMockDSL.g:4699:2: ( ruleXIfExpression )
+                    // InternalEntityMockDSL.g:4700:3: ruleXIfExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXIfExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalEntityMockDSL.g:4705:2: ( ( ruleXForLoopExpression ) )
+                    {
+                    // InternalEntityMockDSL.g:4705:2: ( ( ruleXForLoopExpression ) )
+                    // InternalEntityMockDSL.g:4706:3: ( ruleXForLoopExpression )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
+                    }
+                    // InternalEntityMockDSL.g:4707:3: ( ruleXForLoopExpression )
+                    // InternalEntityMockDSL.g:4707:4: ruleXForLoopExpression
+                    {
+                    pushFollow(FOLLOW_2);
+                    ruleXForLoopExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalEntityMockDSL.g:4711:2: ( ruleXBasicForLoopExpression )
+                    {
+                    // InternalEntityMockDSL.g:4711:2: ( ruleXBasicForLoopExpression )
+                    // InternalEntityMockDSL.g:4712:3: ruleXBasicForLoopExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXBasicForLoopExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalEntityMockDSL.g:4717:2: ( ruleXWhileExpression )
+                    {
+                    // InternalEntityMockDSL.g:4717:2: ( ruleXWhileExpression )
+                    // InternalEntityMockDSL.g:4718:3: ruleXWhileExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXWhileExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalEntityMockDSL.g:4723:2: ( ruleXDoWhileExpression )
+                    {
+                    // InternalEntityMockDSL.g:4723:2: ( ruleXDoWhileExpression )
+                    // InternalEntityMockDSL.g:4724:3: ruleXDoWhileExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXDoWhileExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalEntityMockDSL.g:4729:2: ( ruleXThrowExpression )
+                    {
+                    // InternalEntityMockDSL.g:4729:2: ( ruleXThrowExpression )
+                    // InternalEntityMockDSL.g:4730:3: ruleXThrowExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXThrowExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalEntityMockDSL.g:4735:2: ( ruleXReturnExpression )
+                    {
+                    // InternalEntityMockDSL.g:4735:2: ( ruleXReturnExpression )
+                    // InternalEntityMockDSL.g:4736:3: ruleXReturnExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXReturnExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalEntityMockDSL.g:4741:2: ( ruleXTryCatchFinallyExpression )
+                    {
+                    // InternalEntityMockDSL.g:4741:2: ( ruleXTryCatchFinallyExpression )
+                    // InternalEntityMockDSL.g:4742:3: ruleXTryCatchFinallyExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXTryCatchFinallyExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalEntityMockDSL.g:4747:2: ( ruleXParenthesizedExpression )
+                    {
+                    // InternalEntityMockDSL.g:4747:2: ( ruleXParenthesizedExpression )
+                    // InternalEntityMockDSL.g:4748:3: ruleXParenthesizedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXParenthesizedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPrimaryExpression__Alternatives"
+
+
+    // $ANTLR start "rule__XLiteral__Alternatives"
+    // InternalEntityMockDSL.g:4757:1: rule__XLiteral__Alternatives : ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) );
+    public final void rule__XLiteral__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4761:1: ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) )
+            int alt44=7;
+            switch ( input.LA(1) ) {
+            case 124:
+                {
+                alt44=1;
+                }
+                break;
+            case 125:
+                {
+                alt44=2;
+                }
+                break;
+            case 51:
+            case 156:
+                {
+                alt44=3;
+                }
+                break;
+            case RULE_HEX:
+            case RULE_INT:
+            case RULE_DECIMAL:
+                {
+                alt44=4;
+                }
+                break;
+            case 137:
+                {
+                alt44=5;
+                }
+                break;
+            case RULE_STRING:
+                {
+                alt44=6;
+                }
+                break;
+            case 138:
+                {
+                alt44=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 44, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt44) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4762:2: ( ruleXCollectionLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4762:2: ( ruleXCollectionLiteral )
+                    // InternalEntityMockDSL.g:4763:3: ruleXCollectionLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXCollectionLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4768:2: ( ( ruleXClosure ) )
+                    {
+                    // InternalEntityMockDSL.g:4768:2: ( ( ruleXClosure ) )
+                    // InternalEntityMockDSL.g:4769:3: ( ruleXClosure )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4770:3: ( ruleXClosure )
+                    // InternalEntityMockDSL.g:4770:4: ruleXClosure
+                    {
+                    pushFollow(FOLLOW_2);
+                    ruleXClosure();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4774:2: ( ruleXBooleanLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4774:2: ( ruleXBooleanLiteral )
+                    // InternalEntityMockDSL.g:4775:3: ruleXBooleanLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXBooleanLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4780:2: ( ruleXNumberLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4780:2: ( ruleXNumberLiteral )
+                    // InternalEntityMockDSL.g:4781:3: ruleXNumberLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXNumberLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:4786:2: ( ruleXNullLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4786:2: ( ruleXNullLiteral )
+                    // InternalEntityMockDSL.g:4787:3: ruleXNullLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXNullLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:4792:2: ( ruleXStringLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4792:2: ( ruleXStringLiteral )
+                    // InternalEntityMockDSL.g:4793:3: ruleXStringLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXStringLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:4798:2: ( ruleXTypeLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4798:2: ( ruleXTypeLiteral )
+                    // InternalEntityMockDSL.g:4799:3: ruleXTypeLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXTypeLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XLiteral__Alternatives"
+
+
+    // $ANTLR start "rule__XCollectionLiteral__Alternatives"
+    // InternalEntityMockDSL.g:4808:1: rule__XCollectionLiteral__Alternatives : ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) );
+    public final void rule__XCollectionLiteral__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4812:1: ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) )
+            int alt45=2;
+            int LA45_0 = input.LA(1);
+
+            if ( (LA45_0==124) ) {
+                int LA45_1 = input.LA(2);
+
+                if ( (LA45_1==57) ) {
+                    alt45=1;
+                }
+                else if ( (LA45_1==125) ) {
+                    alt45=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 45, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 45, 0, input);
+
+                throw nvae;
+            }
+            switch (alt45) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4813:2: ( ruleXSetLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4813:2: ( ruleXSetLiteral )
+                    // InternalEntityMockDSL.g:4814:3: ruleXSetLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXSetLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4819:2: ( ruleXListLiteral )
+                    {
+                    // InternalEntityMockDSL.g:4819:2: ( ruleXListLiteral )
+                    // InternalEntityMockDSL.g:4820:3: ruleXListLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXListLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCollectionLiteral__Alternatives"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Alternatives_2"
+    // InternalEntityMockDSL.g:4829:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );
+    public final void rule__XSwitchExpression__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4833:1: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) )
+            int alt46=2;
+            alt46 = dfa46.predict(input);
+            switch (alt46) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4834:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4834:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    // InternalEntityMockDSL.g:4835:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4836:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    // InternalEntityMockDSL.g:4836:4: rule__XSwitchExpression__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XSwitchExpression__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4840:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4840:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    // InternalEntityMockDSL.g:4841:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4842:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    // InternalEntityMockDSL.g:4842:4: rule__XSwitchExpression__Group_2_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XSwitchExpression__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Alternatives_2"
+
+
+    // $ANTLR start "rule__XCasePart__Alternatives_3"
+    // InternalEntityMockDSL.g:4850:1: rule__XCasePart__Alternatives_3 : ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) );
+    public final void rule__XCasePart__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4854:1: ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) )
+            int alt47=2;
+            int LA47_0 = input.LA(1);
+
+            if ( (LA47_0==130) ) {
+                alt47=1;
+            }
+            else if ( (LA47_0==70) ) {
+                alt47=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 47, 0, input);
+
+                throw nvae;
+            }
+            switch (alt47) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4855:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4855:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    // InternalEntityMockDSL.g:4856:3: ( rule__XCasePart__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXCasePartAccess().getGroup_3_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4857:3: ( rule__XCasePart__Group_3_0__0 )
+                    // InternalEntityMockDSL.g:4857:4: rule__XCasePart__Group_3_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XCasePart__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXCasePartAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4861:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4861:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    // InternalEntityMockDSL.g:4862:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4863:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    // InternalEntityMockDSL.g:4863:4: rule__XCasePart__FallThroughAssignment_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XCasePart__FallThroughAssignment_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Alternatives_3"
+
+
+    // $ANTLR start "rule__XExpressionOrVarDeclaration__Alternatives"
+    // InternalEntityMockDSL.g:4871:1: rule__XExpressionOrVarDeclaration__Alternatives : ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) );
+    public final void rule__XExpressionOrVarDeclaration__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4875:1: ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) )
+            int alt48=2;
+            int LA48_0 = input.LA(1);
+
+            if ( (LA48_0==45||LA48_0==73) ) {
+                alt48=1;
+            }
+            else if ( ((LA48_0>=RULE_ID && LA48_0<=RULE_STRING)||LA48_0==28||(LA48_0>=35 && LA48_0<=36)||LA48_0==41||(LA48_0>=46 && LA48_0<=51)||LA48_0==57||LA48_0==68||(LA48_0>=124 && LA48_0<=125)||LA48_0==127||LA48_0==129||(LA48_0>=133 && LA48_0<=141)||LA48_0==143||LA48_0==156) ) {
+                alt48=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 48, 0, input);
+
+                throw nvae;
+            }
+            switch (alt48) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4876:2: ( ruleXVariableDeclaration )
+                    {
+                    // InternalEntityMockDSL.g:4876:2: ( ruleXVariableDeclaration )
+                    // InternalEntityMockDSL.g:4877:3: ruleXVariableDeclaration
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXVariableDeclaration();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4882:2: ( ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:4882:2: ( ruleXExpression )
+                    // InternalEntityMockDSL.g:4883:3: ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionOrVarDeclaration__Alternatives"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Alternatives_1"
+    // InternalEntityMockDSL.g:4892:1: rule__XVariableDeclaration__Alternatives_1 : ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) );
+    public final void rule__XVariableDeclaration__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4896:1: ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) )
+            int alt49=2;
+            int LA49_0 = input.LA(1);
+
+            if ( (LA49_0==73) ) {
+                alt49=1;
+            }
+            else if ( (LA49_0==45) ) {
+                alt49=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 49, 0, input);
+
+                throw nvae;
+            }
+            switch (alt49) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4897:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4897:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    // InternalEntityMockDSL.g:4898:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4899:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    // InternalEntityMockDSL.g:4899:4: rule__XVariableDeclaration__WriteableAssignment_1_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XVariableDeclaration__WriteableAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4903:2: ( 'val' )
+                    {
+                    // InternalEntityMockDSL.g:4903:2: ( 'val' )
+                    // InternalEntityMockDSL.g:4904:3: 'val'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); 
+                    }
+                    match(input,45,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Alternatives_1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Alternatives_2"
+    // InternalEntityMockDSL.g:4913:1: rule__XVariableDeclaration__Alternatives_2 : ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) );
+    public final void rule__XVariableDeclaration__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4917:1: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) )
+            int alt50=2;
+            int LA50_0 = input.LA(1);
+
+            if ( (LA50_0==RULE_ID) ) {
+                int LA50_1 = input.LA(2);
+
+                if ( (synpred112_InternalEntityMockDSL()) ) {
+                    alt50=1;
+                }
+                else if ( (true) ) {
+                    alt50=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 50, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA50_0==32||LA50_0==68) ) {
+                alt50=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 50, 0, input);
+
+                throw nvae;
+            }
+            switch (alt50) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4918:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4918:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    // InternalEntityMockDSL.g:4919:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4920:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    // InternalEntityMockDSL.g:4920:4: rule__XVariableDeclaration__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XVariableDeclaration__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4924:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:4924:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    // InternalEntityMockDSL.g:4925:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4926:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    // InternalEntityMockDSL.g:4926:4: rule__XVariableDeclaration__NameAssignment_2_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XVariableDeclaration__NameAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Alternatives_2"
+
+
+    // $ANTLR start "rule__XFeatureCall__Alternatives_3_1"
+    // InternalEntityMockDSL.g:4934:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );
+    public final void rule__XFeatureCall__Alternatives_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4938:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) )
+            int alt51=2;
+            alt51 = dfa51.predict(input);
+            switch (alt51) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4939:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4939:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    // InternalEntityMockDSL.g:4940:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:4941:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    // InternalEntityMockDSL.g:4941:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4945:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:4945:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    // InternalEntityMockDSL.g:4946:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:4947:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    // InternalEntityMockDSL.g:4947:4: rule__XFeatureCall__Group_3_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__Group_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Alternatives_3_1"
+
+
+    // $ANTLR start "rule__FeatureCallID__Alternatives"
+    // InternalEntityMockDSL.g:4955:1: rule__FeatureCallID__Alternatives : ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) );
+    public final void rule__FeatureCallID__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4959:1: ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) )
+            int alt52=5;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                alt52=1;
+                }
+                break;
+            case 46:
+                {
+                alt52=2;
+                }
+                break;
+            case 47:
+                {
+                alt52=3;
+                }
+                break;
+            case 48:
+                {
+                alt52=4;
+                }
+                break;
+            case 49:
+                {
+                alt52=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 52, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt52) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4960:2: ( ruleValidID )
+                    {
+                    // InternalEntityMockDSL.g:4960:2: ( ruleValidID )
+                    // InternalEntityMockDSL.g:4961:3: ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleValidID();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4966:2: ( 'extends' )
+                    {
+                    // InternalEntityMockDSL.g:4966:2: ( 'extends' )
+                    // InternalEntityMockDSL.g:4967:3: 'extends'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); 
+                    }
+                    match(input,46,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4972:2: ( 'static' )
+                    {
+                    // InternalEntityMockDSL.g:4972:2: ( 'static' )
+                    // InternalEntityMockDSL.g:4973:3: 'static'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); 
+                    }
+                    match(input,47,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4978:2: ( 'import' )
+                    {
+                    // InternalEntityMockDSL.g:4978:2: ( 'import' )
+                    // InternalEntityMockDSL.g:4979:3: 'import'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); 
+                    }
+                    match(input,48,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:4984:2: ( 'extension' )
+                    {
+                    // InternalEntityMockDSL.g:4984:2: ( 'extension' )
+                    // InternalEntityMockDSL.g:4985:3: 'extension'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); 
+                    }
+                    match(input,49,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FeatureCallID__Alternatives"
+
+
+    // $ANTLR start "rule__IdOrSuper__Alternatives"
+    // InternalEntityMockDSL.g:4994:1: rule__IdOrSuper__Alternatives : ( ( ruleFeatureCallID ) | ( 'super' ) );
+    public final void rule__IdOrSuper__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:4998:1: ( ( ruleFeatureCallID ) | ( 'super' ) )
+            int alt53=2;
+            int LA53_0 = input.LA(1);
+
+            if ( (LA53_0==RULE_ID||(LA53_0>=46 && LA53_0<=49)) ) {
+                alt53=1;
+            }
+            else if ( (LA53_0==50) ) {
+                alt53=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 53, 0, input);
+
+                throw nvae;
+            }
+            switch (alt53) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4999:2: ( ruleFeatureCallID )
+                    {
+                    // InternalEntityMockDSL.g:4999:2: ( ruleFeatureCallID )
+                    // InternalEntityMockDSL.g:5000:3: ruleFeatureCallID
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleFeatureCallID();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5005:2: ( 'super' )
+                    {
+                    // InternalEntityMockDSL.g:5005:2: ( 'super' )
+                    // InternalEntityMockDSL.g:5006:3: 'super'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); 
+                    }
+                    match(input,50,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IdOrSuper__Alternatives"
+
+
+    // $ANTLR start "rule__XConstructorCall__Alternatives_4_1"
+    // InternalEntityMockDSL.g:5015:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );
+    public final void rule__XConstructorCall__Alternatives_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5019:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) )
+            int alt54=2;
+            alt54 = dfa54.predict(input);
+            switch (alt54) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5020:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5020:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    // InternalEntityMockDSL.g:5021:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:5022:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    // InternalEntityMockDSL.g:5022:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__ArgumentsAssignment_4_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5026:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5026:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    // InternalEntityMockDSL.g:5027:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5028:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    // InternalEntityMockDSL.g:5028:4: rule__XConstructorCall__Group_4_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__Group_4_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Alternatives_4_1"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__Alternatives_1"
+    // InternalEntityMockDSL.g:5036:1: rule__XBooleanLiteral__Alternatives_1 : ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) );
+    public final void rule__XBooleanLiteral__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5040:1: ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) )
+            int alt55=2;
+            int LA55_0 = input.LA(1);
+
+            if ( (LA55_0==51) ) {
+                alt55=1;
+            }
+            else if ( (LA55_0==156) ) {
+                alt55=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 55, 0, input);
+
+                throw nvae;
+            }
+            switch (alt55) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5041:2: ( 'false' )
+                    {
+                    // InternalEntityMockDSL.g:5041:2: ( 'false' )
+                    // InternalEntityMockDSL.g:5042:3: 'false'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); 
+                    }
+                    match(input,51,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5047:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    {
+                    // InternalEntityMockDSL.g:5047:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    // InternalEntityMockDSL.g:5048:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5049:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    // InternalEntityMockDSL.g:5049:4: rule__XBooleanLiteral__IsTrueAssignment_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XBooleanLiteral__IsTrueAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__Alternatives_1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Alternatives_3"
+    // InternalEntityMockDSL.g:5057:1: rule__XTryCatchFinallyExpression__Alternatives_3 : ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) );
+    public final void rule__XTryCatchFinallyExpression__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5061:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) )
+            int alt56=2;
+            int LA56_0 = input.LA(1);
+
+            if ( (LA56_0==144) ) {
+                alt56=1;
+            }
+            else if ( (LA56_0==142) ) {
+                alt56=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 56, 0, input);
+
+                throw nvae;
+            }
+            switch (alt56) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5062:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5062:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    // InternalEntityMockDSL.g:5063:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); 
+                    }
+                    // InternalEntityMockDSL.g:5064:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    // InternalEntityMockDSL.g:5064:4: rule__XTryCatchFinallyExpression__Group_3_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XTryCatchFinallyExpression__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5068:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5068:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    // InternalEntityMockDSL.g:5069:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5070:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    // InternalEntityMockDSL.g:5070:4: rule__XTryCatchFinallyExpression__Group_3_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XTryCatchFinallyExpression__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Alternatives_3"
+
+
+    // $ANTLR start "rule__Number__Alternatives"
+    // InternalEntityMockDSL.g:5078:1: rule__Number__Alternatives : ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) );
+    public final void rule__Number__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5082:1: ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) )
+            int alt57=2;
+            int LA57_0 = input.LA(1);
+
+            if ( (LA57_0==RULE_HEX) ) {
+                alt57=1;
+            }
+            else if ( ((LA57_0>=RULE_INT && LA57_0<=RULE_DECIMAL)) ) {
+                alt57=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 57, 0, input);
+
+                throw nvae;
+            }
+            switch (alt57) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5083:2: ( RULE_HEX )
+                    {
+                    // InternalEntityMockDSL.g:5083:2: ( RULE_HEX )
+                    // InternalEntityMockDSL.g:5084:3: RULE_HEX
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); 
+                    }
+                    match(input,RULE_HEX,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5089:2: ( ( rule__Number__Group_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5089:2: ( ( rule__Number__Group_1__0 ) )
+                    // InternalEntityMockDSL.g:5090:3: ( rule__Number__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getGroup_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5091:3: ( rule__Number__Group_1__0 )
+                    // InternalEntityMockDSL.g:5091:4: rule__Number__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Number__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Alternatives"
+
+
+    // $ANTLR start "rule__Number__Alternatives_1_0"
+    // InternalEntityMockDSL.g:5099:1: rule__Number__Alternatives_1_0 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    public final void rule__Number__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5103:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            int alt58=2;
+            int LA58_0 = input.LA(1);
+
+            if ( (LA58_0==RULE_INT) ) {
+                alt58=1;
+            }
+            else if ( (LA58_0==RULE_DECIMAL) ) {
+                alt58=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 58, 0, input);
+
+                throw nvae;
+            }
+            switch (alt58) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5104:2: ( RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:5104:2: ( RULE_INT )
+                    // InternalEntityMockDSL.g:5105:3: RULE_INT
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); 
+                    }
+                    match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5110:2: ( RULE_DECIMAL )
+                    {
+                    // InternalEntityMockDSL.g:5110:2: ( RULE_DECIMAL )
+                    // InternalEntityMockDSL.g:5111:3: RULE_DECIMAL
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); 
+                    }
+                    match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__Number__Alternatives_1_1_1"
+    // InternalEntityMockDSL.g:5120:1: rule__Number__Alternatives_1_1_1 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    public final void rule__Number__Alternatives_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5124:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            int alt59=2;
+            int LA59_0 = input.LA(1);
+
+            if ( (LA59_0==RULE_INT) ) {
+                alt59=1;
+            }
+            else if ( (LA59_0==RULE_DECIMAL) ) {
+                alt59=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 59, 0, input);
+
+                throw nvae;
+            }
+            switch (alt59) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5125:2: ( RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:5125:2: ( RULE_INT )
+                    // InternalEntityMockDSL.g:5126:3: RULE_INT
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); 
+                    }
+                    match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5131:2: ( RULE_DECIMAL )
+                    {
+                    // InternalEntityMockDSL.g:5131:2: ( RULE_DECIMAL )
+                    // InternalEntityMockDSL.g:5132:3: RULE_DECIMAL
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); 
+                    }
+                    match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Alternatives_1_1_1"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Alternatives"
+    // InternalEntityMockDSL.g:5141:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
+    public final void rule__JvmTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5145:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
+            int alt60=2;
+            int LA60_0 = input.LA(1);
+
+            if ( (LA60_0==RULE_ID) ) {
+                alt60=1;
+            }
+            else if ( (LA60_0==32||LA60_0==68) ) {
+                alt60=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 60, 0, input);
+
+                throw nvae;
+            }
+            switch (alt60) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5146:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5146:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalEntityMockDSL.g:5147:3: ( rule__JvmTypeReference__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+                    // InternalEntityMockDSL.g:5148:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalEntityMockDSL.g:5148:4: rule__JvmTypeReference__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmTypeReference__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5152:2: ( ruleXFunctionTypeRef )
+                    {
+                    // InternalEntityMockDSL.g:5152:2: ( ruleXFunctionTypeRef )
+                    // InternalEntityMockDSL.g:5153:3: ruleXFunctionTypeRef
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXFunctionTypeRef();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Alternatives"
+
+
+    // $ANTLR start "rule__JvmArgumentTypeReference__Alternatives"
+    // InternalEntityMockDSL.g:5162:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
+    public final void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5166:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
+            int alt61=2;
+            int LA61_0 = input.LA(1);
+
+            if ( (LA61_0==RULE_ID||LA61_0==32||LA61_0==68) ) {
+                alt61=1;
+            }
+            else if ( (LA61_0==145) ) {
+                alt61=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 61, 0, input);
+
+                throw nvae;
+            }
+            switch (alt61) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5167:2: ( ruleJvmTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:5167:2: ( ruleJvmTypeReference )
+                    // InternalEntityMockDSL.g:5168:3: ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5173:2: ( ruleJvmWildcardTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:5173:2: ( ruleJvmWildcardTypeReference )
+                    // InternalEntityMockDSL.g:5174:3: ruleJvmWildcardTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleJvmWildcardTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmArgumentTypeReference__Alternatives"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Alternatives_2"
+    // InternalEntityMockDSL.g:5183:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
+    public final void rule__JvmWildcardTypeReference__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5187:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
+            int alt62=2;
+            int LA62_0 = input.LA(1);
+
+            if ( (LA62_0==46) ) {
+                alt62=1;
+            }
+            else if ( (LA62_0==50) ) {
+                alt62=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 62, 0, input);
+
+                throw nvae;
+            }
+            switch (alt62) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5188:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5188:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalEntityMockDSL.g:5189:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
+                    }
+                    // InternalEntityMockDSL.g:5190:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalEntityMockDSL.g:5190:4: rule__JvmWildcardTypeReference__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5194:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    {
+                    // InternalEntityMockDSL.g:5194:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalEntityMockDSL.g:5195:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5196:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalEntityMockDSL.g:5196:4: rule__JvmWildcardTypeReference__Group_2_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Alternatives_2"
+
+
+    // $ANTLR start "rule__EDateStepType__Alternatives"
+    // InternalEntityMockDSL.g:5204:1: rule__EDateStepType__Alternatives : ( ( ( 'days' ) ) | ( ( 'weeks' ) ) | ( ( 'months' ) ) | ( ( 'years' ) ) );
+    public final void rule__EDateStepType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5208:1: ( ( ( 'days' ) ) | ( ( 'weeks' ) ) | ( ( 'months' ) ) | ( ( 'years' ) ) )
+            int alt63=4;
+            switch ( input.LA(1) ) {
+            case 52:
+                {
+                alt63=1;
+                }
+                break;
+            case 53:
+                {
+                alt63=2;
+                }
+                break;
+            case 54:
+                {
+                alt63=3;
+                }
+                break;
+            case 55:
+                {
+                alt63=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 63, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt63) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5209:2: ( ( 'days' ) )
+                    {
+                    // InternalEntityMockDSL.g:5209:2: ( ( 'days' ) )
+                    // InternalEntityMockDSL.g:5210:3: ( 'days' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalEntityMockDSL.g:5211:3: ( 'days' )
+                    // InternalEntityMockDSL.g:5211:4: 'days'
+                    {
+                    match(input,52,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5215:2: ( ( 'weeks' ) )
+                    {
+                    // InternalEntityMockDSL.g:5215:2: ( ( 'weeks' ) )
+                    // InternalEntityMockDSL.g:5216:3: ( 'weeks' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalEntityMockDSL.g:5217:3: ( 'weeks' )
+                    // InternalEntityMockDSL.g:5217:4: 'weeks'
+                    {
+                    match(input,53,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:5221:2: ( ( 'months' ) )
+                    {
+                    // InternalEntityMockDSL.g:5221:2: ( ( 'months' ) )
+                    // InternalEntityMockDSL.g:5222:3: ( 'months' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalEntityMockDSL.g:5223:3: ( 'months' )
+                    // InternalEntityMockDSL.g:5223:4: 'months'
+                    {
+                    match(input,54,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:5227:2: ( ( 'years' ) )
+                    {
+                    // InternalEntityMockDSL.g:5227:2: ( ( 'years' ) )
+                    // InternalEntityMockDSL.g:5228:3: ( 'years' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalEntityMockDSL.g:5229:3: ( 'years' )
+                    // InternalEntityMockDSL.g:5229:4: 'years'
+                    {
+                    match(input,55,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDateStepType__Alternatives"
+
+
+    // $ANTLR start "rule__EntityMockModel__Group__0"
+    // InternalEntityMockDSL.g:5237:1: rule__EntityMockModel__Group__0 : rule__EntityMockModel__Group__0__Impl rule__EntityMockModel__Group__1 ;
+    public final void rule__EntityMockModel__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5241:1: ( rule__EntityMockModel__Group__0__Impl rule__EntityMockModel__Group__1 )
+            // InternalEntityMockDSL.g:5242:2: rule__EntityMockModel__Group__0__Impl rule__EntityMockModel__Group__1
+            {
+            pushFollow(FOLLOW_5);
+            rule__EntityMockModel__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockModel__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockModel__Group__0__Impl"
+    // InternalEntityMockDSL.g:5249:1: rule__EntityMockModel__Group__0__Impl : ( ( rule__EntityMockModel__ImportSectionAssignment_0 )? ) ;
+    public final void rule__EntityMockModel__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5253:1: ( ( ( rule__EntityMockModel__ImportSectionAssignment_0 )? ) )
+            // InternalEntityMockDSL.g:5254:1: ( ( rule__EntityMockModel__ImportSectionAssignment_0 )? )
+            {
+            // InternalEntityMockDSL.g:5254:1: ( ( rule__EntityMockModel__ImportSectionAssignment_0 )? )
+            // InternalEntityMockDSL.g:5255:2: ( rule__EntityMockModel__ImportSectionAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelAccess().getImportSectionAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:5256:2: ( rule__EntityMockModel__ImportSectionAssignment_0 )?
+            int alt64=2;
+            int LA64_0 = input.LA(1);
+
+            if ( (LA64_0==48) ) {
+                alt64=1;
+            }
+            switch (alt64) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5256:3: rule__EntityMockModel__ImportSectionAssignment_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockModel__ImportSectionAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelAccess().getImportSectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockModel__Group__1"
+    // InternalEntityMockDSL.g:5264:1: rule__EntityMockModel__Group__1 : rule__EntityMockModel__Group__1__Impl ;
+    public final void rule__EntityMockModel__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5268:1: ( rule__EntityMockModel__Group__1__Impl )
+            // InternalEntityMockDSL.g:5269:2: rule__EntityMockModel__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockModel__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockModel__Group__1__Impl"
+    // InternalEntityMockDSL.g:5275:1: rule__EntityMockModel__Group__1__Impl : ( ( rule__EntityMockModel__PackagesAssignment_1 )* ) ;
+    public final void rule__EntityMockModel__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5279:1: ( ( ( rule__EntityMockModel__PackagesAssignment_1 )* ) )
+            // InternalEntityMockDSL.g:5280:1: ( ( rule__EntityMockModel__PackagesAssignment_1 )* )
+            {
+            // InternalEntityMockDSL.g:5280:1: ( ( rule__EntityMockModel__PackagesAssignment_1 )* )
+            // InternalEntityMockDSL.g:5281:2: ( rule__EntityMockModel__PackagesAssignment_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelAccess().getPackagesAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:5282:2: ( rule__EntityMockModel__PackagesAssignment_1 )*
+            loop65:
+            do {
+                int alt65=2;
+                int LA65_0 = input.LA(1);
+
+                if ( (LA65_0==56) ) {
+                    alt65=1;
+                }
+
+
+                switch (alt65) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5282:3: rule__EntityMockModel__PackagesAssignment_1
+            	    {
+            	    pushFollow(FOLLOW_6);
+            	    rule__EntityMockModel__PackagesAssignment_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop65;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelAccess().getPackagesAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__0"
+    // InternalEntityMockDSL.g:5291:1: rule__EntityMockPackage__Group__0 : rule__EntityMockPackage__Group__0__Impl rule__EntityMockPackage__Group__1 ;
+    public final void rule__EntityMockPackage__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5295:1: ( rule__EntityMockPackage__Group__0__Impl rule__EntityMockPackage__Group__1 )
+            // InternalEntityMockDSL.g:5296:2: rule__EntityMockPackage__Group__0__Impl rule__EntityMockPackage__Group__1
+            {
+            pushFollow(FOLLOW_5);
+            rule__EntityMockPackage__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__0__Impl"
+    // InternalEntityMockDSL.g:5303:1: rule__EntityMockPackage__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockPackage__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5307:1: ( ( () ) )
+            // InternalEntityMockDSL.g:5308:1: ( () )
+            {
+            // InternalEntityMockDSL.g:5308:1: ( () )
+            // InternalEntityMockDSL.g:5309:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0()); 
+            }
+            // InternalEntityMockDSL.g:5310:2: ()
+            // InternalEntityMockDSL.g:5310:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__1"
+    // InternalEntityMockDSL.g:5318:1: rule__EntityMockPackage__Group__1 : rule__EntityMockPackage__Group__1__Impl rule__EntityMockPackage__Group__2 ;
+    public final void rule__EntityMockPackage__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5322:1: ( rule__EntityMockPackage__Group__1__Impl rule__EntityMockPackage__Group__2 )
+            // InternalEntityMockDSL.g:5323:2: rule__EntityMockPackage__Group__1__Impl rule__EntityMockPackage__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockPackage__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__1__Impl"
+    // InternalEntityMockDSL.g:5330:1: rule__EntityMockPackage__Group__1__Impl : ( 'package' ) ;
+    public final void rule__EntityMockPackage__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5334:1: ( ( 'package' ) )
+            // InternalEntityMockDSL.g:5335:1: ( 'package' )
+            {
+            // InternalEntityMockDSL.g:5335:1: ( 'package' )
+            // InternalEntityMockDSL.g:5336:2: 'package'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1()); 
+            }
+            match(input,56,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__2"
+    // InternalEntityMockDSL.g:5345:1: rule__EntityMockPackage__Group__2 : rule__EntityMockPackage__Group__2__Impl rule__EntityMockPackage__Group__3 ;
+    public final void rule__EntityMockPackage__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5349:1: ( rule__EntityMockPackage__Group__2__Impl rule__EntityMockPackage__Group__3 )
+            // InternalEntityMockDSL.g:5350:2: rule__EntityMockPackage__Group__2__Impl rule__EntityMockPackage__Group__3
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockPackage__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__2__Impl"
+    // InternalEntityMockDSL.g:5357:1: rule__EntityMockPackage__Group__2__Impl : ( ( rule__EntityMockPackage__NameAssignment_2 ) ) ;
+    public final void rule__EntityMockPackage__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5361:1: ( ( ( rule__EntityMockPackage__NameAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:5362:1: ( ( rule__EntityMockPackage__NameAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:5362:1: ( ( rule__EntityMockPackage__NameAssignment_2 ) )
+            // InternalEntityMockDSL.g:5363:2: ( rule__EntityMockPackage__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getNameAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:5364:2: ( rule__EntityMockPackage__NameAssignment_2 )
+            // InternalEntityMockDSL.g:5364:3: rule__EntityMockPackage__NameAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__3"
+    // InternalEntityMockDSL.g:5372:1: rule__EntityMockPackage__Group__3 : rule__EntityMockPackage__Group__3__Impl ;
+    public final void rule__EntityMockPackage__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5376:1: ( rule__EntityMockPackage__Group__3__Impl )
+            // InternalEntityMockDSL.g:5377:2: rule__EntityMockPackage__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group__3__Impl"
+    // InternalEntityMockDSL.g:5383:1: rule__EntityMockPackage__Group__3__Impl : ( ( rule__EntityMockPackage__Group_3__0 )? ) ;
+    public final void rule__EntityMockPackage__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5387:1: ( ( ( rule__EntityMockPackage__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:5388:1: ( ( rule__EntityMockPackage__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:5388:1: ( ( rule__EntityMockPackage__Group_3__0 )? )
+            // InternalEntityMockDSL.g:5389:2: ( rule__EntityMockPackage__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:5390:2: ( rule__EntityMockPackage__Group_3__0 )?
+            int alt66=2;
+            int LA66_0 = input.LA(1);
+
+            if ( (LA66_0==57) ) {
+                alt66=1;
+            }
+            switch (alt66) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5390:3: rule__EntityMockPackage__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockPackage__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__0"
+    // InternalEntityMockDSL.g:5399:1: rule__EntityMockPackage__Group_3__0 : rule__EntityMockPackage__Group_3__0__Impl rule__EntityMockPackage__Group_3__1 ;
+    public final void rule__EntityMockPackage__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5403:1: ( rule__EntityMockPackage__Group_3__0__Impl rule__EntityMockPackage__Group_3__1 )
+            // InternalEntityMockDSL.g:5404:2: rule__EntityMockPackage__Group_3__0__Impl rule__EntityMockPackage__Group_3__1
+            {
+            pushFollow(FOLLOW_9);
+            rule__EntityMockPackage__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__0"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:5411:1: rule__EntityMockPackage__Group_3__0__Impl : ( '{' ) ;
+    public final void rule__EntityMockPackage__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5415:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:5416:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:5416:1: ( '{' )
+            // InternalEntityMockDSL.g:5417:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__1"
+    // InternalEntityMockDSL.g:5426:1: rule__EntityMockPackage__Group_3__1 : rule__EntityMockPackage__Group_3__1__Impl rule__EntityMockPackage__Group_3__2 ;
+    public final void rule__EntityMockPackage__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5430:1: ( rule__EntityMockPackage__Group_3__1__Impl rule__EntityMockPackage__Group_3__2 )
+            // InternalEntityMockDSL.g:5431:2: rule__EntityMockPackage__Group_3__1__Impl rule__EntityMockPackage__Group_3__2
+            {
+            pushFollow(FOLLOW_9);
+            rule__EntityMockPackage__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__1"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:5438:1: rule__EntityMockPackage__Group_3__1__Impl : ( ( rule__EntityMockPackage__MocksAssignment_3_1 )* ) ;
+    public final void rule__EntityMockPackage__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5442:1: ( ( ( rule__EntityMockPackage__MocksAssignment_3_1 )* ) )
+            // InternalEntityMockDSL.g:5443:1: ( ( rule__EntityMockPackage__MocksAssignment_3_1 )* )
+            {
+            // InternalEntityMockDSL.g:5443:1: ( ( rule__EntityMockPackage__MocksAssignment_3_1 )* )
+            // InternalEntityMockDSL.g:5444:2: ( rule__EntityMockPackage__MocksAssignment_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getMocksAssignment_3_1()); 
+            }
+            // InternalEntityMockDSL.g:5445:2: ( rule__EntityMockPackage__MocksAssignment_3_1 )*
+            loop67:
+            do {
+                int alt67=2;
+                int LA67_0 = input.LA(1);
+
+                if ( (LA67_0==59) ) {
+                    alt67=1;
+                }
+
+
+                switch (alt67) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5445:3: rule__EntityMockPackage__MocksAssignment_3_1
+            	    {
+            	    pushFollow(FOLLOW_10);
+            	    rule__EntityMockPackage__MocksAssignment_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop67;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getMocksAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__2"
+    // InternalEntityMockDSL.g:5453:1: rule__EntityMockPackage__Group_3__2 : rule__EntityMockPackage__Group_3__2__Impl ;
+    public final void rule__EntityMockPackage__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5457:1: ( rule__EntityMockPackage__Group_3__2__Impl )
+            // InternalEntityMockDSL.g:5458:2: rule__EntityMockPackage__Group_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockPackage__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__2"
+
+
+    // $ANTLR start "rule__EntityMockPackage__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:5464:1: rule__EntityMockPackage__Group_3__2__Impl : ( '}' ) ;
+    public final void rule__EntityMockPackage__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5468:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:5469:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:5469:1: ( '}' )
+            // InternalEntityMockDSL.g:5470:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group__0"
+    // InternalEntityMockDSL.g:5480:1: rule__EntityMock__Group__0 : rule__EntityMock__Group__0__Impl rule__EntityMock__Group__1 ;
+    public final void rule__EntityMock__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5484:1: ( rule__EntityMock__Group__0__Impl rule__EntityMock__Group__1 )
+            // InternalEntityMockDSL.g:5485:2: rule__EntityMock__Group__0__Impl rule__EntityMock__Group__1
+            {
+            pushFollow(FOLLOW_11);
+            rule__EntityMock__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__0"
+
+
+    // $ANTLR start "rule__EntityMock__Group__0__Impl"
+    // InternalEntityMockDSL.g:5492:1: rule__EntityMock__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMock__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5496:1: ( ( () ) )
+            // InternalEntityMockDSL.g:5497:1: ( () )
+            {
+            // InternalEntityMockDSL.g:5497:1: ( () )
+            // InternalEntityMockDSL.g:5498:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getEntityMockAction_0()); 
+            }
+            // InternalEntityMockDSL.g:5499:2: ()
+            // InternalEntityMockDSL.g:5499:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getEntityMockAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group__1"
+    // InternalEntityMockDSL.g:5507:1: rule__EntityMock__Group__1 : rule__EntityMock__Group__1__Impl rule__EntityMock__Group__2 ;
+    public final void rule__EntityMock__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5511:1: ( rule__EntityMock__Group__1__Impl rule__EntityMock__Group__2 )
+            // InternalEntityMockDSL.g:5512:2: rule__EntityMock__Group__1__Impl rule__EntityMock__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMock__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__1"
+
+
+    // $ANTLR start "rule__EntityMock__Group__1__Impl"
+    // InternalEntityMockDSL.g:5519:1: rule__EntityMock__Group__1__Impl : ( 'mock' ) ;
+    public final void rule__EntityMock__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5523:1: ( ( 'mock' ) )
+            // InternalEntityMockDSL.g:5524:1: ( 'mock' )
+            {
+            // InternalEntityMockDSL.g:5524:1: ( 'mock' )
+            // InternalEntityMockDSL.g:5525:2: 'mock'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getMockKeyword_1()); 
+            }
+            match(input,59,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getMockKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group__2"
+    // InternalEntityMockDSL.g:5534:1: rule__EntityMock__Group__2 : rule__EntityMock__Group__2__Impl rule__EntityMock__Group__3 ;
+    public final void rule__EntityMock__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5538:1: ( rule__EntityMock__Group__2__Impl rule__EntityMock__Group__3 )
+            // InternalEntityMockDSL.g:5539:2: rule__EntityMock__Group__2__Impl rule__EntityMock__Group__3
+            {
+            pushFollow(FOLLOW_12);
+            rule__EntityMock__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__2"
+
+
+    // $ANTLR start "rule__EntityMock__Group__2__Impl"
+    // InternalEntityMockDSL.g:5546:1: rule__EntityMock__Group__2__Impl : ( ( rule__EntityMock__NameAssignment_2 ) ) ;
+    public final void rule__EntityMock__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5550:1: ( ( ( rule__EntityMock__NameAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:5551:1: ( ( rule__EntityMock__NameAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:5551:1: ( ( rule__EntityMock__NameAssignment_2 ) )
+            // InternalEntityMockDSL.g:5552:2: ( rule__EntityMock__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getNameAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:5553:2: ( rule__EntityMock__NameAssignment_2 )
+            // InternalEntityMockDSL.g:5553:3: rule__EntityMock__NameAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group__3"
+    // InternalEntityMockDSL.g:5561:1: rule__EntityMock__Group__3 : rule__EntityMock__Group__3__Impl rule__EntityMock__Group__4 ;
+    public final void rule__EntityMock__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5565:1: ( rule__EntityMock__Group__3__Impl rule__EntityMock__Group__4 )
+            // InternalEntityMockDSL.g:5566:2: rule__EntityMock__Group__3__Impl rule__EntityMock__Group__4
+            {
+            pushFollow(FOLLOW_12);
+            rule__EntityMock__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__3"
+
+
+    // $ANTLR start "rule__EntityMock__Group__3__Impl"
+    // InternalEntityMockDSL.g:5573:1: rule__EntityMock__Group__3__Impl : ( ( rule__EntityMock__Group_3__0 )? ) ;
+    public final void rule__EntityMock__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5577:1: ( ( ( rule__EntityMock__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:5578:1: ( ( rule__EntityMock__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:5578:1: ( ( rule__EntityMock__Group_3__0 )? )
+            // InternalEntityMockDSL.g:5579:2: ( rule__EntityMock__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:5580:2: ( rule__EntityMock__Group_3__0 )?
+            int alt68=2;
+            int LA68_0 = input.LA(1);
+
+            if ( (LA68_0==147) ) {
+                alt68=1;
+            }
+            switch (alt68) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5580:3: rule__EntityMock__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group__4"
+    // InternalEntityMockDSL.g:5588:1: rule__EntityMock__Group__4 : rule__EntityMock__Group__4__Impl ;
+    public final void rule__EntityMock__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5592:1: ( rule__EntityMock__Group__4__Impl )
+            // InternalEntityMockDSL.g:5593:2: rule__EntityMock__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__4"
+
+
+    // $ANTLR start "rule__EntityMock__Group__4__Impl"
+    // InternalEntityMockDSL.g:5599:1: rule__EntityMock__Group__4__Impl : ( ( rule__EntityMock__Group_4__0 )? ) ;
+    public final void rule__EntityMock__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5603:1: ( ( ( rule__EntityMock__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:5604:1: ( ( rule__EntityMock__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:5604:1: ( ( rule__EntityMock__Group_4__0 )? )
+            // InternalEntityMockDSL.g:5605:2: ( rule__EntityMock__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:5606:2: ( rule__EntityMock__Group_4__0 )?
+            int alt69=2;
+            int LA69_0 = input.LA(1);
+
+            if ( (LA69_0==57) ) {
+                alt69=1;
+            }
+            switch (alt69) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5606:3: rule__EntityMock__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_3__0"
+    // InternalEntityMockDSL.g:5615:1: rule__EntityMock__Group_3__0 : rule__EntityMock__Group_3__0__Impl rule__EntityMock__Group_3__1 ;
+    public final void rule__EntityMock__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5619:1: ( rule__EntityMock__Group_3__0__Impl rule__EntityMock__Group_3__1 )
+            // InternalEntityMockDSL.g:5620:2: rule__EntityMock__Group_3__0__Impl rule__EntityMock__Group_3__1
+            {
+            pushFollow(FOLLOW_13);
+            rule__EntityMock__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_3__0"
+
+
+    // $ANTLR start "rule__EntityMock__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:5627:1: rule__EntityMock__Group_3__0__Impl : ( ( rule__EntityMock__DescriptionAssignment_3_0 ) ) ;
+    public final void rule__EntityMock__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5631:1: ( ( ( rule__EntityMock__DescriptionAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:5632:1: ( ( rule__EntityMock__DescriptionAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:5632:1: ( ( rule__EntityMock__DescriptionAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:5633:2: ( rule__EntityMock__DescriptionAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDescriptionAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:5634:2: ( rule__EntityMock__DescriptionAssignment_3_0 )
+            // InternalEntityMockDSL.g:5634:3: rule__EntityMock__DescriptionAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__DescriptionAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDescriptionAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_3__1"
+    // InternalEntityMockDSL.g:5642:1: rule__EntityMock__Group_3__1 : rule__EntityMock__Group_3__1__Impl ;
+    public final void rule__EntityMock__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5646:1: ( rule__EntityMock__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:5647:2: rule__EntityMock__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_3__1"
+
+
+    // $ANTLR start "rule__EntityMock__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:5653:1: rule__EntityMock__Group_3__1__Impl : ( ( rule__EntityMock__DescriptionValueAssignment_3_1 ) ) ;
+    public final void rule__EntityMock__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5657:1: ( ( ( rule__EntityMock__DescriptionValueAssignment_3_1 ) ) )
+            // InternalEntityMockDSL.g:5658:1: ( ( rule__EntityMock__DescriptionValueAssignment_3_1 ) )
+            {
+            // InternalEntityMockDSL.g:5658:1: ( ( rule__EntityMock__DescriptionValueAssignment_3_1 ) )
+            // InternalEntityMockDSL.g:5659:2: ( rule__EntityMock__DescriptionValueAssignment_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDescriptionValueAssignment_3_1()); 
+            }
+            // InternalEntityMockDSL.g:5660:2: ( rule__EntityMock__DescriptionValueAssignment_3_1 )
+            // InternalEntityMockDSL.g:5660:3: rule__EntityMock__DescriptionValueAssignment_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__DescriptionValueAssignment_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDescriptionValueAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__0"
+    // InternalEntityMockDSL.g:5669:1: rule__EntityMock__Group_4__0 : rule__EntityMock__Group_4__0__Impl rule__EntityMock__Group_4__1 ;
+    public final void rule__EntityMock__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5673:1: ( rule__EntityMock__Group_4__0__Impl rule__EntityMock__Group_4__1 )
+            // InternalEntityMockDSL.g:5674:2: rule__EntityMock__Group_4__0__Impl rule__EntityMock__Group_4__1
+            {
+            pushFollow(FOLLOW_14);
+            rule__EntityMock__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__0"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:5681:1: rule__EntityMock__Group_4__0__Impl : ( '{' ) ;
+    public final void rule__EntityMock__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5685:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:5686:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:5686:1: ( '{' )
+            // InternalEntityMockDSL.g:5687:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__1"
+    // InternalEntityMockDSL.g:5696:1: rule__EntityMock__Group_4__1 : rule__EntityMock__Group_4__1__Impl rule__EntityMock__Group_4__2 ;
+    public final void rule__EntityMock__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5700:1: ( rule__EntityMock__Group_4__1__Impl rule__EntityMock__Group_4__2 )
+            // InternalEntityMockDSL.g:5701:2: rule__EntityMock__Group_4__1__Impl rule__EntityMock__Group_4__2
+            {
+            pushFollow(FOLLOW_15);
+            rule__EntityMock__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__1"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:5708:1: rule__EntityMock__Group_4__1__Impl : ( ( rule__EntityMock__UnorderedGroup_4_1 ) ) ;
+    public final void rule__EntityMock__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5712:1: ( ( ( rule__EntityMock__UnorderedGroup_4_1 ) ) )
+            // InternalEntityMockDSL.g:5713:1: ( ( rule__EntityMock__UnorderedGroup_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:5713:1: ( ( rule__EntityMock__UnorderedGroup_4_1 ) )
+            // InternalEntityMockDSL.g:5714:2: ( rule__EntityMock__UnorderedGroup_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()); 
+            }
+            // InternalEntityMockDSL.g:5715:2: ( rule__EntityMock__UnorderedGroup_4_1 )
+            // InternalEntityMockDSL.g:5715:3: rule__EntityMock__UnorderedGroup_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__UnorderedGroup_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__2"
+    // InternalEntityMockDSL.g:5723:1: rule__EntityMock__Group_4__2 : rule__EntityMock__Group_4__2__Impl ;
+    public final void rule__EntityMock__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5727:1: ( rule__EntityMock__Group_4__2__Impl )
+            // InternalEntityMockDSL.g:5728:2: rule__EntityMock__Group_4__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__2"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4__2__Impl"
+    // InternalEntityMockDSL.g:5734:1: rule__EntityMock__Group_4__2__Impl : ( '}' ) ;
+    public final void rule__EntityMock__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5738:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:5739:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:5739:1: ( '}' )
+            // InternalEntityMockDSL.g:5740:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4_1_0__0"
+    // InternalEntityMockDSL.g:5750:1: rule__EntityMock__Group_4_1_0__0 : rule__EntityMock__Group_4_1_0__0__Impl rule__EntityMock__Group_4_1_0__1 ;
+    public final void rule__EntityMock__Group_4_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5754:1: ( rule__EntityMock__Group_4_1_0__0__Impl rule__EntityMock__Group_4_1_0__1 )
+            // InternalEntityMockDSL.g:5755:2: rule__EntityMock__Group_4_1_0__0__Impl rule__EntityMock__Group_4_1_0__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__EntityMock__Group_4_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_4_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4_1_0__0"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4_1_0__0__Impl"
+    // InternalEntityMockDSL.g:5762:1: rule__EntityMock__Group_4_1_0__0__Impl : ( 'priority' ) ;
+    public final void rule__EntityMock__Group_4_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5766:1: ( ( 'priority' ) )
+            // InternalEntityMockDSL.g:5767:1: ( 'priority' )
+            {
+            // InternalEntityMockDSL.g:5767:1: ( 'priority' )
+            // InternalEntityMockDSL.g:5768:2: 'priority'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0()); 
+            }
+            match(input,60,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4_1_0__1"
+    // InternalEntityMockDSL.g:5777:1: rule__EntityMock__Group_4_1_0__1 : rule__EntityMock__Group_4_1_0__1__Impl ;
+    public final void rule__EntityMock__Group_4_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5781:1: ( rule__EntityMock__Group_4_1_0__1__Impl )
+            // InternalEntityMockDSL.g:5782:2: rule__EntityMock__Group_4_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__Group_4_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4_1_0__1"
+
+
+    // $ANTLR start "rule__EntityMock__Group_4_1_0__1__Impl"
+    // InternalEntityMockDSL.g:5788:1: rule__EntityMock__Group_4_1_0__1__Impl : ( ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 ) ) ;
+    public final void rule__EntityMock__Group_4_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5792:1: ( ( ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 ) ) )
+            // InternalEntityMockDSL.g:5793:1: ( ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:5793:1: ( ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 ) )
+            // InternalEntityMockDSL.g:5794:2: ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getRunPriorityAssignment_4_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:5795:2: ( rule__EntityMock__RunPriorityAssignment_4_1_0_1 )
+            // InternalEntityMockDSL.g:5795:3: rule__EntityMock__RunPriorityAssignment_4_1_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__RunPriorityAssignment_4_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getRunPriorityAssignment_4_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__Group_4_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__0"
+    // InternalEntityMockDSL.g:5804:1: rule__RunningDataInterchanges__Group__0 : rule__RunningDataInterchanges__Group__0__Impl rule__RunningDataInterchanges__Group__1 ;
+    public final void rule__RunningDataInterchanges__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5808:1: ( rule__RunningDataInterchanges__Group__0__Impl rule__RunningDataInterchanges__Group__1 )
+            // InternalEntityMockDSL.g:5809:2: rule__RunningDataInterchanges__Group__0__Impl rule__RunningDataInterchanges__Group__1
+            {
+            pushFollow(FOLLOW_17);
+            rule__RunningDataInterchanges__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__0"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__0__Impl"
+    // InternalEntityMockDSL.g:5816:1: rule__RunningDataInterchanges__Group__0__Impl : ( () ) ;
+    public final void rule__RunningDataInterchanges__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5820:1: ( ( () ) )
+            // InternalEntityMockDSL.g:5821:1: ( () )
+            {
+            // InternalEntityMockDSL.g:5821:1: ( () )
+            // InternalEntityMockDSL.g:5822:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0()); 
+            }
+            // InternalEntityMockDSL.g:5823:2: ()
+            // InternalEntityMockDSL.g:5823:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__0__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__1"
+    // InternalEntityMockDSL.g:5831:1: rule__RunningDataInterchanges__Group__1 : rule__RunningDataInterchanges__Group__1__Impl rule__RunningDataInterchanges__Group__2 ;
+    public final void rule__RunningDataInterchanges__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5835:1: ( rule__RunningDataInterchanges__Group__1__Impl rule__RunningDataInterchanges__Group__2 )
+            // InternalEntityMockDSL.g:5836:2: rule__RunningDataInterchanges__Group__1__Impl rule__RunningDataInterchanges__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__RunningDataInterchanges__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__1"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__1__Impl"
+    // InternalEntityMockDSL.g:5843:1: rule__RunningDataInterchanges__Group__1__Impl : ( 'datainterchanges' ) ;
+    public final void rule__RunningDataInterchanges__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5847:1: ( ( 'datainterchanges' ) )
+            // InternalEntityMockDSL.g:5848:1: ( 'datainterchanges' )
+            {
+            // InternalEntityMockDSL.g:5848:1: ( 'datainterchanges' )
+            // InternalEntityMockDSL.g:5849:2: 'datainterchanges'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1()); 
+            }
+            match(input,61,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__1__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__2"
+    // InternalEntityMockDSL.g:5858:1: rule__RunningDataInterchanges__Group__2 : rule__RunningDataInterchanges__Group__2__Impl rule__RunningDataInterchanges__Group__3 ;
+    public final void rule__RunningDataInterchanges__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5862:1: ( rule__RunningDataInterchanges__Group__2__Impl rule__RunningDataInterchanges__Group__3 )
+            // InternalEntityMockDSL.g:5863:2: rule__RunningDataInterchanges__Group__2__Impl rule__RunningDataInterchanges__Group__3
+            {
+            pushFollow(FOLLOW_18);
+            rule__RunningDataInterchanges__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__2"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__2__Impl"
+    // InternalEntityMockDSL.g:5870:1: rule__RunningDataInterchanges__Group__2__Impl : ( '{' ) ;
+    public final void rule__RunningDataInterchanges__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5874:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:5875:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:5875:1: ( '{' )
+            // InternalEntityMockDSL.g:5876:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__2__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__3"
+    // InternalEntityMockDSL.g:5885:1: rule__RunningDataInterchanges__Group__3 : rule__RunningDataInterchanges__Group__3__Impl rule__RunningDataInterchanges__Group__4 ;
+    public final void rule__RunningDataInterchanges__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5889:1: ( rule__RunningDataInterchanges__Group__3__Impl rule__RunningDataInterchanges__Group__4 )
+            // InternalEntityMockDSL.g:5890:2: rule__RunningDataInterchanges__Group__3__Impl rule__RunningDataInterchanges__Group__4
+            {
+            pushFollow(FOLLOW_18);
+            rule__RunningDataInterchanges__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__3"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__3__Impl"
+    // InternalEntityMockDSL.g:5897:1: rule__RunningDataInterchanges__Group__3__Impl : ( ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )* ) ;
+    public final void rule__RunningDataInterchanges__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5901:1: ( ( ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )* ) )
+            // InternalEntityMockDSL.g:5902:1: ( ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )* )
+            {
+            // InternalEntityMockDSL.g:5902:1: ( ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )* )
+            // InternalEntityMockDSL.g:5903:2: ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:5904:2: ( rule__RunningDataInterchanges__DatainterchangesAssignment_3 )*
+            loop70:
+            do {
+                int alt70=2;
+                int LA70_0 = input.LA(1);
+
+                if ( (LA70_0==62) ) {
+                    alt70=1;
+                }
+
+
+                switch (alt70) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5904:3: rule__RunningDataInterchanges__DatainterchangesAssignment_3
+            	    {
+            	    pushFollow(FOLLOW_19);
+            	    rule__RunningDataInterchanges__DatainterchangesAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop70;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__3__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__4"
+    // InternalEntityMockDSL.g:5912:1: rule__RunningDataInterchanges__Group__4 : rule__RunningDataInterchanges__Group__4__Impl ;
+    public final void rule__RunningDataInterchanges__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5916:1: ( rule__RunningDataInterchanges__Group__4__Impl )
+            // InternalEntityMockDSL.g:5917:2: rule__RunningDataInterchanges__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchanges__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__4"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__Group__4__Impl"
+    // InternalEntityMockDSL.g:5923:1: rule__RunningDataInterchanges__Group__4__Impl : ( '}' ) ;
+    public final void rule__RunningDataInterchanges__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5927:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:5928:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:5928:1: ( '}' )
+            // InternalEntityMockDSL.g:5929:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__Group__4__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__0"
+    // InternalEntityMockDSL.g:5939:1: rule__RunningDataInterchange__Group__0 : rule__RunningDataInterchange__Group__0__Impl rule__RunningDataInterchange__Group__1 ;
+    public final void rule__RunningDataInterchange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5943:1: ( rule__RunningDataInterchange__Group__0__Impl rule__RunningDataInterchange__Group__1 )
+            // InternalEntityMockDSL.g:5944:2: rule__RunningDataInterchange__Group__0__Impl rule__RunningDataInterchange__Group__1
+            {
+            pushFollow(FOLLOW_20);
+            rule__RunningDataInterchange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__0"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__0__Impl"
+    // InternalEntityMockDSL.g:5951:1: rule__RunningDataInterchange__Group__0__Impl : ( () ) ;
+    public final void rule__RunningDataInterchange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5955:1: ( ( () ) )
+            // InternalEntityMockDSL.g:5956:1: ( () )
+            {
+            // InternalEntityMockDSL.g:5956:1: ( () )
+            // InternalEntityMockDSL.g:5957:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:5958:2: ()
+            // InternalEntityMockDSL.g:5958:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__1"
+    // InternalEntityMockDSL.g:5966:1: rule__RunningDataInterchange__Group__1 : rule__RunningDataInterchange__Group__1__Impl rule__RunningDataInterchange__Group__2 ;
+    public final void rule__RunningDataInterchange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5970:1: ( rule__RunningDataInterchange__Group__1__Impl rule__RunningDataInterchange__Group__2 )
+            // InternalEntityMockDSL.g:5971:2: rule__RunningDataInterchange__Group__1__Impl rule__RunningDataInterchange__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__RunningDataInterchange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__1"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__1__Impl"
+    // InternalEntityMockDSL.g:5978:1: rule__RunningDataInterchange__Group__1__Impl : ( 'datainterchange' ) ;
+    public final void rule__RunningDataInterchange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5982:1: ( ( 'datainterchange' ) )
+            // InternalEntityMockDSL.g:5983:1: ( 'datainterchange' )
+            {
+            // InternalEntityMockDSL.g:5983:1: ( 'datainterchange' )
+            // InternalEntityMockDSL.g:5984:2: 'datainterchange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1()); 
+            }
+            match(input,62,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__2"
+    // InternalEntityMockDSL.g:5993:1: rule__RunningDataInterchange__Group__2 : rule__RunningDataInterchange__Group__2__Impl rule__RunningDataInterchange__Group__3 ;
+    public final void rule__RunningDataInterchange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:5997:1: ( rule__RunningDataInterchange__Group__2__Impl rule__RunningDataInterchange__Group__3 )
+            // InternalEntityMockDSL.g:5998:2: rule__RunningDataInterchange__Group__2__Impl rule__RunningDataInterchange__Group__3
+            {
+            pushFollow(FOLLOW_21);
+            rule__RunningDataInterchange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__2"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__2__Impl"
+    // InternalEntityMockDSL.g:6005:1: rule__RunningDataInterchange__Group__2__Impl : ( ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 ) ) ;
+    public final void rule__RunningDataInterchange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6009:1: ( ( ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:6010:1: ( ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:6010:1: ( ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 ) )
+            // InternalEntityMockDSL.g:6011:2: ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:6012:2: ( rule__RunningDataInterchange__DatainterchangeRefAssignment_2 )
+            // InternalEntityMockDSL.g:6012:3: rule__RunningDataInterchange__DatainterchangeRefAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__DatainterchangeRefAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__3"
+    // InternalEntityMockDSL.g:6020:1: rule__RunningDataInterchange__Group__3 : rule__RunningDataInterchange__Group__3__Impl rule__RunningDataInterchange__Group__4 ;
+    public final void rule__RunningDataInterchange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6024:1: ( rule__RunningDataInterchange__Group__3__Impl rule__RunningDataInterchange__Group__4 )
+            // InternalEntityMockDSL.g:6025:2: rule__RunningDataInterchange__Group__3__Impl rule__RunningDataInterchange__Group__4
+            {
+            pushFollow(FOLLOW_13);
+            rule__RunningDataInterchange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__3"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__3__Impl"
+    // InternalEntityMockDSL.g:6032:1: rule__RunningDataInterchange__Group__3__Impl : ( 'file' ) ;
+    public final void rule__RunningDataInterchange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6036:1: ( ( 'file' ) )
+            // InternalEntityMockDSL.g:6037:1: ( 'file' )
+            {
+            // InternalEntityMockDSL.g:6037:1: ( 'file' )
+            // InternalEntityMockDSL.g:6038:2: 'file'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3()); 
+            }
+            match(input,63,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__4"
+    // InternalEntityMockDSL.g:6047:1: rule__RunningDataInterchange__Group__4 : rule__RunningDataInterchange__Group__4__Impl ;
+    public final void rule__RunningDataInterchange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6051:1: ( rule__RunningDataInterchange__Group__4__Impl )
+            // InternalEntityMockDSL.g:6052:2: rule__RunningDataInterchange__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__4"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__Group__4__Impl"
+    // InternalEntityMockDSL.g:6058:1: rule__RunningDataInterchange__Group__4__Impl : ( ( rule__RunningDataInterchange__FileURLAssignment_4 ) ) ;
+    public final void rule__RunningDataInterchange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6062:1: ( ( ( rule__RunningDataInterchange__FileURLAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:6063:1: ( ( rule__RunningDataInterchange__FileURLAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:6063:1: ( ( rule__RunningDataInterchange__FileURLAssignment_4 ) )
+            // InternalEntityMockDSL.g:6064:2: ( rule__RunningDataInterchange__FileURLAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getFileURLAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:6065:2: ( rule__RunningDataInterchange__FileURLAssignment_4 )
+            // InternalEntityMockDSL.g:6065:3: rule__RunningDataInterchange__FileURLAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__RunningDataInterchange__FileURLAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getFileURLAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__0"
+    // InternalEntityMockDSL.g:6074:1: rule__EntityMockResources__Group__0 : rule__EntityMockResources__Group__0__Impl rule__EntityMockResources__Group__1 ;
+    public final void rule__EntityMockResources__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6078:1: ( rule__EntityMockResources__Group__0__Impl rule__EntityMockResources__Group__1 )
+            // InternalEntityMockDSL.g:6079:2: rule__EntityMockResources__Group__0__Impl rule__EntityMockResources__Group__1
+            {
+            pushFollow(FOLLOW_22);
+            rule__EntityMockResources__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__0__Impl"
+    // InternalEntityMockDSL.g:6086:1: rule__EntityMockResources__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockResources__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6090:1: ( ( () ) )
+            // InternalEntityMockDSL.g:6091:1: ( () )
+            {
+            // InternalEntityMockDSL.g:6091:1: ( () )
+            // InternalEntityMockDSL.g:6092:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0()); 
+            }
+            // InternalEntityMockDSL.g:6093:2: ()
+            // InternalEntityMockDSL.g:6093:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__1"
+    // InternalEntityMockDSL.g:6101:1: rule__EntityMockResources__Group__1 : rule__EntityMockResources__Group__1__Impl rule__EntityMockResources__Group__2 ;
+    public final void rule__EntityMockResources__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6105:1: ( rule__EntityMockResources__Group__1__Impl rule__EntityMockResources__Group__2 )
+            // InternalEntityMockDSL.g:6106:2: rule__EntityMockResources__Group__1__Impl rule__EntityMockResources__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockResources__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__1__Impl"
+    // InternalEntityMockDSL.g:6113:1: rule__EntityMockResources__Group__1__Impl : ( 'resources' ) ;
+    public final void rule__EntityMockResources__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6117:1: ( ( 'resources' ) )
+            // InternalEntityMockDSL.g:6118:1: ( 'resources' )
+            {
+            // InternalEntityMockDSL.g:6118:1: ( 'resources' )
+            // InternalEntityMockDSL.g:6119:2: 'resources'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1()); 
+            }
+            match(input,64,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__2"
+    // InternalEntityMockDSL.g:6128:1: rule__EntityMockResources__Group__2 : rule__EntityMockResources__Group__2__Impl rule__EntityMockResources__Group__3 ;
+    public final void rule__EntityMockResources__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6132:1: ( rule__EntityMockResources__Group__2__Impl rule__EntityMockResources__Group__3 )
+            // InternalEntityMockDSL.g:6133:2: rule__EntityMockResources__Group__2__Impl rule__EntityMockResources__Group__3
+            {
+            pushFollow(FOLLOW_23);
+            rule__EntityMockResources__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__2__Impl"
+    // InternalEntityMockDSL.g:6140:1: rule__EntityMockResources__Group__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockResources__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6144:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:6145:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:6145:1: ( '{' )
+            // InternalEntityMockDSL.g:6146:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__3"
+    // InternalEntityMockDSL.g:6155:1: rule__EntityMockResources__Group__3 : rule__EntityMockResources__Group__3__Impl rule__EntityMockResources__Group__4 ;
+    public final void rule__EntityMockResources__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6159:1: ( rule__EntityMockResources__Group__3__Impl rule__EntityMockResources__Group__4 )
+            // InternalEntityMockDSL.g:6160:2: rule__EntityMockResources__Group__3__Impl rule__EntityMockResources__Group__4
+            {
+            pushFollow(FOLLOW_23);
+            rule__EntityMockResources__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__3__Impl"
+    // InternalEntityMockDSL.g:6167:1: rule__EntityMockResources__Group__3__Impl : ( ( rule__EntityMockResources__ResourcesAssignment_3 )* ) ;
+    public final void rule__EntityMockResources__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6171:1: ( ( ( rule__EntityMockResources__ResourcesAssignment_3 )* ) )
+            // InternalEntityMockDSL.g:6172:1: ( ( rule__EntityMockResources__ResourcesAssignment_3 )* )
+            {
+            // InternalEntityMockDSL.g:6172:1: ( ( rule__EntityMockResources__ResourcesAssignment_3 )* )
+            // InternalEntityMockDSL.g:6173:2: ( rule__EntityMockResources__ResourcesAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getResourcesAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:6174:2: ( rule__EntityMockResources__ResourcesAssignment_3 )*
+            loop71:
+            do {
+                int alt71=2;
+                int LA71_0 = input.LA(1);
+
+                if ( (LA71_0==65) ) {
+                    alt71=1;
+                }
+
+
+                switch (alt71) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6174:3: rule__EntityMockResources__ResourcesAssignment_3
+            	    {
+            	    pushFollow(FOLLOW_24);
+            	    rule__EntityMockResources__ResourcesAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop71;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getResourcesAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__4"
+    // InternalEntityMockDSL.g:6182:1: rule__EntityMockResources__Group__4 : rule__EntityMockResources__Group__4__Impl ;
+    public final void rule__EntityMockResources__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6186:1: ( rule__EntityMockResources__Group__4__Impl )
+            // InternalEntityMockDSL.g:6187:2: rule__EntityMockResources__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResources__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockResources__Group__4__Impl"
+    // InternalEntityMockDSL.g:6193:1: rule__EntityMockResources__Group__4__Impl : ( '}' ) ;
+    public final void rule__EntityMockResources__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6197:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:6198:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:6198:1: ( '}' )
+            // InternalEntityMockDSL.g:6199:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__0"
+    // InternalEntityMockDSL.g:6209:1: rule__EntityMockResource__Group__0 : rule__EntityMockResource__Group__0__Impl rule__EntityMockResource__Group__1 ;
+    public final void rule__EntityMockResource__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6213:1: ( rule__EntityMockResource__Group__0__Impl rule__EntityMockResource__Group__1 )
+            // InternalEntityMockDSL.g:6214:2: rule__EntityMockResource__Group__0__Impl rule__EntityMockResource__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockResource__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__0__Impl"
+    // InternalEntityMockDSL.g:6221:1: rule__EntityMockResource__Group__0__Impl : ( 'resource' ) ;
+    public final void rule__EntityMockResource__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6225:1: ( ( 'resource' ) )
+            // InternalEntityMockDSL.g:6226:1: ( 'resource' )
+            {
+            // InternalEntityMockDSL.g:6226:1: ( 'resource' )
+            // InternalEntityMockDSL.g:6227:2: 'resource'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0()); 
+            }
+            match(input,65,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__1"
+    // InternalEntityMockDSL.g:6236:1: rule__EntityMockResource__Group__1 : rule__EntityMockResource__Group__1__Impl rule__EntityMockResource__Group__2 ;
+    public final void rule__EntityMockResource__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6240:1: ( rule__EntityMockResource__Group__1__Impl rule__EntityMockResource__Group__2 )
+            // InternalEntityMockDSL.g:6241:2: rule__EntityMockResource__Group__1__Impl rule__EntityMockResource__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockResource__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__1__Impl"
+    // InternalEntityMockDSL.g:6248:1: rule__EntityMockResource__Group__1__Impl : ( ( rule__EntityMockResource__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockResource__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6252:1: ( ( ( rule__EntityMockResource__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:6253:1: ( ( rule__EntityMockResource__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:6253:1: ( ( rule__EntityMockResource__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:6254:2: ( rule__EntityMockResource__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:6255:2: ( rule__EntityMockResource__NameAssignment_1 )
+            // InternalEntityMockDSL.g:6255:3: rule__EntityMockResource__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__2"
+    // InternalEntityMockDSL.g:6263:1: rule__EntityMockResource__Group__2 : rule__EntityMockResource__Group__2__Impl rule__EntityMockResource__Group__3 ;
+    public final void rule__EntityMockResource__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6267:1: ( rule__EntityMockResource__Group__2__Impl rule__EntityMockResource__Group__3 )
+            // InternalEntityMockDSL.g:6268:2: rule__EntityMockResource__Group__2__Impl rule__EntityMockResource__Group__3
+            {
+            pushFollow(FOLLOW_25);
+            rule__EntityMockResource__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__2__Impl"
+    // InternalEntityMockDSL.g:6275:1: rule__EntityMockResource__Group__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockResource__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6279:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:6280:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:6280:1: ( '{' )
+            // InternalEntityMockDSL.g:6281:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__3"
+    // InternalEntityMockDSL.g:6290:1: rule__EntityMockResource__Group__3 : rule__EntityMockResource__Group__3__Impl rule__EntityMockResource__Group__4 ;
+    public final void rule__EntityMockResource__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6294:1: ( rule__EntityMockResource__Group__3__Impl rule__EntityMockResource__Group__4 )
+            // InternalEntityMockDSL.g:6295:2: rule__EntityMockResource__Group__3__Impl rule__EntityMockResource__Group__4
+            {
+            pushFollow(FOLLOW_25);
+            rule__EntityMockResource__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__3__Impl"
+    // InternalEntityMockDSL.g:6302:1: rule__EntityMockResource__Group__3__Impl : ( ( rule__EntityMockResource__Group_3__0 )? ) ;
+    public final void rule__EntityMockResource__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6306:1: ( ( ( rule__EntityMockResource__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:6307:1: ( ( rule__EntityMockResource__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:6307:1: ( ( rule__EntityMockResource__Group_3__0 )? )
+            // InternalEntityMockDSL.g:6308:2: ( rule__EntityMockResource__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:6309:2: ( rule__EntityMockResource__Group_3__0 )?
+            int alt72=2;
+            int LA72_0 = input.LA(1);
+
+            if ( (LA72_0==67) ) {
+                alt72=1;
+            }
+            switch (alt72) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6309:3: rule__EntityMockResource__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockResource__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__4"
+    // InternalEntityMockDSL.g:6317:1: rule__EntityMockResource__Group__4 : rule__EntityMockResource__Group__4__Impl rule__EntityMockResource__Group__5 ;
+    public final void rule__EntityMockResource__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6321:1: ( rule__EntityMockResource__Group__4__Impl rule__EntityMockResource__Group__5 )
+            // InternalEntityMockDSL.g:6322:2: rule__EntityMockResource__Group__4__Impl rule__EntityMockResource__Group__5
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockResource__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__4__Impl"
+    // InternalEntityMockDSL.g:6329:1: rule__EntityMockResource__Group__4__Impl : ( 'items' ) ;
+    public final void rule__EntityMockResource__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6333:1: ( ( 'items' ) )
+            // InternalEntityMockDSL.g:6334:1: ( 'items' )
+            {
+            // InternalEntityMockDSL.g:6334:1: ( 'items' )
+            // InternalEntityMockDSL.g:6335:2: 'items'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4()); 
+            }
+            match(input,66,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__5"
+    // InternalEntityMockDSL.g:6344:1: rule__EntityMockResource__Group__5 : rule__EntityMockResource__Group__5__Impl rule__EntityMockResource__Group__6 ;
+    public final void rule__EntityMockResource__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6348:1: ( rule__EntityMockResource__Group__5__Impl rule__EntityMockResource__Group__6 )
+            // InternalEntityMockDSL.g:6349:2: rule__EntityMockResource__Group__5__Impl rule__EntityMockResource__Group__6
+            {
+            pushFollow(FOLLOW_26);
+            rule__EntityMockResource__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__5"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__5__Impl"
+    // InternalEntityMockDSL.g:6356:1: rule__EntityMockResource__Group__5__Impl : ( '{' ) ;
+    public final void rule__EntityMockResource__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6360:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:6361:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:6361:1: ( '{' )
+            // InternalEntityMockDSL.g:6362:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__6"
+    // InternalEntityMockDSL.g:6371:1: rule__EntityMockResource__Group__6 : rule__EntityMockResource__Group__6__Impl rule__EntityMockResource__Group__7 ;
+    public final void rule__EntityMockResource__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6375:1: ( rule__EntityMockResource__Group__6__Impl rule__EntityMockResource__Group__7 )
+            // InternalEntityMockDSL.g:6376:2: rule__EntityMockResource__Group__6__Impl rule__EntityMockResource__Group__7
+            {
+            pushFollow(FOLLOW_26);
+            rule__EntityMockResource__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__6"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__6__Impl"
+    // InternalEntityMockDSL.g:6383:1: rule__EntityMockResource__Group__6__Impl : ( ( rule__EntityMockResource__DatarowsAssignment_6 )* ) ;
+    public final void rule__EntityMockResource__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6387:1: ( ( ( rule__EntityMockResource__DatarowsAssignment_6 )* ) )
+            // InternalEntityMockDSL.g:6388:1: ( ( rule__EntityMockResource__DatarowsAssignment_6 )* )
+            {
+            // InternalEntityMockDSL.g:6388:1: ( ( rule__EntityMockResource__DatarowsAssignment_6 )* )
+            // InternalEntityMockDSL.g:6389:2: ( rule__EntityMockResource__DatarowsAssignment_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getDatarowsAssignment_6()); 
+            }
+            // InternalEntityMockDSL.g:6390:2: ( rule__EntityMockResource__DatarowsAssignment_6 )*
+            loop73:
+            do {
+                int alt73=2;
+                int LA73_0 = input.LA(1);
+
+                if ( (LA73_0==RULE_ID) ) {
+                    alt73=1;
+                }
+
+
+                switch (alt73) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6390:3: rule__EntityMockResource__DatarowsAssignment_6
+            	    {
+            	    pushFollow(FOLLOW_4);
+            	    rule__EntityMockResource__DatarowsAssignment_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop73;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getDatarowsAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__7"
+    // InternalEntityMockDSL.g:6398:1: rule__EntityMockResource__Group__7 : rule__EntityMockResource__Group__7__Impl rule__EntityMockResource__Group__8 ;
+    public final void rule__EntityMockResource__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6402:1: ( rule__EntityMockResource__Group__7__Impl rule__EntityMockResource__Group__8 )
+            // InternalEntityMockDSL.g:6403:2: rule__EntityMockResource__Group__7__Impl rule__EntityMockResource__Group__8
+            {
+            pushFollow(FOLLOW_15);
+            rule__EntityMockResource__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__7"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__7__Impl"
+    // InternalEntityMockDSL.g:6410:1: rule__EntityMockResource__Group__7__Impl : ( '}' ) ;
+    public final void rule__EntityMockResource__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6414:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:6415:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:6415:1: ( '}' )
+            // InternalEntityMockDSL.g:6416:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__7__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__8"
+    // InternalEntityMockDSL.g:6425:1: rule__EntityMockResource__Group__8 : rule__EntityMockResource__Group__8__Impl ;
+    public final void rule__EntityMockResource__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6429:1: ( rule__EntityMockResource__Group__8__Impl )
+            // InternalEntityMockDSL.g:6430:2: rule__EntityMockResource__Group__8__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__8"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group__8__Impl"
+    // InternalEntityMockDSL.g:6436:1: rule__EntityMockResource__Group__8__Impl : ( '}' ) ;
+    public final void rule__EntityMockResource__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6440:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:6441:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:6441:1: ( '}' )
+            // InternalEntityMockDSL.g:6442:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group__8__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__0"
+    // InternalEntityMockDSL.g:6452:1: rule__EntityMockResource__Group_3__0 : rule__EntityMockResource__Group_3__0__Impl rule__EntityMockResource__Group_3__1 ;
+    public final void rule__EntityMockResource__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6456:1: ( rule__EntityMockResource__Group_3__0__Impl rule__EntityMockResource__Group_3__1 )
+            // InternalEntityMockDSL.g:6457:2: rule__EntityMockResource__Group_3__0__Impl rule__EntityMockResource__Group_3__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockResource__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__0"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:6464:1: rule__EntityMockResource__Group_3__0__Impl : ( 'attributes' ) ;
+    public final void rule__EntityMockResource__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6468:1: ( ( 'attributes' ) )
+            // InternalEntityMockDSL.g:6469:1: ( 'attributes' )
+            {
+            // InternalEntityMockDSL.g:6469:1: ( 'attributes' )
+            // InternalEntityMockDSL.g:6470:2: 'attributes'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0()); 
+            }
+            match(input,67,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__1"
+    // InternalEntityMockDSL.g:6479:1: rule__EntityMockResource__Group_3__1 : rule__EntityMockResource__Group_3__1__Impl rule__EntityMockResource__Group_3__2 ;
+    public final void rule__EntityMockResource__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6483:1: ( rule__EntityMockResource__Group_3__1__Impl rule__EntityMockResource__Group_3__2 )
+            // InternalEntityMockDSL.g:6484:2: rule__EntityMockResource__Group_3__1__Impl rule__EntityMockResource__Group_3__2
+            {
+            pushFollow(FOLLOW_28);
+            rule__EntityMockResource__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__1"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:6491:1: rule__EntityMockResource__Group_3__1__Impl : ( '(' ) ;
+    public final void rule__EntityMockResource__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6495:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:6496:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:6496:1: ( '(' )
+            // InternalEntityMockDSL.g:6497:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__2"
+    // InternalEntityMockDSL.g:6506:1: rule__EntityMockResource__Group_3__2 : rule__EntityMockResource__Group_3__2__Impl rule__EntityMockResource__Group_3__3 ;
+    public final void rule__EntityMockResource__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6510:1: ( rule__EntityMockResource__Group_3__2__Impl rule__EntityMockResource__Group_3__3 )
+            // InternalEntityMockDSL.g:6511:2: rule__EntityMockResource__Group_3__2__Impl rule__EntityMockResource__Group_3__3
+            {
+            pushFollow(FOLLOW_28);
+            rule__EntityMockResource__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__2"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:6518:1: rule__EntityMockResource__Group_3__2__Impl : ( ( rule__EntityMockResource__Group_3_2__0 )* ) ;
+    public final void rule__EntityMockResource__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6522:1: ( ( ( rule__EntityMockResource__Group_3_2__0 )* ) )
+            // InternalEntityMockDSL.g:6523:1: ( ( rule__EntityMockResource__Group_3_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:6523:1: ( ( rule__EntityMockResource__Group_3_2__0 )* )
+            // InternalEntityMockDSL.g:6524:2: ( rule__EntityMockResource__Group_3_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getGroup_3_2()); 
+            }
+            // InternalEntityMockDSL.g:6525:2: ( rule__EntityMockResource__Group_3_2__0 )*
+            loop74:
+            do {
+                int alt74=2;
+                int LA74_0 = input.LA(1);
+
+                if ( (LA74_0==RULE_ID) ) {
+                    alt74=1;
+                }
+
+
+                switch (alt74) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6525:3: rule__EntityMockResource__Group_3_2__0
+            	    {
+            	    pushFollow(FOLLOW_4);
+            	    rule__EntityMockResource__Group_3_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop74;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getGroup_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__3"
+    // InternalEntityMockDSL.g:6533:1: rule__EntityMockResource__Group_3__3 : rule__EntityMockResource__Group_3__3__Impl ;
+    public final void rule__EntityMockResource__Group_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6537:1: ( rule__EntityMockResource__Group_3__3__Impl )
+            // InternalEntityMockDSL.g:6538:2: rule__EntityMockResource__Group_3__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__3"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3__3__Impl"
+    // InternalEntityMockDSL.g:6544:1: rule__EntityMockResource__Group_3__3__Impl : ( ')' ) ;
+    public final void rule__EntityMockResource__Group_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6548:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:6549:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:6549:1: ( ')' )
+            // InternalEntityMockDSL.g:6550:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3_2__0"
+    // InternalEntityMockDSL.g:6560:1: rule__EntityMockResource__Group_3_2__0 : rule__EntityMockResource__Group_3_2__0__Impl rule__EntityMockResource__Group_3_2__1 ;
+    public final void rule__EntityMockResource__Group_3_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6564:1: ( rule__EntityMockResource__Group_3_2__0__Impl rule__EntityMockResource__Group_3_2__1 )
+            // InternalEntityMockDSL.g:6565:2: rule__EntityMockResource__Group_3_2__0__Impl rule__EntityMockResource__Group_3_2__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockResource__Group_3_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3_2__0"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3_2__0__Impl"
+    // InternalEntityMockDSL.g:6572:1: rule__EntityMockResource__Group_3_2__0__Impl : ( ( rule__EntityMockResource__AttributesAssignment_3_2_0 ) ) ;
+    public final void rule__EntityMockResource__Group_3_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6576:1: ( ( ( rule__EntityMockResource__AttributesAssignment_3_2_0 ) ) )
+            // InternalEntityMockDSL.g:6577:1: ( ( rule__EntityMockResource__AttributesAssignment_3_2_0 ) )
+            {
+            // InternalEntityMockDSL.g:6577:1: ( ( rule__EntityMockResource__AttributesAssignment_3_2_0 ) )
+            // InternalEntityMockDSL.g:6578:2: ( rule__EntityMockResource__AttributesAssignment_3_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getAttributesAssignment_3_2_0()); 
+            }
+            // InternalEntityMockDSL.g:6579:2: ( rule__EntityMockResource__AttributesAssignment_3_2_0 )
+            // InternalEntityMockDSL.g:6579:3: rule__EntityMockResource__AttributesAssignment_3_2_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__AttributesAssignment_3_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getAttributesAssignment_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3_2__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3_2__1"
+    // InternalEntityMockDSL.g:6587:1: rule__EntityMockResource__Group_3_2__1 : rule__EntityMockResource__Group_3_2__1__Impl ;
+    public final void rule__EntityMockResource__Group_3_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6591:1: ( rule__EntityMockResource__Group_3_2__1__Impl )
+            // InternalEntityMockDSL.g:6592:2: rule__EntityMockResource__Group_3_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResource__Group_3_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3_2__1"
+
+
+    // $ANTLR start "rule__EntityMockResource__Group_3_2__1__Impl"
+    // InternalEntityMockDSL.g:6598:1: rule__EntityMockResource__Group_3_2__1__Impl : ( ( ',' )? ) ;
+    public final void rule__EntityMockResource__Group_3_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6602:1: ( ( ( ',' )? ) )
+            // InternalEntityMockDSL.g:6603:1: ( ( ',' )? )
+            {
+            // InternalEntityMockDSL.g:6603:1: ( ( ',' )? )
+            // InternalEntityMockDSL.g:6604:2: ( ',' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1()); 
+            }
+            // InternalEntityMockDSL.g:6605:2: ( ',' )?
+            int alt75=2;
+            int LA75_0 = input.LA(1);
+
+            if ( (LA75_0==70) ) {
+                alt75=1;
+            }
+            switch (alt75) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6605:3: ','
+                    {
+                    match(input,70,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__Group_3_2__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceAttribute__Group__0"
+    // InternalEntityMockDSL.g:6614:1: rule__EntityMockResourceAttribute__Group__0 : rule__EntityMockResourceAttribute__Group__0__Impl rule__EntityMockResourceAttribute__Group__1 ;
+    public final void rule__EntityMockResourceAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6618:1: ( rule__EntityMockResourceAttribute__Group__0__Impl rule__EntityMockResourceAttribute__Group__1 )
+            // InternalEntityMockDSL.g:6619:2: rule__EntityMockResourceAttribute__Group__0__Impl rule__EntityMockResourceAttribute__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockResourceAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceAttribute__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockResourceAttribute__Group__0__Impl"
+    // InternalEntityMockDSL.g:6626:1: rule__EntityMockResourceAttribute__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockResourceAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6630:1: ( ( () ) )
+            // InternalEntityMockDSL.g:6631:1: ( () )
+            {
+            // InternalEntityMockDSL.g:6631:1: ( () )
+            // InternalEntityMockDSL.g:6632:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:6633:2: ()
+            // InternalEntityMockDSL.g:6633:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceAttribute__Group__1"
+    // InternalEntityMockDSL.g:6641:1: rule__EntityMockResourceAttribute__Group__1 : rule__EntityMockResourceAttribute__Group__1__Impl ;
+    public final void rule__EntityMockResourceAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6645:1: ( rule__EntityMockResourceAttribute__Group__1__Impl )
+            // InternalEntityMockDSL.g:6646:2: rule__EntityMockResourceAttribute__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceAttribute__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockResourceAttribute__Group__1__Impl"
+    // InternalEntityMockDSL.g:6652:1: rule__EntityMockResourceAttribute__Group__1__Impl : ( ( rule__EntityMockResourceAttribute__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockResourceAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6656:1: ( ( ( rule__EntityMockResourceAttribute__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:6657:1: ( ( rule__EntityMockResourceAttribute__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:6657:1: ( ( rule__EntityMockResourceAttribute__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:6658:2: ( rule__EntityMockResourceAttribute__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAttributeAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:6659:2: ( rule__EntityMockResourceAttribute__NameAssignment_1 )
+            // InternalEntityMockDSL.g:6659:3: rule__EntityMockResourceAttribute__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceAttribute__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAttributeAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__0"
+    // InternalEntityMockDSL.g:6668:1: rule__EntityMockResourceDataRow__Group__0 : rule__EntityMockResourceDataRow__Group__0__Impl rule__EntityMockResourceDataRow__Group__1 ;
+    public final void rule__EntityMockResourceDataRow__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6672:1: ( rule__EntityMockResourceDataRow__Group__0__Impl rule__EntityMockResourceDataRow__Group__1 )
+            // InternalEntityMockDSL.g:6673:2: rule__EntityMockResourceDataRow__Group__0__Impl rule__EntityMockResourceDataRow__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockResourceDataRow__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__0__Impl"
+    // InternalEntityMockDSL.g:6680:1: rule__EntityMockResourceDataRow__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockResourceDataRow__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6684:1: ( ( () ) )
+            // InternalEntityMockDSL.g:6685:1: ( () )
+            {
+            // InternalEntityMockDSL.g:6685:1: ( () )
+            // InternalEntityMockDSL.g:6686:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0()); 
+            }
+            // InternalEntityMockDSL.g:6687:2: ()
+            // InternalEntityMockDSL.g:6687:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__1"
+    // InternalEntityMockDSL.g:6695:1: rule__EntityMockResourceDataRow__Group__1 : rule__EntityMockResourceDataRow__Group__1__Impl rule__EntityMockResourceDataRow__Group__2 ;
+    public final void rule__EntityMockResourceDataRow__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6699:1: ( rule__EntityMockResourceDataRow__Group__1__Impl rule__EntityMockResourceDataRow__Group__2 )
+            // InternalEntityMockDSL.g:6700:2: rule__EntityMockResourceDataRow__Group__1__Impl rule__EntityMockResourceDataRow__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockResourceDataRow__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__1__Impl"
+    // InternalEntityMockDSL.g:6707:1: rule__EntityMockResourceDataRow__Group__1__Impl : ( ( rule__EntityMockResourceDataRow__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockResourceDataRow__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6711:1: ( ( ( rule__EntityMockResourceDataRow__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:6712:1: ( ( rule__EntityMockResourceDataRow__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:6712:1: ( ( rule__EntityMockResourceDataRow__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:6713:2: ( rule__EntityMockResourceDataRow__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:6714:2: ( rule__EntityMockResourceDataRow__NameAssignment_1 )
+            // InternalEntityMockDSL.g:6714:3: rule__EntityMockResourceDataRow__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__2"
+    // InternalEntityMockDSL.g:6722:1: rule__EntityMockResourceDataRow__Group__2 : rule__EntityMockResourceDataRow__Group__2__Impl ;
+    public final void rule__EntityMockResourceDataRow__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6726:1: ( rule__EntityMockResourceDataRow__Group__2__Impl )
+            // InternalEntityMockDSL.g:6727:2: rule__EntityMockResourceDataRow__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group__2__Impl"
+    // InternalEntityMockDSL.g:6733:1: rule__EntityMockResourceDataRow__Group__2__Impl : ( ( rule__EntityMockResourceDataRow__Group_2__0 )? ) ;
+    public final void rule__EntityMockResourceDataRow__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6737:1: ( ( ( rule__EntityMockResourceDataRow__Group_2__0 )? ) )
+            // InternalEntityMockDSL.g:6738:1: ( ( rule__EntityMockResourceDataRow__Group_2__0 )? )
+            {
+            // InternalEntityMockDSL.g:6738:1: ( ( rule__EntityMockResourceDataRow__Group_2__0 )? )
+            // InternalEntityMockDSL.g:6739:2: ( rule__EntityMockResourceDataRow__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:6740:2: ( rule__EntityMockResourceDataRow__Group_2__0 )?
+            int alt76=2;
+            int LA76_0 = input.LA(1);
+
+            if ( (LA76_0==68) ) {
+                alt76=1;
+            }
+            switch (alt76) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6740:3: rule__EntityMockResourceDataRow__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockResourceDataRow__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__0"
+    // InternalEntityMockDSL.g:6749:1: rule__EntityMockResourceDataRow__Group_2__0 : rule__EntityMockResourceDataRow__Group_2__0__Impl rule__EntityMockResourceDataRow__Group_2__1 ;
+    public final void rule__EntityMockResourceDataRow__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6753:1: ( rule__EntityMockResourceDataRow__Group_2__0__Impl rule__EntityMockResourceDataRow__Group_2__1 )
+            // InternalEntityMockDSL.g:6754:2: rule__EntityMockResourceDataRow__Group_2__0__Impl rule__EntityMockResourceDataRow__Group_2__1
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockResourceDataRow__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__0"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:6761:1: rule__EntityMockResourceDataRow__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__EntityMockResourceDataRow__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6765:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:6766:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:6766:1: ( '(' )
+            // InternalEntityMockDSL.g:6767:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__1"
+    // InternalEntityMockDSL.g:6776:1: rule__EntityMockResourceDataRow__Group_2__1 : rule__EntityMockResourceDataRow__Group_2__1__Impl rule__EntityMockResourceDataRow__Group_2__2 ;
+    public final void rule__EntityMockResourceDataRow__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6780:1: ( rule__EntityMockResourceDataRow__Group_2__1__Impl rule__EntityMockResourceDataRow__Group_2__2 )
+            // InternalEntityMockDSL.g:6781:2: rule__EntityMockResourceDataRow__Group_2__1__Impl rule__EntityMockResourceDataRow__Group_2__2
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockResourceDataRow__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__1"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:6788:1: rule__EntityMockResourceDataRow__Group_2__1__Impl : ( ( rule__EntityMockResourceDataRow__Group_2_1__0 )* ) ;
+    public final void rule__EntityMockResourceDataRow__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6792:1: ( ( ( rule__EntityMockResourceDataRow__Group_2_1__0 )* ) )
+            // InternalEntityMockDSL.g:6793:1: ( ( rule__EntityMockResourceDataRow__Group_2_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:6793:1: ( ( rule__EntityMockResourceDataRow__Group_2_1__0 )* )
+            // InternalEntityMockDSL.g:6794:2: ( rule__EntityMockResourceDataRow__Group_2_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2_1()); 
+            }
+            // InternalEntityMockDSL.g:6795:2: ( rule__EntityMockResourceDataRow__Group_2_1__0 )*
+            loop77:
+            do {
+                int alt77=2;
+                int LA77_0 = input.LA(1);
+
+                if ( (LA77_0==RULE_STRING) ) {
+                    alt77=1;
+                }
+
+
+                switch (alt77) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6795:3: rule__EntityMockResourceDataRow__Group_2_1__0
+            	    {
+            	    pushFollow(FOLLOW_31);
+            	    rule__EntityMockResourceDataRow__Group_2_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop77;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getGroup_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__2"
+    // InternalEntityMockDSL.g:6803:1: rule__EntityMockResourceDataRow__Group_2__2 : rule__EntityMockResourceDataRow__Group_2__2__Impl ;
+    public final void rule__EntityMockResourceDataRow__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6807:1: ( rule__EntityMockResourceDataRow__Group_2__2__Impl )
+            // InternalEntityMockDSL.g:6808:2: rule__EntityMockResourceDataRow__Group_2__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__2"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2__2__Impl"
+    // InternalEntityMockDSL.g:6814:1: rule__EntityMockResourceDataRow__Group_2__2__Impl : ( ')' ) ;
+    public final void rule__EntityMockResourceDataRow__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6818:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:6819:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:6819:1: ( ')' )
+            // InternalEntityMockDSL.g:6820:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2_1__0"
+    // InternalEntityMockDSL.g:6830:1: rule__EntityMockResourceDataRow__Group_2_1__0 : rule__EntityMockResourceDataRow__Group_2_1__0__Impl rule__EntityMockResourceDataRow__Group_2_1__1 ;
+    public final void rule__EntityMockResourceDataRow__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6834:1: ( rule__EntityMockResourceDataRow__Group_2_1__0__Impl rule__EntityMockResourceDataRow__Group_2_1__1 )
+            // InternalEntityMockDSL.g:6835:2: rule__EntityMockResourceDataRow__Group_2_1__0__Impl rule__EntityMockResourceDataRow__Group_2_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockResourceDataRow__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2_1__0"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2_1__0__Impl"
+    // InternalEntityMockDSL.g:6842:1: rule__EntityMockResourceDataRow__Group_2_1__0__Impl : ( ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 ) ) ;
+    public final void rule__EntityMockResourceDataRow__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6846:1: ( ( ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 ) ) )
+            // InternalEntityMockDSL.g:6847:1: ( ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:6847:1: ( ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 ) )
+            // InternalEntityMockDSL.g:6848:2: ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getValuesAssignment_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:6849:2: ( rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 )
+            // InternalEntityMockDSL.g:6849:3: rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getValuesAssignment_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2_1__1"
+    // InternalEntityMockDSL.g:6857:1: rule__EntityMockResourceDataRow__Group_2_1__1 : rule__EntityMockResourceDataRow__Group_2_1__1__Impl ;
+    public final void rule__EntityMockResourceDataRow__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6861:1: ( rule__EntityMockResourceDataRow__Group_2_1__1__Impl )
+            // InternalEntityMockDSL.g:6862:2: rule__EntityMockResourceDataRow__Group_2_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockResourceDataRow__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2_1__1"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__Group_2_1__1__Impl"
+    // InternalEntityMockDSL.g:6868:1: rule__EntityMockResourceDataRow__Group_2_1__1__Impl : ( ( ',' )? ) ;
+    public final void rule__EntityMockResourceDataRow__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6872:1: ( ( ( ',' )? ) )
+            // InternalEntityMockDSL.g:6873:1: ( ( ',' )? )
+            {
+            // InternalEntityMockDSL.g:6873:1: ( ( ',' )? )
+            // InternalEntityMockDSL.g:6874:2: ( ',' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1()); 
+            }
+            // InternalEntityMockDSL.g:6875:2: ( ',' )?
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==70) ) {
+                alt78=1;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6875:3: ','
+                    {
+                    match(input,70,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__0"
+    // InternalEntityMockDSL.g:6884:1: rule__EntityMockObjects__Group__0 : rule__EntityMockObjects__Group__0__Impl rule__EntityMockObjects__Group__1 ;
+    public final void rule__EntityMockObjects__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6888:1: ( rule__EntityMockObjects__Group__0__Impl rule__EntityMockObjects__Group__1 )
+            // InternalEntityMockDSL.g:6889:2: rule__EntityMockObjects__Group__0__Impl rule__EntityMockObjects__Group__1
+            {
+            pushFollow(FOLLOW_32);
+            rule__EntityMockObjects__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__0__Impl"
+    // InternalEntityMockDSL.g:6896:1: rule__EntityMockObjects__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockObjects__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6900:1: ( ( () ) )
+            // InternalEntityMockDSL.g:6901:1: ( () )
+            {
+            // InternalEntityMockDSL.g:6901:1: ( () )
+            // InternalEntityMockDSL.g:6902:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0()); 
+            }
+            // InternalEntityMockDSL.g:6903:2: ()
+            // InternalEntityMockDSL.g:6903:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__1"
+    // InternalEntityMockDSL.g:6911:1: rule__EntityMockObjects__Group__1 : rule__EntityMockObjects__Group__1__Impl rule__EntityMockObjects__Group__2 ;
+    public final void rule__EntityMockObjects__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6915:1: ( rule__EntityMockObjects__Group__1__Impl rule__EntityMockObjects__Group__2 )
+            // InternalEntityMockDSL.g:6916:2: rule__EntityMockObjects__Group__1__Impl rule__EntityMockObjects__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockObjects__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__1__Impl"
+    // InternalEntityMockDSL.g:6923:1: rule__EntityMockObjects__Group__1__Impl : ( 'objects' ) ;
+    public final void rule__EntityMockObjects__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6927:1: ( ( 'objects' ) )
+            // InternalEntityMockDSL.g:6928:1: ( 'objects' )
+            {
+            // InternalEntityMockDSL.g:6928:1: ( 'objects' )
+            // InternalEntityMockDSL.g:6929:2: 'objects'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1()); 
+            }
+            match(input,71,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__2"
+    // InternalEntityMockDSL.g:6938:1: rule__EntityMockObjects__Group__2 : rule__EntityMockObjects__Group__2__Impl rule__EntityMockObjects__Group__3 ;
+    public final void rule__EntityMockObjects__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6942:1: ( rule__EntityMockObjects__Group__2__Impl rule__EntityMockObjects__Group__3 )
+            // InternalEntityMockDSL.g:6943:2: rule__EntityMockObjects__Group__2__Impl rule__EntityMockObjects__Group__3
+            {
+            pushFollow(FOLLOW_33);
+            rule__EntityMockObjects__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__2__Impl"
+    // InternalEntityMockDSL.g:6950:1: rule__EntityMockObjects__Group__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockObjects__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6954:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:6955:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:6955:1: ( '{' )
+            // InternalEntityMockDSL.g:6956:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__3"
+    // InternalEntityMockDSL.g:6965:1: rule__EntityMockObjects__Group__3 : rule__EntityMockObjects__Group__3__Impl rule__EntityMockObjects__Group__4 ;
+    public final void rule__EntityMockObjects__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6969:1: ( rule__EntityMockObjects__Group__3__Impl rule__EntityMockObjects__Group__4 )
+            // InternalEntityMockDSL.g:6970:2: rule__EntityMockObjects__Group__3__Impl rule__EntityMockObjects__Group__4
+            {
+            pushFollow(FOLLOW_33);
+            rule__EntityMockObjects__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__3__Impl"
+    // InternalEntityMockDSL.g:6977:1: rule__EntityMockObjects__Group__3__Impl : ( ( rule__EntityMockObjects__ObjectsAssignment_3 )* ) ;
+    public final void rule__EntityMockObjects__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6981:1: ( ( ( rule__EntityMockObjects__ObjectsAssignment_3 )* ) )
+            // InternalEntityMockDSL.g:6982:1: ( ( rule__EntityMockObjects__ObjectsAssignment_3 )* )
+            {
+            // InternalEntityMockDSL.g:6982:1: ( ( rule__EntityMockObjects__ObjectsAssignment_3 )* )
+            // InternalEntityMockDSL.g:6983:2: ( rule__EntityMockObjects__ObjectsAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getObjectsAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:6984:2: ( rule__EntityMockObjects__ObjectsAssignment_3 )*
+            loop79:
+            do {
+                int alt79=2;
+                int LA79_0 = input.LA(1);
+
+                if ( (LA79_0==72) ) {
+                    alt79=1;
+                }
+
+
+                switch (alt79) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6984:3: rule__EntityMockObjects__ObjectsAssignment_3
+            	    {
+            	    pushFollow(FOLLOW_34);
+            	    rule__EntityMockObjects__ObjectsAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop79;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getObjectsAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__4"
+    // InternalEntityMockDSL.g:6992:1: rule__EntityMockObjects__Group__4 : rule__EntityMockObjects__Group__4__Impl ;
+    public final void rule__EntityMockObjects__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:6996:1: ( rule__EntityMockObjects__Group__4__Impl )
+            // InternalEntityMockDSL.g:6997:2: rule__EntityMockObjects__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjects__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjects__Group__4__Impl"
+    // InternalEntityMockDSL.g:7003:1: rule__EntityMockObjects__Group__4__Impl : ( '}' ) ;
+    public final void rule__EntityMockObjects__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7007:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:7008:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:7008:1: ( '}' )
+            // InternalEntityMockDSL.g:7009:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__0"
+    // InternalEntityMockDSL.g:7019:1: rule__EntityMockObject__Group__0 : rule__EntityMockObject__Group__0__Impl rule__EntityMockObject__Group__1 ;
+    public final void rule__EntityMockObject__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7023:1: ( rule__EntityMockObject__Group__0__Impl rule__EntityMockObject__Group__1 )
+            // InternalEntityMockDSL.g:7024:2: rule__EntityMockObject__Group__0__Impl rule__EntityMockObject__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObject__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__0__Impl"
+    // InternalEntityMockDSL.g:7031:1: rule__EntityMockObject__Group__0__Impl : ( 'object' ) ;
+    public final void rule__EntityMockObject__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7035:1: ( ( 'object' ) )
+            // InternalEntityMockDSL.g:7036:1: ( 'object' )
+            {
+            // InternalEntityMockDSL.g:7036:1: ( 'object' )
+            // InternalEntityMockDSL.g:7037:2: 'object'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0()); 
+            }
+            match(input,72,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__1"
+    // InternalEntityMockDSL.g:7046:1: rule__EntityMockObject__Group__1 : rule__EntityMockObject__Group__1__Impl rule__EntityMockObject__Group__2 ;
+    public final void rule__EntityMockObject__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7050:1: ( rule__EntityMockObject__Group__1__Impl rule__EntityMockObject__Group__2 )
+            // InternalEntityMockDSL.g:7051:2: rule__EntityMockObject__Group__1__Impl rule__EntityMockObject__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockObject__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__1__Impl"
+    // InternalEntityMockDSL.g:7058:1: rule__EntityMockObject__Group__1__Impl : ( ( rule__EntityMockObject__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObject__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7062:1: ( ( ( rule__EntityMockObject__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7063:1: ( ( rule__EntityMockObject__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7063:1: ( ( rule__EntityMockObject__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:7064:2: ( rule__EntityMockObject__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7065:2: ( rule__EntityMockObject__NameAssignment_1 )
+            // InternalEntityMockDSL.g:7065:3: rule__EntityMockObject__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__2"
+    // InternalEntityMockDSL.g:7073:1: rule__EntityMockObject__Group__2 : rule__EntityMockObject__Group__2__Impl rule__EntityMockObject__Group__3 ;
+    public final void rule__EntityMockObject__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7077:1: ( rule__EntityMockObject__Group__2__Impl rule__EntityMockObject__Group__3 )
+            // InternalEntityMockDSL.g:7078:2: rule__EntityMockObject__Group__2__Impl rule__EntityMockObject__Group__3
+            {
+            pushFollow(FOLLOW_35);
+            rule__EntityMockObject__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__2__Impl"
+    // InternalEntityMockDSL.g:7085:1: rule__EntityMockObject__Group__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockObject__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7089:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:7090:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:7090:1: ( '{' )
+            // InternalEntityMockDSL.g:7091:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__3"
+    // InternalEntityMockDSL.g:7100:1: rule__EntityMockObject__Group__3 : rule__EntityMockObject__Group__3__Impl rule__EntityMockObject__Group__4 ;
+    public final void rule__EntityMockObject__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7104:1: ( rule__EntityMockObject__Group__3__Impl rule__EntityMockObject__Group__4 )
+            // InternalEntityMockDSL.g:7105:2: rule__EntityMockObject__Group__3__Impl rule__EntityMockObject__Group__4
+            {
+            pushFollow(FOLLOW_35);
+            rule__EntityMockObject__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__3__Impl"
+    // InternalEntityMockDSL.g:7112:1: rule__EntityMockObject__Group__3__Impl : ( ( rule__EntityMockObject__EnumerationsAssignment_3 )* ) ;
+    public final void rule__EntityMockObject__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7116:1: ( ( ( rule__EntityMockObject__EnumerationsAssignment_3 )* ) )
+            // InternalEntityMockDSL.g:7117:1: ( ( rule__EntityMockObject__EnumerationsAssignment_3 )* )
+            {
+            // InternalEntityMockDSL.g:7117:1: ( ( rule__EntityMockObject__EnumerationsAssignment_3 )* )
+            // InternalEntityMockDSL.g:7118:2: ( rule__EntityMockObject__EnumerationsAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getEnumerationsAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:7119:2: ( rule__EntityMockObject__EnumerationsAssignment_3 )*
+            loop80:
+            do {
+                int alt80=2;
+                int LA80_0 = input.LA(1);
+
+                if ( (LA80_0==73) ) {
+                    int LA80_1 = input.LA(2);
+
+                    if ( (LA80_1==RULE_ID) ) {
+                        int LA80_3 = input.LA(3);
+
+                        if ( (LA80_3==74) ) {
+                            alt80=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt80) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7119:3: rule__EntityMockObject__EnumerationsAssignment_3
+            	    {
+            	    pushFollow(FOLLOW_36);
+            	    rule__EntityMockObject__EnumerationsAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop80;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getEnumerationsAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__4"
+    // InternalEntityMockDSL.g:7127:1: rule__EntityMockObject__Group__4 : rule__EntityMockObject__Group__4__Impl rule__EntityMockObject__Group__5 ;
+    public final void rule__EntityMockObject__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7131:1: ( rule__EntityMockObject__Group__4__Impl rule__EntityMockObject__Group__5 )
+            // InternalEntityMockDSL.g:7132:2: rule__EntityMockObject__Group__4__Impl rule__EntityMockObject__Group__5
+            {
+            pushFollow(FOLLOW_35);
+            rule__EntityMockObject__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__4__Impl"
+    // InternalEntityMockDSL.g:7139:1: rule__EntityMockObject__Group__4__Impl : ( ( rule__EntityMockObject__AttributesAssignment_4 )* ) ;
+    public final void rule__EntityMockObject__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7143:1: ( ( ( rule__EntityMockObject__AttributesAssignment_4 )* ) )
+            // InternalEntityMockDSL.g:7144:1: ( ( rule__EntityMockObject__AttributesAssignment_4 )* )
+            {
+            // InternalEntityMockDSL.g:7144:1: ( ( rule__EntityMockObject__AttributesAssignment_4 )* )
+            // InternalEntityMockDSL.g:7145:2: ( rule__EntityMockObject__AttributesAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getAttributesAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:7146:2: ( rule__EntityMockObject__AttributesAssignment_4 )*
+            loop81:
+            do {
+                int alt81=2;
+                int LA81_0 = input.LA(1);
+
+                if ( (LA81_0==73) ) {
+                    int LA81_1 = input.LA(2);
+
+                    if ( (LA81_1==RULE_ID) ) {
+                        int LA81_4 = input.LA(3);
+
+                        if ( (LA81_4==68||(LA81_4>=75 && LA81_4<=76)||LA81_4==82) ) {
+                            alt81=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA81_0==78) ) {
+                    alt81=1;
+                }
+
+
+                switch (alt81) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7146:3: rule__EntityMockObject__AttributesAssignment_4
+            	    {
+            	    pushFollow(FOLLOW_37);
+            	    rule__EntityMockObject__AttributesAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop81;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getAttributesAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__5"
+    // InternalEntityMockDSL.g:7154:1: rule__EntityMockObject__Group__5 : rule__EntityMockObject__Group__5__Impl rule__EntityMockObject__Group__6 ;
+    public final void rule__EntityMockObject__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7158:1: ( rule__EntityMockObject__Group__5__Impl rule__EntityMockObject__Group__6 )
+            // InternalEntityMockDSL.g:7159:2: rule__EntityMockObject__Group__5__Impl rule__EntityMockObject__Group__6
+            {
+            pushFollow(FOLLOW_35);
+            rule__EntityMockObject__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__5"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__5__Impl"
+    // InternalEntityMockDSL.g:7166:1: rule__EntityMockObject__Group__5__Impl : ( ( rule__EntityMockObject__CalculationsAssignment_5 )* ) ;
+    public final void rule__EntityMockObject__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7170:1: ( ( ( rule__EntityMockObject__CalculationsAssignment_5 )* ) )
+            // InternalEntityMockDSL.g:7171:1: ( ( rule__EntityMockObject__CalculationsAssignment_5 )* )
+            {
+            // InternalEntityMockDSL.g:7171:1: ( ( rule__EntityMockObject__CalculationsAssignment_5 )* )
+            // InternalEntityMockDSL.g:7172:2: ( rule__EntityMockObject__CalculationsAssignment_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getCalculationsAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:7173:2: ( rule__EntityMockObject__CalculationsAssignment_5 )*
+            loop82:
+            do {
+                int alt82=2;
+                int LA82_0 = input.LA(1);
+
+                if ( (LA82_0==73) ) {
+                    alt82=1;
+                }
+
+
+                switch (alt82) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7173:3: rule__EntityMockObject__CalculationsAssignment_5
+            	    {
+            	    pushFollow(FOLLOW_36);
+            	    rule__EntityMockObject__CalculationsAssignment_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop82;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getCalculationsAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__6"
+    // InternalEntityMockDSL.g:7181:1: rule__EntityMockObject__Group__6 : rule__EntityMockObject__Group__6__Impl ;
+    public final void rule__EntityMockObject__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7185:1: ( rule__EntityMockObject__Group__6__Impl )
+            // InternalEntityMockDSL.g:7186:2: rule__EntityMockObject__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObject__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__6"
+
+
+    // $ANTLR start "rule__EntityMockObject__Group__6__Impl"
+    // InternalEntityMockDSL.g:7192:1: rule__EntityMockObject__Group__6__Impl : ( '}' ) ;
+    public final void rule__EntityMockObject__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7196:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:7197:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:7197:1: ( '}' )
+            // InternalEntityMockDSL.g:7198:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__0"
+    // InternalEntityMockDSL.g:7208:1: rule__EntityMockObjectEnum__Group__0 : rule__EntityMockObjectEnum__Group__0__Impl rule__EntityMockObjectEnum__Group__1 ;
+    public final void rule__EntityMockObjectEnum__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7212:1: ( rule__EntityMockObjectEnum__Group__0__Impl rule__EntityMockObjectEnum__Group__1 )
+            // InternalEntityMockDSL.g:7213:2: rule__EntityMockObjectEnum__Group__0__Impl rule__EntityMockObjectEnum__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectEnum__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__0__Impl"
+    // InternalEntityMockDSL.g:7220:1: rule__EntityMockObjectEnum__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectEnum__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7224:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:7225:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:7225:1: ( 'var' )
+            // InternalEntityMockDSL.g:7226:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__1"
+    // InternalEntityMockDSL.g:7235:1: rule__EntityMockObjectEnum__Group__1 : rule__EntityMockObjectEnum__Group__1__Impl rule__EntityMockObjectEnum__Group__2 ;
+    public final void rule__EntityMockObjectEnum__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7239:1: ( rule__EntityMockObjectEnum__Group__1__Impl rule__EntityMockObjectEnum__Group__2 )
+            // InternalEntityMockDSL.g:7240:2: rule__EntityMockObjectEnum__Group__1__Impl rule__EntityMockObjectEnum__Group__2
+            {
+            pushFollow(FOLLOW_38);
+            rule__EntityMockObjectEnum__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__1__Impl"
+    // InternalEntityMockDSL.g:7247:1: rule__EntityMockObjectEnum__Group__1__Impl : ( ( rule__EntityMockObjectEnum__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectEnum__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7251:1: ( ( ( rule__EntityMockObjectEnum__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7252:1: ( ( rule__EntityMockObjectEnum__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7252:1: ( ( rule__EntityMockObjectEnum__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:7253:2: ( rule__EntityMockObjectEnum__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7254:2: ( rule__EntityMockObjectEnum__NameAssignment_1 )
+            // InternalEntityMockDSL.g:7254:3: rule__EntityMockObjectEnum__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__2"
+    // InternalEntityMockDSL.g:7262:1: rule__EntityMockObjectEnum__Group__2 : rule__EntityMockObjectEnum__Group__2__Impl rule__EntityMockObjectEnum__Group__3 ;
+    public final void rule__EntityMockObjectEnum__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7266:1: ( rule__EntityMockObjectEnum__Group__2__Impl rule__EntityMockObjectEnum__Group__3 )
+            // InternalEntityMockDSL.g:7267:2: rule__EntityMockObjectEnum__Group__2__Impl rule__EntityMockObjectEnum__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectEnum__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__2__Impl"
+    // InternalEntityMockDSL.g:7274:1: rule__EntityMockObjectEnum__Group__2__Impl : ( 'byEnum' ) ;
+    public final void rule__EntityMockObjectEnum__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7278:1: ( ( 'byEnum' ) )
+            // InternalEntityMockDSL.g:7279:1: ( 'byEnum' )
+            {
+            // InternalEntityMockDSL.g:7279:1: ( 'byEnum' )
+            // InternalEntityMockDSL.g:7280:2: 'byEnum'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__3"
+    // InternalEntityMockDSL.g:7289:1: rule__EntityMockObjectEnum__Group__3 : rule__EntityMockObjectEnum__Group__3__Impl ;
+    public final void rule__EntityMockObjectEnum__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7293:1: ( rule__EntityMockObjectEnum__Group__3__Impl )
+            // InternalEntityMockDSL.g:7294:2: rule__EntityMockObjectEnum__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__Group__3__Impl"
+    // InternalEntityMockDSL.g:7300:1: rule__EntityMockObjectEnum__Group__3__Impl : ( ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 ) ) ;
+    public final void rule__EntityMockObjectEnum__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7304:1: ( ( ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:7305:1: ( ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:7305:1: ( ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 ) )
+            // InternalEntityMockDSL.g:7306:2: ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:7307:2: ( rule__EntityMockObjectEnum__UsingResourceAssignment_3 )
+            // InternalEntityMockDSL.g:7307:3: rule__EntityMockObjectEnum__UsingResourceAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEnum__UsingResourceAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__0"
+    // InternalEntityMockDSL.g:7316:1: rule__EntityMockObjectPlainValue__Group__0 : rule__EntityMockObjectPlainValue__Group__0__Impl rule__EntityMockObjectPlainValue__Group__1 ;
+    public final void rule__EntityMockObjectPlainValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7320:1: ( rule__EntityMockObjectPlainValue__Group__0__Impl rule__EntityMockObjectPlainValue__Group__1 )
+            // InternalEntityMockDSL.g:7321:2: rule__EntityMockObjectPlainValue__Group__0__Impl rule__EntityMockObjectPlainValue__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectPlainValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__0__Impl"
+    // InternalEntityMockDSL.g:7328:1: rule__EntityMockObjectPlainValue__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectPlainValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7332:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:7333:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:7333:1: ( 'var' )
+            // InternalEntityMockDSL.g:7334:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__1"
+    // InternalEntityMockDSL.g:7343:1: rule__EntityMockObjectPlainValue__Group__1 : rule__EntityMockObjectPlainValue__Group__1__Impl rule__EntityMockObjectPlainValue__Group__2 ;
+    public final void rule__EntityMockObjectPlainValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7347:1: ( rule__EntityMockObjectPlainValue__Group__1__Impl rule__EntityMockObjectPlainValue__Group__2 )
+            // InternalEntityMockDSL.g:7348:2: rule__EntityMockObjectPlainValue__Group__1__Impl rule__EntityMockObjectPlainValue__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockObjectPlainValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__1__Impl"
+    // InternalEntityMockDSL.g:7355:1: rule__EntityMockObjectPlainValue__Group__1__Impl : ( ( rule__EntityMockObjectPlainValue__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectPlainValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7359:1: ( ( ( rule__EntityMockObjectPlainValue__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7360:1: ( ( rule__EntityMockObjectPlainValue__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7360:1: ( ( rule__EntityMockObjectPlainValue__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:7361:2: ( rule__EntityMockObjectPlainValue__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7362:2: ( rule__EntityMockObjectPlainValue__NameAssignment_1 )
+            // InternalEntityMockDSL.g:7362:3: rule__EntityMockObjectPlainValue__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__2"
+    // InternalEntityMockDSL.g:7370:1: rule__EntityMockObjectPlainValue__Group__2 : rule__EntityMockObjectPlainValue__Group__2__Impl rule__EntityMockObjectPlainValue__Group__3 ;
+    public final void rule__EntityMockObjectPlainValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7374:1: ( rule__EntityMockObjectPlainValue__Group__2__Impl rule__EntityMockObjectPlainValue__Group__3 )
+            // InternalEntityMockDSL.g:7375:2: rule__EntityMockObjectPlainValue__Group__2__Impl rule__EntityMockObjectPlainValue__Group__3
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockObjectPlainValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__2__Impl"
+    // InternalEntityMockDSL.g:7382:1: rule__EntityMockObjectPlainValue__Group__2__Impl : ( '(' ) ;
+    public final void rule__EntityMockObjectPlainValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7386:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:7387:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:7387:1: ( '(' )
+            // InternalEntityMockDSL.g:7388:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__3"
+    // InternalEntityMockDSL.g:7397:1: rule__EntityMockObjectPlainValue__Group__3 : rule__EntityMockObjectPlainValue__Group__3__Impl rule__EntityMockObjectPlainValue__Group__4 ;
+    public final void rule__EntityMockObjectPlainValue__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7401:1: ( rule__EntityMockObjectPlainValue__Group__3__Impl rule__EntityMockObjectPlainValue__Group__4 )
+            // InternalEntityMockDSL.g:7402:2: rule__EntityMockObjectPlainValue__Group__3__Impl rule__EntityMockObjectPlainValue__Group__4
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockObjectPlainValue__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__3__Impl"
+    // InternalEntityMockDSL.g:7409:1: rule__EntityMockObjectPlainValue__Group__3__Impl : ( ( rule__EntityMockObjectPlainValue__Group_3__0 )* ) ;
+    public final void rule__EntityMockObjectPlainValue__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7413:1: ( ( ( rule__EntityMockObjectPlainValue__Group_3__0 )* ) )
+            // InternalEntityMockDSL.g:7414:1: ( ( rule__EntityMockObjectPlainValue__Group_3__0 )* )
+            {
+            // InternalEntityMockDSL.g:7414:1: ( ( rule__EntityMockObjectPlainValue__Group_3__0 )* )
+            // InternalEntityMockDSL.g:7415:2: ( rule__EntityMockObjectPlainValue__Group_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:7416:2: ( rule__EntityMockObjectPlainValue__Group_3__0 )*
+            loop83:
+            do {
+                int alt83=2;
+                int LA83_0 = input.LA(1);
+
+                if ( (LA83_0==RULE_STRING) ) {
+                    alt83=1;
+                }
+
+
+                switch (alt83) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7416:3: rule__EntityMockObjectPlainValue__Group_3__0
+            	    {
+            	    pushFollow(FOLLOW_31);
+            	    rule__EntityMockObjectPlainValue__Group_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop83;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__4"
+    // InternalEntityMockDSL.g:7424:1: rule__EntityMockObjectPlainValue__Group__4 : rule__EntityMockObjectPlainValue__Group__4__Impl ;
+    public final void rule__EntityMockObjectPlainValue__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7428:1: ( rule__EntityMockObjectPlainValue__Group__4__Impl )
+            // InternalEntityMockDSL.g:7429:2: rule__EntityMockObjectPlainValue__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group__4__Impl"
+    // InternalEntityMockDSL.g:7435:1: rule__EntityMockObjectPlainValue__Group__4__Impl : ( ')' ) ;
+    public final void rule__EntityMockObjectPlainValue__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7439:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:7440:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:7440:1: ( ')' )
+            // InternalEntityMockDSL.g:7441:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group_3__0"
+    // InternalEntityMockDSL.g:7451:1: rule__EntityMockObjectPlainValue__Group_3__0 : rule__EntityMockObjectPlainValue__Group_3__0__Impl rule__EntityMockObjectPlainValue__Group_3__1 ;
+    public final void rule__EntityMockObjectPlainValue__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7455:1: ( rule__EntityMockObjectPlainValue__Group_3__0__Impl rule__EntityMockObjectPlainValue__Group_3__1 )
+            // InternalEntityMockDSL.g:7456:2: rule__EntityMockObjectPlainValue__Group_3__0__Impl rule__EntityMockObjectPlainValue__Group_3__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockObjectPlainValue__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group_3__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:7463:1: rule__EntityMockObjectPlainValue__Group_3__0__Impl : ( ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 ) ) ;
+    public final void rule__EntityMockObjectPlainValue__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7467:1: ( ( ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:7468:1: ( ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:7468:1: ( ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:7469:2: ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:7470:2: ( rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 )
+            // InternalEntityMockDSL.g:7470:3: rule__EntityMockObjectPlainValue__ValuesAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__ValuesAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group_3__1"
+    // InternalEntityMockDSL.g:7478:1: rule__EntityMockObjectPlainValue__Group_3__1 : rule__EntityMockObjectPlainValue__Group_3__1__Impl ;
+    public final void rule__EntityMockObjectPlainValue__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7482:1: ( rule__EntityMockObjectPlainValue__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:7483:2: rule__EntityMockObjectPlainValue__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectPlainValue__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group_3__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:7489:1: rule__EntityMockObjectPlainValue__Group_3__1__Impl : ( ( ',' )? ) ;
+    public final void rule__EntityMockObjectPlainValue__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7493:1: ( ( ( ',' )? ) )
+            // InternalEntityMockDSL.g:7494:1: ( ( ',' )? )
+            {
+            // InternalEntityMockDSL.g:7494:1: ( ( ',' )? )
+            // InternalEntityMockDSL.g:7495:2: ( ',' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1()); 
+            }
+            // InternalEntityMockDSL.g:7496:2: ( ',' )?
+            int alt84=2;
+            int LA84_0 = input.LA(1);
+
+            if ( (LA84_0==70) ) {
+                alt84=1;
+            }
+            switch (alt84) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7496:3: ','
+                    {
+                    match(input,70,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__0"
+    // InternalEntityMockDSL.g:7505:1: rule__EntityMockObjectResourceValue__Group__0 : rule__EntityMockObjectResourceValue__Group__0__Impl rule__EntityMockObjectResourceValue__Group__1 ;
+    public final void rule__EntityMockObjectResourceValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7509:1: ( rule__EntityMockObjectResourceValue__Group__0__Impl rule__EntityMockObjectResourceValue__Group__1 )
+            // InternalEntityMockDSL.g:7510:2: rule__EntityMockObjectResourceValue__Group__0__Impl rule__EntityMockObjectResourceValue__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectResourceValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__0__Impl"
+    // InternalEntityMockDSL.g:7517:1: rule__EntityMockObjectResourceValue__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectResourceValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7521:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:7522:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:7522:1: ( 'var' )
+            // InternalEntityMockDSL.g:7523:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__1"
+    // InternalEntityMockDSL.g:7532:1: rule__EntityMockObjectResourceValue__Group__1 : rule__EntityMockObjectResourceValue__Group__1__Impl rule__EntityMockObjectResourceValue__Group__2 ;
+    public final void rule__EntityMockObjectResourceValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7536:1: ( rule__EntityMockObjectResourceValue__Group__1__Impl rule__EntityMockObjectResourceValue__Group__2 )
+            // InternalEntityMockDSL.g:7537:2: rule__EntityMockObjectResourceValue__Group__1__Impl rule__EntityMockObjectResourceValue__Group__2
+            {
+            pushFollow(FOLLOW_39);
+            rule__EntityMockObjectResourceValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__1__Impl"
+    // InternalEntityMockDSL.g:7544:1: rule__EntityMockObjectResourceValue__Group__1__Impl : ( ( rule__EntityMockObjectResourceValue__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectResourceValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7548:1: ( ( ( rule__EntityMockObjectResourceValue__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7549:1: ( ( rule__EntityMockObjectResourceValue__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7549:1: ( ( rule__EntityMockObjectResourceValue__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:7550:2: ( rule__EntityMockObjectResourceValue__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7551:2: ( rule__EntityMockObjectResourceValue__NameAssignment_1 )
+            // InternalEntityMockDSL.g:7551:3: rule__EntityMockObjectResourceValue__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__2"
+    // InternalEntityMockDSL.g:7559:1: rule__EntityMockObjectResourceValue__Group__2 : rule__EntityMockObjectResourceValue__Group__2__Impl rule__EntityMockObjectResourceValue__Group__3 ;
+    public final void rule__EntityMockObjectResourceValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7563:1: ( rule__EntityMockObjectResourceValue__Group__2__Impl rule__EntityMockObjectResourceValue__Group__3 )
+            // InternalEntityMockDSL.g:7564:2: rule__EntityMockObjectResourceValue__Group__2__Impl rule__EntityMockObjectResourceValue__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectResourceValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__2__Impl"
+    // InternalEntityMockDSL.g:7571:1: rule__EntityMockObjectResourceValue__Group__2__Impl : ( 'with' ) ;
+    public final void rule__EntityMockObjectResourceValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7575:1: ( ( 'with' ) )
+            // InternalEntityMockDSL.g:7576:1: ( 'with' )
+            {
+            // InternalEntityMockDSL.g:7576:1: ( 'with' )
+            // InternalEntityMockDSL.g:7577:2: 'with'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__3"
+    // InternalEntityMockDSL.g:7586:1: rule__EntityMockObjectResourceValue__Group__3 : rule__EntityMockObjectResourceValue__Group__3__Impl rule__EntityMockObjectResourceValue__Group__4 ;
+    public final void rule__EntityMockObjectResourceValue__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7590:1: ( rule__EntityMockObjectResourceValue__Group__3__Impl rule__EntityMockObjectResourceValue__Group__4 )
+            // InternalEntityMockDSL.g:7591:2: rule__EntityMockObjectResourceValue__Group__3__Impl rule__EntityMockObjectResourceValue__Group__4
+            {
+            pushFollow(FOLLOW_40);
+            rule__EntityMockObjectResourceValue__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__3__Impl"
+    // InternalEntityMockDSL.g:7598:1: rule__EntityMockObjectResourceValue__Group__3__Impl : ( ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 ) ) ;
+    public final void rule__EntityMockObjectResourceValue__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7602:1: ( ( ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:7603:1: ( ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:7603:1: ( ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 ) )
+            // InternalEntityMockDSL.g:7604:2: ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:7605:2: ( rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 )
+            // InternalEntityMockDSL.g:7605:3: rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__4"
+    // InternalEntityMockDSL.g:7613:1: rule__EntityMockObjectResourceValue__Group__4 : rule__EntityMockObjectResourceValue__Group__4__Impl ;
+    public final void rule__EntityMockObjectResourceValue__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7617:1: ( rule__EntityMockObjectResourceValue__Group__4__Impl )
+            // InternalEntityMockDSL.g:7618:2: rule__EntityMockObjectResourceValue__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group__4__Impl"
+    // InternalEntityMockDSL.g:7624:1: rule__EntityMockObjectResourceValue__Group__4__Impl : ( ( rule__EntityMockObjectResourceValue__Group_4__0 )? ) ;
+    public final void rule__EntityMockObjectResourceValue__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7628:1: ( ( ( rule__EntityMockObjectResourceValue__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:7629:1: ( ( rule__EntityMockObjectResourceValue__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:7629:1: ( ( rule__EntityMockObjectResourceValue__Group_4__0 )? )
+            // InternalEntityMockDSL.g:7630:2: ( rule__EntityMockObjectResourceValue__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:7631:2: ( rule__EntityMockObjectResourceValue__Group_4__0 )?
+            int alt85=2;
+            int LA85_0 = input.LA(1);
+
+            if ( (LA85_0==44) ) {
+                alt85=1;
+            }
+            switch (alt85) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7631:3: rule__EntityMockObjectResourceValue__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockObjectResourceValue__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group_4__0"
+    // InternalEntityMockDSL.g:7640:1: rule__EntityMockObjectResourceValue__Group_4__0 : rule__EntityMockObjectResourceValue__Group_4__0__Impl rule__EntityMockObjectResourceValue__Group_4__1 ;
+    public final void rule__EntityMockObjectResourceValue__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7644:1: ( rule__EntityMockObjectResourceValue__Group_4__0__Impl rule__EntityMockObjectResourceValue__Group_4__1 )
+            // InternalEntityMockDSL.g:7645:2: rule__EntityMockObjectResourceValue__Group_4__0__Impl rule__EntityMockObjectResourceValue__Group_4__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectResourceValue__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group_4__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:7652:1: rule__EntityMockObjectResourceValue__Group_4__0__Impl : ( '.' ) ;
+    public final void rule__EntityMockObjectResourceValue__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7656:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:7657:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:7657:1: ( '.' )
+            // InternalEntityMockDSL.g:7658:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group_4__1"
+    // InternalEntityMockDSL.g:7667:1: rule__EntityMockObjectResourceValue__Group_4__1 : rule__EntityMockObjectResourceValue__Group_4__1__Impl ;
+    public final void rule__EntityMockObjectResourceValue__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7671:1: ( rule__EntityMockObjectResourceValue__Group_4__1__Impl )
+            // InternalEntityMockDSL.g:7672:2: rule__EntityMockObjectResourceValue__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group_4__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:7678:1: rule__EntityMockObjectResourceValue__Group_4__1__Impl : ( ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 ) ) ;
+    public final void rule__EntityMockObjectResourceValue__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7682:1: ( ( ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 ) ) )
+            // InternalEntityMockDSL.g:7683:1: ( ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:7683:1: ( ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 ) )
+            // InternalEntityMockDSL.g:7684:2: ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeAssignment_4_1()); 
+            }
+            // InternalEntityMockDSL.g:7685:2: ( rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 )
+            // InternalEntityMockDSL.g:7685:3: rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__0"
+    // InternalEntityMockDSL.g:7694:1: rule__EntityMockObjectArrayValue__Group__0 : rule__EntityMockObjectArrayValue__Group__0__Impl rule__EntityMockObjectArrayValue__Group__1 ;
+    public final void rule__EntityMockObjectArrayValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7698:1: ( rule__EntityMockObjectArrayValue__Group__0__Impl rule__EntityMockObjectArrayValue__Group__1 )
+            // InternalEntityMockDSL.g:7699:2: rule__EntityMockObjectArrayValue__Group__0__Impl rule__EntityMockObjectArrayValue__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectArrayValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__0__Impl"
+    // InternalEntityMockDSL.g:7706:1: rule__EntityMockObjectArrayValue__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7710:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:7711:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:7711:1: ( 'var' )
+            // InternalEntityMockDSL.g:7712:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__1"
+    // InternalEntityMockDSL.g:7721:1: rule__EntityMockObjectArrayValue__Group__1 : rule__EntityMockObjectArrayValue__Group__1__Impl rule__EntityMockObjectArrayValue__Group__2 ;
+    public final void rule__EntityMockObjectArrayValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7725:1: ( rule__EntityMockObjectArrayValue__Group__1__Impl rule__EntityMockObjectArrayValue__Group__2 )
+            // InternalEntityMockDSL.g:7726:2: rule__EntityMockObjectArrayValue__Group__1__Impl rule__EntityMockObjectArrayValue__Group__2
+            {
+            pushFollow(FOLLOW_41);
+            rule__EntityMockObjectArrayValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__1__Impl"
+    // InternalEntityMockDSL.g:7733:1: rule__EntityMockObjectArrayValue__Group__1__Impl : ( ( rule__EntityMockObjectArrayValue__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7737:1: ( ( ( rule__EntityMockObjectArrayValue__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7738:1: ( ( rule__EntityMockObjectArrayValue__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7738:1: ( ( rule__EntityMockObjectArrayValue__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:7739:2: ( rule__EntityMockObjectArrayValue__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7740:2: ( rule__EntityMockObjectArrayValue__NameAssignment_1 )
+            // InternalEntityMockDSL.g:7740:3: rule__EntityMockObjectArrayValue__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__2"
+    // InternalEntityMockDSL.g:7748:1: rule__EntityMockObjectArrayValue__Group__2 : rule__EntityMockObjectArrayValue__Group__2__Impl rule__EntityMockObjectArrayValue__Group__3 ;
+    public final void rule__EntityMockObjectArrayValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7752:1: ( rule__EntityMockObjectArrayValue__Group__2__Impl rule__EntityMockObjectArrayValue__Group__3 )
+            // InternalEntityMockDSL.g:7753:2: rule__EntityMockObjectArrayValue__Group__2__Impl rule__EntityMockObjectArrayValue__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectArrayValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__2__Impl"
+    // InternalEntityMockDSL.g:7760:1: rule__EntityMockObjectArrayValue__Group__2__Impl : ( 'switchOn' ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7764:1: ( ( 'switchOn' ) )
+            // InternalEntityMockDSL.g:7765:1: ( 'switchOn' )
+            {
+            // InternalEntityMockDSL.g:7765:1: ( 'switchOn' )
+            // InternalEntityMockDSL.g:7766:2: 'switchOn'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2()); 
+            }
+            match(input,76,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__3"
+    // InternalEntityMockDSL.g:7775:1: rule__EntityMockObjectArrayValue__Group__3 : rule__EntityMockObjectArrayValue__Group__3__Impl rule__EntityMockObjectArrayValue__Group__4 ;
+    public final void rule__EntityMockObjectArrayValue__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7779:1: ( rule__EntityMockObjectArrayValue__Group__3__Impl rule__EntityMockObjectArrayValue__Group__4 )
+            // InternalEntityMockDSL.g:7780:2: rule__EntityMockObjectArrayValue__Group__3__Impl rule__EntityMockObjectArrayValue__Group__4
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockObjectArrayValue__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__3__Impl"
+    // InternalEntityMockDSL.g:7787:1: rule__EntityMockObjectArrayValue__Group__3__Impl : ( ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 ) ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7791:1: ( ( ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:7792:1: ( ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:7792:1: ( ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 ) )
+            // InternalEntityMockDSL.g:7793:2: ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:7794:2: ( rule__EntityMockObjectArrayValue__EnumerationAssignment_3 )
+            // InternalEntityMockDSL.g:7794:3: rule__EntityMockObjectArrayValue__EnumerationAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__EnumerationAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__4"
+    // InternalEntityMockDSL.g:7802:1: rule__EntityMockObjectArrayValue__Group__4 : rule__EntityMockObjectArrayValue__Group__4__Impl rule__EntityMockObjectArrayValue__Group__5 ;
+    public final void rule__EntityMockObjectArrayValue__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7806:1: ( rule__EntityMockObjectArrayValue__Group__4__Impl rule__EntityMockObjectArrayValue__Group__5 )
+            // InternalEntityMockDSL.g:7807:2: rule__EntityMockObjectArrayValue__Group__4__Impl rule__EntityMockObjectArrayValue__Group__5
+            {
+            pushFollow(FOLLOW_42);
+            rule__EntityMockObjectArrayValue__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__4__Impl"
+    // InternalEntityMockDSL.g:7814:1: rule__EntityMockObjectArrayValue__Group__4__Impl : ( '{' ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7818:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:7819:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:7819:1: ( '{' )
+            // InternalEntityMockDSL.g:7820:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__5"
+    // InternalEntityMockDSL.g:7829:1: rule__EntityMockObjectArrayValue__Group__5 : rule__EntityMockObjectArrayValue__Group__5__Impl rule__EntityMockObjectArrayValue__Group__6 ;
+    public final void rule__EntityMockObjectArrayValue__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7833:1: ( rule__EntityMockObjectArrayValue__Group__5__Impl rule__EntityMockObjectArrayValue__Group__6 )
+            // InternalEntityMockDSL.g:7834:2: rule__EntityMockObjectArrayValue__Group__5__Impl rule__EntityMockObjectArrayValue__Group__6
+            {
+            pushFollow(FOLLOW_42);
+            rule__EntityMockObjectArrayValue__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__5"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__5__Impl"
+    // InternalEntityMockDSL.g:7841:1: rule__EntityMockObjectArrayValue__Group__5__Impl : ( ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )* ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7845:1: ( ( ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )* ) )
+            // InternalEntityMockDSL.g:7846:1: ( ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )* )
+            {
+            // InternalEntityMockDSL.g:7846:1: ( ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )* )
+            // InternalEntityMockDSL.g:7847:2: ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:7848:2: ( rule__EntityMockObjectArrayValue__ItemsAssignment_5 )*
+            loop86:
+            do {
+                int alt86=2;
+                int LA86_0 = input.LA(1);
+
+                if ( (LA86_0==77) ) {
+                    alt86=1;
+                }
+
+
+                switch (alt86) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7848:3: rule__EntityMockObjectArrayValue__ItemsAssignment_5
+            	    {
+            	    pushFollow(FOLLOW_43);
+            	    rule__EntityMockObjectArrayValue__ItemsAssignment_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop86;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__6"
+    // InternalEntityMockDSL.g:7856:1: rule__EntityMockObjectArrayValue__Group__6 : rule__EntityMockObjectArrayValue__Group__6__Impl ;
+    public final void rule__EntityMockObjectArrayValue__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7860:1: ( rule__EntityMockObjectArrayValue__Group__6__Impl )
+            // InternalEntityMockDSL.g:7861:2: rule__EntityMockObjectArrayValue__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectArrayValue__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__6"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__Group__6__Impl"
+    // InternalEntityMockDSL.g:7867:1: rule__EntityMockObjectArrayValue__Group__6__Impl : ( '}' ) ;
+    public final void rule__EntityMockObjectArrayValue__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7871:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:7872:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:7872:1: ( '}' )
+            // InternalEntityMockDSL.g:7873:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__0"
+    // InternalEntityMockDSL.g:7883:1: rule__EntityMockObjectItemValue__Group__0 : rule__EntityMockObjectItemValue__Group__0__Impl rule__EntityMockObjectItemValue__Group__1 ;
+    public final void rule__EntityMockObjectItemValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7887:1: ( rule__EntityMockObjectItemValue__Group__0__Impl rule__EntityMockObjectItemValue__Group__1 )
+            // InternalEntityMockDSL.g:7888:2: rule__EntityMockObjectItemValue__Group__0__Impl rule__EntityMockObjectItemValue__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectItemValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__0__Impl"
+    // InternalEntityMockDSL.g:7895:1: rule__EntityMockObjectItemValue__Group__0__Impl : ( 'when' ) ;
+    public final void rule__EntityMockObjectItemValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7899:1: ( ( 'when' ) )
+            // InternalEntityMockDSL.g:7900:1: ( 'when' )
+            {
+            // InternalEntityMockDSL.g:7900:1: ( 'when' )
+            // InternalEntityMockDSL.g:7901:2: 'when'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0()); 
+            }
+            match(input,77,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__1"
+    // InternalEntityMockDSL.g:7910:1: rule__EntityMockObjectItemValue__Group__1 : rule__EntityMockObjectItemValue__Group__1__Impl rule__EntityMockObjectItemValue__Group__2 ;
+    public final void rule__EntityMockObjectItemValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7914:1: ( rule__EntityMockObjectItemValue__Group__1__Impl rule__EntityMockObjectItemValue__Group__2 )
+            // InternalEntityMockDSL.g:7915:2: rule__EntityMockObjectItemValue__Group__1__Impl rule__EntityMockObjectItemValue__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockObjectItemValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__1__Impl"
+    // InternalEntityMockDSL.g:7922:1: rule__EntityMockObjectItemValue__Group__1__Impl : ( ( rule__EntityMockObjectItemValue__DatarowAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectItemValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7926:1: ( ( ( rule__EntityMockObjectItemValue__DatarowAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:7927:1: ( ( rule__EntityMockObjectItemValue__DatarowAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:7927:1: ( ( rule__EntityMockObjectItemValue__DatarowAssignment_1 ) )
+            // InternalEntityMockDSL.g:7928:2: ( rule__EntityMockObjectItemValue__DatarowAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:7929:2: ( rule__EntityMockObjectItemValue__DatarowAssignment_1 )
+            // InternalEntityMockDSL.g:7929:3: rule__EntityMockObjectItemValue__DatarowAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__DatarowAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__2"
+    // InternalEntityMockDSL.g:7937:1: rule__EntityMockObjectItemValue__Group__2 : rule__EntityMockObjectItemValue__Group__2__Impl rule__EntityMockObjectItemValue__Group__3 ;
+    public final void rule__EntityMockObjectItemValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7941:1: ( rule__EntityMockObjectItemValue__Group__2__Impl rule__EntityMockObjectItemValue__Group__3 )
+            // InternalEntityMockDSL.g:7942:2: rule__EntityMockObjectItemValue__Group__2__Impl rule__EntityMockObjectItemValue__Group__3
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockObjectItemValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__2__Impl"
+    // InternalEntityMockDSL.g:7949:1: rule__EntityMockObjectItemValue__Group__2__Impl : ( '(' ) ;
+    public final void rule__EntityMockObjectItemValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7953:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:7954:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:7954:1: ( '(' )
+            // InternalEntityMockDSL.g:7955:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__3"
+    // InternalEntityMockDSL.g:7964:1: rule__EntityMockObjectItemValue__Group__3 : rule__EntityMockObjectItemValue__Group__3__Impl rule__EntityMockObjectItemValue__Group__4 ;
+    public final void rule__EntityMockObjectItemValue__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7968:1: ( rule__EntityMockObjectItemValue__Group__3__Impl rule__EntityMockObjectItemValue__Group__4 )
+            // InternalEntityMockDSL.g:7969:2: rule__EntityMockObjectItemValue__Group__3__Impl rule__EntityMockObjectItemValue__Group__4
+            {
+            pushFollow(FOLLOW_30);
+            rule__EntityMockObjectItemValue__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__3__Impl"
+    // InternalEntityMockDSL.g:7976:1: rule__EntityMockObjectItemValue__Group__3__Impl : ( ( rule__EntityMockObjectItemValue__Group_3__0 )* ) ;
+    public final void rule__EntityMockObjectItemValue__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7980:1: ( ( ( rule__EntityMockObjectItemValue__Group_3__0 )* ) )
+            // InternalEntityMockDSL.g:7981:1: ( ( rule__EntityMockObjectItemValue__Group_3__0 )* )
+            {
+            // InternalEntityMockDSL.g:7981:1: ( ( rule__EntityMockObjectItemValue__Group_3__0 )* )
+            // InternalEntityMockDSL.g:7982:2: ( rule__EntityMockObjectItemValue__Group_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:7983:2: ( rule__EntityMockObjectItemValue__Group_3__0 )*
+            loop87:
+            do {
+                int alt87=2;
+                int LA87_0 = input.LA(1);
+
+                if ( (LA87_0==RULE_STRING) ) {
+                    alt87=1;
+                }
+
+
+                switch (alt87) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7983:3: rule__EntityMockObjectItemValue__Group_3__0
+            	    {
+            	    pushFollow(FOLLOW_31);
+            	    rule__EntityMockObjectItemValue__Group_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop87;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__4"
+    // InternalEntityMockDSL.g:7991:1: rule__EntityMockObjectItemValue__Group__4 : rule__EntityMockObjectItemValue__Group__4__Impl ;
+    public final void rule__EntityMockObjectItemValue__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:7995:1: ( rule__EntityMockObjectItemValue__Group__4__Impl )
+            // InternalEntityMockDSL.g:7996:2: rule__EntityMockObjectItemValue__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group__4__Impl"
+    // InternalEntityMockDSL.g:8002:1: rule__EntityMockObjectItemValue__Group__4__Impl : ( ')' ) ;
+    public final void rule__EntityMockObjectItemValue__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8006:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:8007:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:8007:1: ( ')' )
+            // InternalEntityMockDSL.g:8008:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group_3__0"
+    // InternalEntityMockDSL.g:8018:1: rule__EntityMockObjectItemValue__Group_3__0 : rule__EntityMockObjectItemValue__Group_3__0__Impl rule__EntityMockObjectItemValue__Group_3__1 ;
+    public final void rule__EntityMockObjectItemValue__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8022:1: ( rule__EntityMockObjectItemValue__Group_3__0__Impl rule__EntityMockObjectItemValue__Group_3__1 )
+            // InternalEntityMockDSL.g:8023:2: rule__EntityMockObjectItemValue__Group_3__0__Impl rule__EntityMockObjectItemValue__Group_3__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockObjectItemValue__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group_3__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:8030:1: rule__EntityMockObjectItemValue__Group_3__0__Impl : ( ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 ) ) ;
+    public final void rule__EntityMockObjectItemValue__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8034:1: ( ( ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:8035:1: ( ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:8035:1: ( ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:8036:2: ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getValuesAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:8037:2: ( rule__EntityMockObjectItemValue__ValuesAssignment_3_0 )
+            // InternalEntityMockDSL.g:8037:3: rule__EntityMockObjectItemValue__ValuesAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__ValuesAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getValuesAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group_3__1"
+    // InternalEntityMockDSL.g:8045:1: rule__EntityMockObjectItemValue__Group_3__1 : rule__EntityMockObjectItemValue__Group_3__1__Impl ;
+    public final void rule__EntityMockObjectItemValue__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8049:1: ( rule__EntityMockObjectItemValue__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:8050:2: rule__EntityMockObjectItemValue__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectItemValue__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group_3__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:8056:1: rule__EntityMockObjectItemValue__Group_3__1__Impl : ( ( ',' )? ) ;
+    public final void rule__EntityMockObjectItemValue__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8060:1: ( ( ( ',' )? ) )
+            // InternalEntityMockDSL.g:8061:1: ( ( ',' )? )
+            {
+            // InternalEntityMockDSL.g:8061:1: ( ( ',' )? )
+            // InternalEntityMockDSL.g:8062:2: ( ',' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1()); 
+            }
+            // InternalEntityMockDSL.g:8063:2: ( ',' )?
+            int alt88=2;
+            int LA88_0 = input.LA(1);
+
+            if ( (LA88_0==70) ) {
+                alt88=1;
+            }
+            switch (alt88) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8063:3: ','
+                    {
+                    match(input,70,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__0"
+    // InternalEntityMockDSL.g:8072:1: rule__EntityMockObjectEmbed__Group__0 : rule__EntityMockObjectEmbed__Group__0__Impl rule__EntityMockObjectEmbed__Group__1 ;
+    public final void rule__EntityMockObjectEmbed__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8076:1: ( rule__EntityMockObjectEmbed__Group__0__Impl rule__EntityMockObjectEmbed__Group__1 )
+            // InternalEntityMockDSL.g:8077:2: rule__EntityMockObjectEmbed__Group__0__Impl rule__EntityMockObjectEmbed__Group__1
+            {
+            pushFollow(FOLLOW_44);
+            rule__EntityMockObjectEmbed__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__0__Impl"
+    // InternalEntityMockDSL.g:8084:1: rule__EntityMockObjectEmbed__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockObjectEmbed__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8088:1: ( ( () ) )
+            // InternalEntityMockDSL.g:8089:1: ( () )
+            {
+            // InternalEntityMockDSL.g:8089:1: ( () )
+            // InternalEntityMockDSL.g:8090:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0()); 
+            }
+            // InternalEntityMockDSL.g:8091:2: ()
+            // InternalEntityMockDSL.g:8091:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__1"
+    // InternalEntityMockDSL.g:8099:1: rule__EntityMockObjectEmbed__Group__1 : rule__EntityMockObjectEmbed__Group__1__Impl rule__EntityMockObjectEmbed__Group__2 ;
+    public final void rule__EntityMockObjectEmbed__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8103:1: ( rule__EntityMockObjectEmbed__Group__1__Impl rule__EntityMockObjectEmbed__Group__2 )
+            // InternalEntityMockDSL.g:8104:2: rule__EntityMockObjectEmbed__Group__1__Impl rule__EntityMockObjectEmbed__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectEmbed__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__1__Impl"
+    // InternalEntityMockDSL.g:8111:1: rule__EntityMockObjectEmbed__Group__1__Impl : ( 'embed' ) ;
+    public final void rule__EntityMockObjectEmbed__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8115:1: ( ( 'embed' ) )
+            // InternalEntityMockDSL.g:8116:1: ( 'embed' )
+            {
+            // InternalEntityMockDSL.g:8116:1: ( 'embed' )
+            // InternalEntityMockDSL.g:8117:2: 'embed'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1()); 
+            }
+            match(input,78,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__2"
+    // InternalEntityMockDSL.g:8126:1: rule__EntityMockObjectEmbed__Group__2 : rule__EntityMockObjectEmbed__Group__2__Impl rule__EntityMockObjectEmbed__Group__3 ;
+    public final void rule__EntityMockObjectEmbed__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8130:1: ( rule__EntityMockObjectEmbed__Group__2__Impl rule__EntityMockObjectEmbed__Group__3 )
+            // InternalEntityMockDSL.g:8131:2: rule__EntityMockObjectEmbed__Group__2__Impl rule__EntityMockObjectEmbed__Group__3
+            {
+            pushFollow(FOLLOW_45);
+            rule__EntityMockObjectEmbed__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__2__Impl"
+    // InternalEntityMockDSL.g:8138:1: rule__EntityMockObjectEmbed__Group__2__Impl : ( ( rule__EntityMockObjectEmbed__NameAssignment_2 ) ) ;
+    public final void rule__EntityMockObjectEmbed__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8142:1: ( ( ( rule__EntityMockObjectEmbed__NameAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:8143:1: ( ( rule__EntityMockObjectEmbed__NameAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:8143:1: ( ( rule__EntityMockObjectEmbed__NameAssignment_2 ) )
+            // InternalEntityMockDSL.g:8144:2: ( rule__EntityMockObjectEmbed__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getNameAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:8145:2: ( rule__EntityMockObjectEmbed__NameAssignment_2 )
+            // InternalEntityMockDSL.g:8145:3: rule__EntityMockObjectEmbed__NameAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__3"
+    // InternalEntityMockDSL.g:8153:1: rule__EntityMockObjectEmbed__Group__3 : rule__EntityMockObjectEmbed__Group__3__Impl rule__EntityMockObjectEmbed__Group__4 ;
+    public final void rule__EntityMockObjectEmbed__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8157:1: ( rule__EntityMockObjectEmbed__Group__3__Impl rule__EntityMockObjectEmbed__Group__4 )
+            // InternalEntityMockDSL.g:8158:2: rule__EntityMockObjectEmbed__Group__3__Impl rule__EntityMockObjectEmbed__Group__4
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectEmbed__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__3__Impl"
+    // InternalEntityMockDSL.g:8165:1: rule__EntityMockObjectEmbed__Group__3__Impl : ( 'definedAs' ) ;
+    public final void rule__EntityMockObjectEmbed__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8169:1: ( ( 'definedAs' ) )
+            // InternalEntityMockDSL.g:8170:1: ( 'definedAs' )
+            {
+            // InternalEntityMockDSL.g:8170:1: ( 'definedAs' )
+            // InternalEntityMockDSL.g:8171:2: 'definedAs'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3()); 
+            }
+            match(input,79,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__4"
+    // InternalEntityMockDSL.g:8180:1: rule__EntityMockObjectEmbed__Group__4 : rule__EntityMockObjectEmbed__Group__4__Impl ;
+    public final void rule__EntityMockObjectEmbed__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8184:1: ( rule__EntityMockObjectEmbed__Group__4__Impl )
+            // InternalEntityMockDSL.g:8185:2: rule__EntityMockObjectEmbed__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__Group__4__Impl"
+    // InternalEntityMockDSL.g:8191:1: rule__EntityMockObjectEmbed__Group__4__Impl : ( ( rule__EntityMockObjectEmbed__ObjectAssignment_4 ) ) ;
+    public final void rule__EntityMockObjectEmbed__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8195:1: ( ( ( rule__EntityMockObjectEmbed__ObjectAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:8196:1: ( ( rule__EntityMockObjectEmbed__ObjectAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:8196:1: ( ( rule__EntityMockObjectEmbed__ObjectAssignment_4 ) )
+            // InternalEntityMockDSL.g:8197:2: ( rule__EntityMockObjectEmbed__ObjectAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:8198:2: ( rule__EntityMockObjectEmbed__ObjectAssignment_4 )
+            // InternalEntityMockDSL.g:8198:3: rule__EntityMockObjectEmbed__ObjectAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectEmbed__ObjectAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__0"
+    // InternalEntityMockDSL.g:8207:1: rule__EntityMockObjectFunction__Group__0 : rule__EntityMockObjectFunction__Group__0__Impl rule__EntityMockObjectFunction__Group__1 ;
+    public final void rule__EntityMockObjectFunction__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8211:1: ( rule__EntityMockObjectFunction__Group__0__Impl rule__EntityMockObjectFunction__Group__1 )
+            // InternalEntityMockDSL.g:8212:2: rule__EntityMockObjectFunction__Group__0__Impl rule__EntityMockObjectFunction__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectFunction__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__0__Impl"
+    // InternalEntityMockDSL.g:8219:1: rule__EntityMockObjectFunction__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectFunction__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8223:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:8224:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:8224:1: ( 'var' )
+            // InternalEntityMockDSL.g:8225:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__1"
+    // InternalEntityMockDSL.g:8234:1: rule__EntityMockObjectFunction__Group__1 : rule__EntityMockObjectFunction__Group__1__Impl rule__EntityMockObjectFunction__Group__2 ;
+    public final void rule__EntityMockObjectFunction__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8238:1: ( rule__EntityMockObjectFunction__Group__1__Impl rule__EntityMockObjectFunction__Group__2 )
+            // InternalEntityMockDSL.g:8239:2: rule__EntityMockObjectFunction__Group__1__Impl rule__EntityMockObjectFunction__Group__2
+            {
+            pushFollow(FOLLOW_46);
+            rule__EntityMockObjectFunction__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__1__Impl"
+    // InternalEntityMockDSL.g:8246:1: rule__EntityMockObjectFunction__Group__1__Impl : ( ( rule__EntityMockObjectFunction__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectFunction__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8250:1: ( ( ( rule__EntityMockObjectFunction__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:8251:1: ( ( rule__EntityMockObjectFunction__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:8251:1: ( ( rule__EntityMockObjectFunction__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:8252:2: ( rule__EntityMockObjectFunction__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:8253:2: ( rule__EntityMockObjectFunction__NameAssignment_1 )
+            // InternalEntityMockDSL.g:8253:3: rule__EntityMockObjectFunction__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__2"
+    // InternalEntityMockDSL.g:8261:1: rule__EntityMockObjectFunction__Group__2 : rule__EntityMockObjectFunction__Group__2__Impl rule__EntityMockObjectFunction__Group__3 ;
+    public final void rule__EntityMockObjectFunction__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8265:1: ( rule__EntityMockObjectFunction__Group__2__Impl rule__EntityMockObjectFunction__Group__3 )
+            // InternalEntityMockDSL.g:8266:2: rule__EntityMockObjectFunction__Group__2__Impl rule__EntityMockObjectFunction__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectFunction__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__2__Impl"
+    // InternalEntityMockDSL.g:8273:1: rule__EntityMockObjectFunction__Group__2__Impl : ( 'calculateAs' ) ;
+    public final void rule__EntityMockObjectFunction__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8277:1: ( ( 'calculateAs' ) )
+            // InternalEntityMockDSL.g:8278:1: ( 'calculateAs' )
+            {
+            // InternalEntityMockDSL.g:8278:1: ( 'calculateAs' )
+            // InternalEntityMockDSL.g:8279:2: 'calculateAs'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2()); 
+            }
+            match(input,80,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__3"
+    // InternalEntityMockDSL.g:8288:1: rule__EntityMockObjectFunction__Group__3 : rule__EntityMockObjectFunction__Group__3__Impl rule__EntityMockObjectFunction__Group__4 ;
+    public final void rule__EntityMockObjectFunction__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8292:1: ( rule__EntityMockObjectFunction__Group__3__Impl rule__EntityMockObjectFunction__Group__4 )
+            // InternalEntityMockDSL.g:8293:2: rule__EntityMockObjectFunction__Group__3__Impl rule__EntityMockObjectFunction__Group__4
+            {
+            pushFollow(FOLLOW_47);
+            rule__EntityMockObjectFunction__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__3__Impl"
+    // InternalEntityMockDSL.g:8300:1: rule__EntityMockObjectFunction__Group__3__Impl : ( ( rule__EntityMockObjectFunction__OftypeAssignment_3 ) ) ;
+    public final void rule__EntityMockObjectFunction__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8304:1: ( ( ( rule__EntityMockObjectFunction__OftypeAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:8305:1: ( ( rule__EntityMockObjectFunction__OftypeAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:8305:1: ( ( rule__EntityMockObjectFunction__OftypeAssignment_3 ) )
+            // InternalEntityMockDSL.g:8306:2: ( rule__EntityMockObjectFunction__OftypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:8307:2: ( rule__EntityMockObjectFunction__OftypeAssignment_3 )
+            // InternalEntityMockDSL.g:8307:3: rule__EntityMockObjectFunction__OftypeAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__OftypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__4"
+    // InternalEntityMockDSL.g:8315:1: rule__EntityMockObjectFunction__Group__4 : rule__EntityMockObjectFunction__Group__4__Impl rule__EntityMockObjectFunction__Group__5 ;
+    public final void rule__EntityMockObjectFunction__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8319:1: ( rule__EntityMockObjectFunction__Group__4__Impl rule__EntityMockObjectFunction__Group__5 )
+            // InternalEntityMockDSL.g:8320:2: rule__EntityMockObjectFunction__Group__4__Impl rule__EntityMockObjectFunction__Group__5
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockObjectFunction__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__4__Impl"
+    // InternalEntityMockDSL.g:8327:1: rule__EntityMockObjectFunction__Group__4__Impl : ( 'basedOn' ) ;
+    public final void rule__EntityMockObjectFunction__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8331:1: ( ( 'basedOn' ) )
+            // InternalEntityMockDSL.g:8332:1: ( 'basedOn' )
+            {
+            // InternalEntityMockDSL.g:8332:1: ( 'basedOn' )
+            // InternalEntityMockDSL.g:8333:2: 'basedOn'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4()); 
+            }
+            match(input,81,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__5"
+    // InternalEntityMockDSL.g:8342:1: rule__EntityMockObjectFunction__Group__5 : rule__EntityMockObjectFunction__Group__5__Impl rule__EntityMockObjectFunction__Group__6 ;
+    public final void rule__EntityMockObjectFunction__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8346:1: ( rule__EntityMockObjectFunction__Group__5__Impl rule__EntityMockObjectFunction__Group__6 )
+            // InternalEntityMockDSL.g:8347:2: rule__EntityMockObjectFunction__Group__5__Impl rule__EntityMockObjectFunction__Group__6
+            {
+            pushFollow(FOLLOW_48);
+            rule__EntityMockObjectFunction__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__5"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__5__Impl"
+    // InternalEntityMockDSL.g:8354:1: rule__EntityMockObjectFunction__Group__5__Impl : ( '(' ) ;
+    public final void rule__EntityMockObjectFunction__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8358:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:8359:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:8359:1: ( '(' )
+            // InternalEntityMockDSL.g:8360:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__6"
+    // InternalEntityMockDSL.g:8369:1: rule__EntityMockObjectFunction__Group__6 : rule__EntityMockObjectFunction__Group__6__Impl rule__EntityMockObjectFunction__Group__7 ;
+    public final void rule__EntityMockObjectFunction__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8373:1: ( rule__EntityMockObjectFunction__Group__6__Impl rule__EntityMockObjectFunction__Group__7 )
+            // InternalEntityMockDSL.g:8374:2: rule__EntityMockObjectFunction__Group__6__Impl rule__EntityMockObjectFunction__Group__7
+            {
+            pushFollow(FOLLOW_48);
+            rule__EntityMockObjectFunction__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__6"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__6__Impl"
+    // InternalEntityMockDSL.g:8381:1: rule__EntityMockObjectFunction__Group__6__Impl : ( ( rule__EntityMockObjectFunction__Group_6__0 )? ) ;
+    public final void rule__EntityMockObjectFunction__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8385:1: ( ( ( rule__EntityMockObjectFunction__Group_6__0 )? ) )
+            // InternalEntityMockDSL.g:8386:1: ( ( rule__EntityMockObjectFunction__Group_6__0 )? )
+            {
+            // InternalEntityMockDSL.g:8386:1: ( ( rule__EntityMockObjectFunction__Group_6__0 )? )
+            // InternalEntityMockDSL.g:8387:2: ( rule__EntityMockObjectFunction__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6()); 
+            }
+            // InternalEntityMockDSL.g:8388:2: ( rule__EntityMockObjectFunction__Group_6__0 )?
+            int alt89=2;
+            int LA89_0 = input.LA(1);
+
+            if ( (LA89_0==RULE_ID||LA89_0==32||LA89_0==68) ) {
+                alt89=1;
+            }
+            switch (alt89) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8388:3: rule__EntityMockObjectFunction__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockObjectFunction__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__7"
+    // InternalEntityMockDSL.g:8396:1: rule__EntityMockObjectFunction__Group__7 : rule__EntityMockObjectFunction__Group__7__Impl rule__EntityMockObjectFunction__Group__8 ;
+    public final void rule__EntityMockObjectFunction__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8400:1: ( rule__EntityMockObjectFunction__Group__7__Impl rule__EntityMockObjectFunction__Group__8 )
+            // InternalEntityMockDSL.g:8401:2: rule__EntityMockObjectFunction__Group__7__Impl rule__EntityMockObjectFunction__Group__8
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockObjectFunction__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__7"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__7__Impl"
+    // InternalEntityMockDSL.g:8408:1: rule__EntityMockObjectFunction__Group__7__Impl : ( ')' ) ;
+    public final void rule__EntityMockObjectFunction__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8412:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:8413:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:8413:1: ( ')' )
+            // InternalEntityMockDSL.g:8414:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__7__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__8"
+    // InternalEntityMockDSL.g:8423:1: rule__EntityMockObjectFunction__Group__8 : rule__EntityMockObjectFunction__Group__8__Impl ;
+    public final void rule__EntityMockObjectFunction__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8427:1: ( rule__EntityMockObjectFunction__Group__8__Impl )
+            // InternalEntityMockDSL.g:8428:2: rule__EntityMockObjectFunction__Group__8__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__8"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group__8__Impl"
+    // InternalEntityMockDSL.g:8434:1: rule__EntityMockObjectFunction__Group__8__Impl : ( ( rule__EntityMockObjectFunction__BodyAssignment_8 ) ) ;
+    public final void rule__EntityMockObjectFunction__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8438:1: ( ( ( rule__EntityMockObjectFunction__BodyAssignment_8 ) ) )
+            // InternalEntityMockDSL.g:8439:1: ( ( rule__EntityMockObjectFunction__BodyAssignment_8 ) )
+            {
+            // InternalEntityMockDSL.g:8439:1: ( ( rule__EntityMockObjectFunction__BodyAssignment_8 ) )
+            // InternalEntityMockDSL.g:8440:2: ( rule__EntityMockObjectFunction__BodyAssignment_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getBodyAssignment_8()); 
+            }
+            // InternalEntityMockDSL.g:8441:2: ( rule__EntityMockObjectFunction__BodyAssignment_8 )
+            // InternalEntityMockDSL.g:8441:3: rule__EntityMockObjectFunction__BodyAssignment_8
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__BodyAssignment_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getBodyAssignment_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group__8__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6__0"
+    // InternalEntityMockDSL.g:8450:1: rule__EntityMockObjectFunction__Group_6__0 : rule__EntityMockObjectFunction__Group_6__0__Impl rule__EntityMockObjectFunction__Group_6__1 ;
+    public final void rule__EntityMockObjectFunction__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8454:1: ( rule__EntityMockObjectFunction__Group_6__0__Impl rule__EntityMockObjectFunction__Group_6__1 )
+            // InternalEntityMockDSL.g:8455:2: rule__EntityMockObjectFunction__Group_6__0__Impl rule__EntityMockObjectFunction__Group_6__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockObjectFunction__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:8462:1: rule__EntityMockObjectFunction__Group_6__0__Impl : ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 ) ) ;
+    public final void rule__EntityMockObjectFunction__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8466:1: ( ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 ) ) )
+            // InternalEntityMockDSL.g:8467:1: ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 ) )
+            {
+            // InternalEntityMockDSL.g:8467:1: ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 ) )
+            // InternalEntityMockDSL.g:8468:2: ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_0()); 
+            }
+            // InternalEntityMockDSL.g:8469:2: ( rule__EntityMockObjectFunction__ParamsAssignment_6_0 )
+            // InternalEntityMockDSL.g:8469:3: rule__EntityMockObjectFunction__ParamsAssignment_6_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__ParamsAssignment_6_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6__1"
+    // InternalEntityMockDSL.g:8477:1: rule__EntityMockObjectFunction__Group_6__1 : rule__EntityMockObjectFunction__Group_6__1__Impl ;
+    public final void rule__EntityMockObjectFunction__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8481:1: ( rule__EntityMockObjectFunction__Group_6__1__Impl )
+            // InternalEntityMockDSL.g:8482:2: rule__EntityMockObjectFunction__Group_6__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:8488:1: rule__EntityMockObjectFunction__Group_6__1__Impl : ( ( rule__EntityMockObjectFunction__Group_6_1__0 )* ) ;
+    public final void rule__EntityMockObjectFunction__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8492:1: ( ( ( rule__EntityMockObjectFunction__Group_6_1__0 )* ) )
+            // InternalEntityMockDSL.g:8493:1: ( ( rule__EntityMockObjectFunction__Group_6_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:8493:1: ( ( rule__EntityMockObjectFunction__Group_6_1__0 )* )
+            // InternalEntityMockDSL.g:8494:2: ( rule__EntityMockObjectFunction__Group_6_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6_1()); 
+            }
+            // InternalEntityMockDSL.g:8495:2: ( rule__EntityMockObjectFunction__Group_6_1__0 )*
+            loop90:
+            do {
+                int alt90=2;
+                int LA90_0 = input.LA(1);
+
+                if ( (LA90_0==70) ) {
+                    alt90=1;
+                }
+
+
+                switch (alt90) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:8495:3: rule__EntityMockObjectFunction__Group_6_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__EntityMockObjectFunction__Group_6_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop90;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getGroup_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6_1__0"
+    // InternalEntityMockDSL.g:8504:1: rule__EntityMockObjectFunction__Group_6_1__0 : rule__EntityMockObjectFunction__Group_6_1__0__Impl rule__EntityMockObjectFunction__Group_6_1__1 ;
+    public final void rule__EntityMockObjectFunction__Group_6_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8508:1: ( rule__EntityMockObjectFunction__Group_6_1__0__Impl rule__EntityMockObjectFunction__Group_6_1__1 )
+            // InternalEntityMockDSL.g:8509:2: rule__EntityMockObjectFunction__Group_6_1__0__Impl rule__EntityMockObjectFunction__Group_6_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__EntityMockObjectFunction__Group_6_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group_6_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6_1__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6_1__0__Impl"
+    // InternalEntityMockDSL.g:8516:1: rule__EntityMockObjectFunction__Group_6_1__0__Impl : ( ',' ) ;
+    public final void rule__EntityMockObjectFunction__Group_6_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8520:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:8521:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:8521:1: ( ',' )
+            // InternalEntityMockDSL.g:8522:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6_1__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6_1__1"
+    // InternalEntityMockDSL.g:8531:1: rule__EntityMockObjectFunction__Group_6_1__1 : rule__EntityMockObjectFunction__Group_6_1__1__Impl ;
+    public final void rule__EntityMockObjectFunction__Group_6_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8535:1: ( rule__EntityMockObjectFunction__Group_6_1__1__Impl )
+            // InternalEntityMockDSL.g:8536:2: rule__EntityMockObjectFunction__Group_6_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__Group_6_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6_1__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__Group_6_1__1__Impl"
+    // InternalEntityMockDSL.g:8542:1: rule__EntityMockObjectFunction__Group_6_1__1__Impl : ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 ) ) ;
+    public final void rule__EntityMockObjectFunction__Group_6_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8546:1: ( ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 ) ) )
+            // InternalEntityMockDSL.g:8547:1: ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:8547:1: ( ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 ) )
+            // InternalEntityMockDSL.g:8548:2: ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_1_1()); 
+            }
+            // InternalEntityMockDSL.g:8549:2: ( rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 )
+            // InternalEntityMockDSL.g:8549:3: rule__EntityMockObjectFunction__ParamsAssignment_6_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunction__ParamsAssignment_6_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsAssignment_6_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__Group_6_1__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__Group__0"
+    // InternalEntityMockDSL.g:8558:1: rule__EntityMockObjectFunctionParameter__Group__0 : rule__EntityMockObjectFunctionParameter__Group__0__Impl rule__EntityMockObjectFunctionParameter__Group__1 ;
+    public final void rule__EntityMockObjectFunctionParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8562:1: ( rule__EntityMockObjectFunctionParameter__Group__0__Impl rule__EntityMockObjectFunctionParameter__Group__1 )
+            // InternalEntityMockDSL.g:8563:2: rule__EntityMockObjectFunctionParameter__Group__0__Impl rule__EntityMockObjectFunctionParameter__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectFunctionParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunctionParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__Group__0__Impl"
+    // InternalEntityMockDSL.g:8570:1: rule__EntityMockObjectFunctionParameter__Group__0__Impl : ( ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 ) ) ;
+    public final void rule__EntityMockObjectFunctionParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8574:1: ( ( ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 ) ) )
+            // InternalEntityMockDSL.g:8575:1: ( ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 ) )
+            {
+            // InternalEntityMockDSL.g:8575:1: ( ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 ) )
+            // InternalEntityMockDSL.g:8576:2: ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:8577:2: ( rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 )
+            // InternalEntityMockDSL.g:8577:3: rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__Group__1"
+    // InternalEntityMockDSL.g:8585:1: rule__EntityMockObjectFunctionParameter__Group__1 : rule__EntityMockObjectFunctionParameter__Group__1__Impl ;
+    public final void rule__EntityMockObjectFunctionParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8589:1: ( rule__EntityMockObjectFunctionParameter__Group__1__Impl )
+            // InternalEntityMockDSL.g:8590:2: rule__EntityMockObjectFunctionParameter__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunctionParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__Group__1__Impl"
+    // InternalEntityMockDSL.g:8596:1: rule__EntityMockObjectFunctionParameter__Group__1__Impl : ( ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectFunctionParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8600:1: ( ( ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:8601:1: ( ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:8601:1: ( ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:8602:2: ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:8603:2: ( rule__EntityMockObjectFunctionParameter__NameAssignment_1 )
+            // InternalEntityMockDSL.g:8603:3: rule__EntityMockObjectFunctionParameter__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFunctionParameter__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__0"
+    // InternalEntityMockDSL.g:8612:1: rule__EntityMockObjectFill__Group__0 : rule__EntityMockObjectFill__Group__0__Impl rule__EntityMockObjectFill__Group__1 ;
+    public final void rule__EntityMockObjectFill__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8616:1: ( rule__EntityMockObjectFill__Group__0__Impl rule__EntityMockObjectFill__Group__1 )
+            // InternalEntityMockDSL.g:8617:2: rule__EntityMockObjectFill__Group__0__Impl rule__EntityMockObjectFill__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockObjectFill__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__0__Impl"
+    // InternalEntityMockDSL.g:8624:1: rule__EntityMockObjectFill__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockObjectFill__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8628:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:8629:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:8629:1: ( 'var' )
+            // InternalEntityMockDSL.g:8630:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__1"
+    // InternalEntityMockDSL.g:8639:1: rule__EntityMockObjectFill__Group__1 : rule__EntityMockObjectFill__Group__1__Impl rule__EntityMockObjectFill__Group__2 ;
+    public final void rule__EntityMockObjectFill__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8643:1: ( rule__EntityMockObjectFill__Group__1__Impl rule__EntityMockObjectFill__Group__2 )
+            // InternalEntityMockDSL.g:8644:2: rule__EntityMockObjectFill__Group__1__Impl rule__EntityMockObjectFill__Group__2
+            {
+            pushFollow(FOLLOW_51);
+            rule__EntityMockObjectFill__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__1__Impl"
+    // InternalEntityMockDSL.g:8651:1: rule__EntityMockObjectFill__Group__1__Impl : ( ( rule__EntityMockObjectFill__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockObjectFill__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8655:1: ( ( ( rule__EntityMockObjectFill__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:8656:1: ( ( rule__EntityMockObjectFill__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:8656:1: ( ( rule__EntityMockObjectFill__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:8657:2: ( rule__EntityMockObjectFill__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:8658:2: ( rule__EntityMockObjectFill__NameAssignment_1 )
+            // InternalEntityMockDSL.g:8658:3: rule__EntityMockObjectFill__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__2"
+    // InternalEntityMockDSL.g:8666:1: rule__EntityMockObjectFill__Group__2 : rule__EntityMockObjectFill__Group__2__Impl rule__EntityMockObjectFill__Group__3 ;
+    public final void rule__EntityMockObjectFill__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8670:1: ( rule__EntityMockObjectFill__Group__2__Impl rule__EntityMockObjectFill__Group__3 )
+            // InternalEntityMockDSL.g:8671:2: rule__EntityMockObjectFill__Group__2__Impl rule__EntityMockObjectFill__Group__3
+            {
+            pushFollow(FOLLOW_52);
+            rule__EntityMockObjectFill__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__2__Impl"
+    // InternalEntityMockDSL.g:8678:1: rule__EntityMockObjectFill__Group__2__Impl : ( 'randomize' ) ;
+    public final void rule__EntityMockObjectFill__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8682:1: ( ( 'randomize' ) )
+            // InternalEntityMockDSL.g:8683:1: ( 'randomize' )
+            {
+            // InternalEntityMockDSL.g:8683:1: ( 'randomize' )
+            // InternalEntityMockDSL.g:8684:2: 'randomize'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2()); 
+            }
+            match(input,82,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__3"
+    // InternalEntityMockDSL.g:8693:1: rule__EntityMockObjectFill__Group__3 : rule__EntityMockObjectFill__Group__3__Impl ;
+    public final void rule__EntityMockObjectFill__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8697:1: ( rule__EntityMockObjectFill__Group__3__Impl )
+            // InternalEntityMockDSL.g:8698:2: rule__EntityMockObjectFill__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__Group__3__Impl"
+    // InternalEntityMockDSL.g:8704:1: rule__EntityMockObjectFill__Group__3__Impl : ( ( rule__EntityMockObjectFill__FillerTypeAssignment_3 ) ) ;
+    public final void rule__EntityMockObjectFill__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8708:1: ( ( ( rule__EntityMockObjectFill__FillerTypeAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:8709:1: ( ( rule__EntityMockObjectFill__FillerTypeAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:8709:1: ( ( rule__EntityMockObjectFill__FillerTypeAssignment_3 ) )
+            // InternalEntityMockDSL.g:8710:2: ( rule__EntityMockObjectFill__FillerTypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getFillerTypeAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:8711:2: ( rule__EntityMockObjectFill__FillerTypeAssignment_3 )
+            // InternalEntityMockDSL.g:8711:3: rule__EntityMockObjectFill__FillerTypeAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockObjectFill__FillerTypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getFillerTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__0"
+    // InternalEntityMockDSL.g:8720:1: rule__PropertyFillerDateFuture__Group__0 : rule__PropertyFillerDateFuture__Group__0__Impl rule__PropertyFillerDateFuture__Group__1 ;
+    public final void rule__PropertyFillerDateFuture__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8724:1: ( rule__PropertyFillerDateFuture__Group__0__Impl rule__PropertyFillerDateFuture__Group__1 )
+            // InternalEntityMockDSL.g:8725:2: rule__PropertyFillerDateFuture__Group__0__Impl rule__PropertyFillerDateFuture__Group__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerDateFuture__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateFuture__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__0__Impl"
+    // InternalEntityMockDSL.g:8732:1: rule__PropertyFillerDateFuture__Group__0__Impl : ( 'future' ) ;
+    public final void rule__PropertyFillerDateFuture__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8736:1: ( ( 'future' ) )
+            // InternalEntityMockDSL.g:8737:1: ( 'future' )
+            {
+            // InternalEntityMockDSL.g:8737:1: ( 'future' )
+            // InternalEntityMockDSL.g:8738:2: 'future'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0()); 
+            }
+            match(input,83,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__1"
+    // InternalEntityMockDSL.g:8747:1: rule__PropertyFillerDateFuture__Group__1 : rule__PropertyFillerDateFuture__Group__1__Impl rule__PropertyFillerDateFuture__Group__2 ;
+    public final void rule__PropertyFillerDateFuture__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8751:1: ( rule__PropertyFillerDateFuture__Group__1__Impl rule__PropertyFillerDateFuture__Group__2 )
+            // InternalEntityMockDSL.g:8752:2: rule__PropertyFillerDateFuture__Group__1__Impl rule__PropertyFillerDateFuture__Group__2
+            {
+            pushFollow(FOLLOW_53);
+            rule__PropertyFillerDateFuture__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateFuture__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__1__Impl"
+    // InternalEntityMockDSL.g:8759:1: rule__PropertyFillerDateFuture__Group__1__Impl : ( ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 ) ) ;
+    public final void rule__PropertyFillerDateFuture__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8763:1: ( ( ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:8764:1: ( ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:8764:1: ( ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 ) )
+            // InternalEntityMockDSL.g:8765:2: ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:8766:2: ( rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 )
+            // InternalEntityMockDSL.g:8766:3: rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__2"
+    // InternalEntityMockDSL.g:8774:1: rule__PropertyFillerDateFuture__Group__2 : rule__PropertyFillerDateFuture__Group__2__Impl ;
+    public final void rule__PropertyFillerDateFuture__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8778:1: ( rule__PropertyFillerDateFuture__Group__2__Impl )
+            // InternalEntityMockDSL.g:8779:2: rule__PropertyFillerDateFuture__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateFuture__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__Group__2__Impl"
+    // InternalEntityMockDSL.g:8785:1: rule__PropertyFillerDateFuture__Group__2__Impl : ( 'years' ) ;
+    public final void rule__PropertyFillerDateFuture__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8789:1: ( ( 'years' ) )
+            // InternalEntityMockDSL.g:8790:1: ( 'years' )
+            {
+            // InternalEntityMockDSL.g:8790:1: ( 'years' )
+            // InternalEntityMockDSL.g:8791:2: 'years'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2()); 
+            }
+            match(input,55,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__0"
+    // InternalEntityMockDSL.g:8801:1: rule__PropertyFillerDatePast__Group__0 : rule__PropertyFillerDatePast__Group__0__Impl rule__PropertyFillerDatePast__Group__1 ;
+    public final void rule__PropertyFillerDatePast__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8805:1: ( rule__PropertyFillerDatePast__Group__0__Impl rule__PropertyFillerDatePast__Group__1 )
+            // InternalEntityMockDSL.g:8806:2: rule__PropertyFillerDatePast__Group__0__Impl rule__PropertyFillerDatePast__Group__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerDatePast__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDatePast__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__0__Impl"
+    // InternalEntityMockDSL.g:8813:1: rule__PropertyFillerDatePast__Group__0__Impl : ( 'past' ) ;
+    public final void rule__PropertyFillerDatePast__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8817:1: ( ( 'past' ) )
+            // InternalEntityMockDSL.g:8818:1: ( 'past' )
+            {
+            // InternalEntityMockDSL.g:8818:1: ( 'past' )
+            // InternalEntityMockDSL.g:8819:2: 'past'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0()); 
+            }
+            match(input,84,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__1"
+    // InternalEntityMockDSL.g:8828:1: rule__PropertyFillerDatePast__Group__1 : rule__PropertyFillerDatePast__Group__1__Impl rule__PropertyFillerDatePast__Group__2 ;
+    public final void rule__PropertyFillerDatePast__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8832:1: ( rule__PropertyFillerDatePast__Group__1__Impl rule__PropertyFillerDatePast__Group__2 )
+            // InternalEntityMockDSL.g:8833:2: rule__PropertyFillerDatePast__Group__1__Impl rule__PropertyFillerDatePast__Group__2
+            {
+            pushFollow(FOLLOW_53);
+            rule__PropertyFillerDatePast__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDatePast__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__1__Impl"
+    // InternalEntityMockDSL.g:8840:1: rule__PropertyFillerDatePast__Group__1__Impl : ( ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 ) ) ;
+    public final void rule__PropertyFillerDatePast__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8844:1: ( ( ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:8845:1: ( ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:8845:1: ( ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 ) )
+            // InternalEntityMockDSL.g:8846:2: ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:8847:2: ( rule__PropertyFillerDatePast__DatePastYearsAssignment_1 )
+            // InternalEntityMockDSL.g:8847:3: rule__PropertyFillerDatePast__DatePastYearsAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDatePast__DatePastYearsAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__2"
+    // InternalEntityMockDSL.g:8855:1: rule__PropertyFillerDatePast__Group__2 : rule__PropertyFillerDatePast__Group__2__Impl ;
+    public final void rule__PropertyFillerDatePast__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8859:1: ( rule__PropertyFillerDatePast__Group__2__Impl )
+            // InternalEntityMockDSL.g:8860:2: rule__PropertyFillerDatePast__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDatePast__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__Group__2__Impl"
+    // InternalEntityMockDSL.g:8866:1: rule__PropertyFillerDatePast__Group__2__Impl : ( 'years' ) ;
+    public final void rule__PropertyFillerDatePast__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8870:1: ( ( 'years' ) )
+            // InternalEntityMockDSL.g:8871:1: ( 'years' )
+            {
+            // InternalEntityMockDSL.g:8871:1: ( 'years' )
+            // InternalEntityMockDSL.g:8872:2: 'years'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2()); 
+            }
+            match(input,55,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerBoolean__Group__0"
+    // InternalEntityMockDSL.g:8882:1: rule__PropertyFillerBoolean__Group__0 : rule__PropertyFillerBoolean__Group__0__Impl rule__PropertyFillerBoolean__Group__1 ;
+    public final void rule__PropertyFillerBoolean__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8886:1: ( rule__PropertyFillerBoolean__Group__0__Impl rule__PropertyFillerBoolean__Group__1 )
+            // InternalEntityMockDSL.g:8887:2: rule__PropertyFillerBoolean__Group__0__Impl rule__PropertyFillerBoolean__Group__1
+            {
+            pushFollow(FOLLOW_54);
+            rule__PropertyFillerBoolean__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerBoolean__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerBoolean__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerBoolean__Group__0__Impl"
+    // InternalEntityMockDSL.g:8894:1: rule__PropertyFillerBoolean__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerBoolean__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8898:1: ( ( () ) )
+            // InternalEntityMockDSL.g:8899:1: ( () )
+            {
+            // InternalEntityMockDSL.g:8899:1: ( () )
+            // InternalEntityMockDSL.g:8900:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0()); 
+            }
+            // InternalEntityMockDSL.g:8901:2: ()
+            // InternalEntityMockDSL.g:8901:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerBoolean__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerBoolean__Group__1"
+    // InternalEntityMockDSL.g:8909:1: rule__PropertyFillerBoolean__Group__1 : rule__PropertyFillerBoolean__Group__1__Impl ;
+    public final void rule__PropertyFillerBoolean__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8913:1: ( rule__PropertyFillerBoolean__Group__1__Impl )
+            // InternalEntityMockDSL.g:8914:2: rule__PropertyFillerBoolean__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerBoolean__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerBoolean__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerBoolean__Group__1__Impl"
+    // InternalEntityMockDSL.g:8920:1: rule__PropertyFillerBoolean__Group__1__Impl : ( 'boolean' ) ;
+    public final void rule__PropertyFillerBoolean__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8924:1: ( ( 'boolean' ) )
+            // InternalEntityMockDSL.g:8925:1: ( 'boolean' )
+            {
+            // InternalEntityMockDSL.g:8925:1: ( 'boolean' )
+            // InternalEntityMockDSL.g:8926:2: 'boolean'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1()); 
+            }
+            match(input,85,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerBoolean__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__0"
+    // InternalEntityMockDSL.g:8936:1: rule__PropertyFillerDateRange__Group__0 : rule__PropertyFillerDateRange__Group__0__Impl rule__PropertyFillerDateRange__Group__1 ;
+    public final void rule__PropertyFillerDateRange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8940:1: ( rule__PropertyFillerDateRange__Group__0__Impl rule__PropertyFillerDateRange__Group__1 )
+            // InternalEntityMockDSL.g:8941:2: rule__PropertyFillerDateRange__Group__0__Impl rule__PropertyFillerDateRange__Group__1
+            {
+            pushFollow(FOLLOW_55);
+            rule__PropertyFillerDateRange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__0__Impl"
+    // InternalEntityMockDSL.g:8948:1: rule__PropertyFillerDateRange__Group__0__Impl : ( 'dateRange' ) ;
+    public final void rule__PropertyFillerDateRange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8952:1: ( ( 'dateRange' ) )
+            // InternalEntityMockDSL.g:8953:1: ( 'dateRange' )
+            {
+            // InternalEntityMockDSL.g:8953:1: ( 'dateRange' )
+            // InternalEntityMockDSL.g:8954:2: 'dateRange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0()); 
+            }
+            match(input,86,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__1"
+    // InternalEntityMockDSL.g:8963:1: rule__PropertyFillerDateRange__Group__1 : rule__PropertyFillerDateRange__Group__1__Impl rule__PropertyFillerDateRange__Group__2 ;
+    public final void rule__PropertyFillerDateRange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8967:1: ( rule__PropertyFillerDateRange__Group__1__Impl rule__PropertyFillerDateRange__Group__2 )
+            // InternalEntityMockDSL.g:8968:2: rule__PropertyFillerDateRange__Group__1__Impl rule__PropertyFillerDateRange__Group__2
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerDateRange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__1__Impl"
+    // InternalEntityMockDSL.g:8975:1: rule__PropertyFillerDateRange__Group__1__Impl : ( 'from' ) ;
+    public final void rule__PropertyFillerDateRange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8979:1: ( ( 'from' ) )
+            // InternalEntityMockDSL.g:8980:1: ( 'from' )
+            {
+            // InternalEntityMockDSL.g:8980:1: ( 'from' )
+            // InternalEntityMockDSL.g:8981:2: 'from'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1()); 
+            }
+            match(input,87,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__2"
+    // InternalEntityMockDSL.g:8990:1: rule__PropertyFillerDateRange__Group__2 : rule__PropertyFillerDateRange__Group__2__Impl rule__PropertyFillerDateRange__Group__3 ;
+    public final void rule__PropertyFillerDateRange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:8994:1: ( rule__PropertyFillerDateRange__Group__2__Impl rule__PropertyFillerDateRange__Group__3 )
+            // InternalEntityMockDSL.g:8995:2: rule__PropertyFillerDateRange__Group__2__Impl rule__PropertyFillerDateRange__Group__3
+            {
+            pushFollow(FOLLOW_57);
+            rule__PropertyFillerDateRange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__2__Impl"
+    // InternalEntityMockDSL.g:9002:1: rule__PropertyFillerDateRange__Group__2__Impl : ( ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 ) ) ;
+    public final void rule__PropertyFillerDateRange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9006:1: ( ( ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:9007:1: ( ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:9007:1: ( ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 ) )
+            // InternalEntityMockDSL.g:9008:2: ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9009:2: ( rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 )
+            // InternalEntityMockDSL.g:9009:3: rule__PropertyFillerDateRange__DateBeginYearsAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__DateBeginYearsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__3"
+    // InternalEntityMockDSL.g:9017:1: rule__PropertyFillerDateRange__Group__3 : rule__PropertyFillerDateRange__Group__3__Impl rule__PropertyFillerDateRange__Group__4 ;
+    public final void rule__PropertyFillerDateRange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9021:1: ( rule__PropertyFillerDateRange__Group__3__Impl rule__PropertyFillerDateRange__Group__4 )
+            // InternalEntityMockDSL.g:9022:2: rule__PropertyFillerDateRange__Group__3__Impl rule__PropertyFillerDateRange__Group__4
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerDateRange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__3__Impl"
+    // InternalEntityMockDSL.g:9029:1: rule__PropertyFillerDateRange__Group__3__Impl : ( 'until' ) ;
+    public final void rule__PropertyFillerDateRange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9033:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:9034:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:9034:1: ( 'until' )
+            // InternalEntityMockDSL.g:9035:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__4"
+    // InternalEntityMockDSL.g:9044:1: rule__PropertyFillerDateRange__Group__4 : rule__PropertyFillerDateRange__Group__4__Impl rule__PropertyFillerDateRange__Group__5 ;
+    public final void rule__PropertyFillerDateRange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9048:1: ( rule__PropertyFillerDateRange__Group__4__Impl rule__PropertyFillerDateRange__Group__5 )
+            // InternalEntityMockDSL.g:9049:2: rule__PropertyFillerDateRange__Group__4__Impl rule__PropertyFillerDateRange__Group__5
+            {
+            pushFollow(FOLLOW_53);
+            rule__PropertyFillerDateRange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__4"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__4__Impl"
+    // InternalEntityMockDSL.g:9056:1: rule__PropertyFillerDateRange__Group__4__Impl : ( ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 ) ) ;
+    public final void rule__PropertyFillerDateRange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9060:1: ( ( ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:9061:1: ( ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:9061:1: ( ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 ) )
+            // InternalEntityMockDSL.g:9062:2: ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:9063:2: ( rule__PropertyFillerDateRange__DateEndYearsAssignment_4 )
+            // InternalEntityMockDSL.g:9063:3: rule__PropertyFillerDateRange__DateEndYearsAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__DateEndYearsAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__5"
+    // InternalEntityMockDSL.g:9071:1: rule__PropertyFillerDateRange__Group__5 : rule__PropertyFillerDateRange__Group__5__Impl ;
+    public final void rule__PropertyFillerDateRange__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9075:1: ( rule__PropertyFillerDateRange__Group__5__Impl )
+            // InternalEntityMockDSL.g:9076:2: rule__PropertyFillerDateRange__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerDateRange__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__5"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__Group__5__Impl"
+    // InternalEntityMockDSL.g:9082:1: rule__PropertyFillerDateRange__Group__5__Impl : ( 'years' ) ;
+    public final void rule__PropertyFillerDateRange__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9086:1: ( ( 'years' ) )
+            // InternalEntityMockDSL.g:9087:1: ( 'years' )
+            {
+            // InternalEntityMockDSL.g:9087:1: ( 'years' )
+            // InternalEntityMockDSL.g:9088:2: 'years'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5()); 
+            }
+            match(input,55,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__0"
+    // InternalEntityMockDSL.g:9098:1: rule__PropertyFillerSignedDoubleRange__Group__0 : rule__PropertyFillerSignedDoubleRange__Group__0__Impl rule__PropertyFillerSignedDoubleRange__Group__1 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9102:1: ( rule__PropertyFillerSignedDoubleRange__Group__0__Impl rule__PropertyFillerSignedDoubleRange__Group__1 )
+            // InternalEntityMockDSL.g:9103:2: rule__PropertyFillerSignedDoubleRange__Group__0__Impl rule__PropertyFillerSignedDoubleRange__Group__1
+            {
+            pushFollow(FOLLOW_55);
+            rule__PropertyFillerSignedDoubleRange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__0__Impl"
+    // InternalEntityMockDSL.g:9110:1: rule__PropertyFillerSignedDoubleRange__Group__0__Impl : ( 'numberRange' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9114:1: ( ( 'numberRange' ) )
+            // InternalEntityMockDSL.g:9115:1: ( 'numberRange' )
+            {
+            // InternalEntityMockDSL.g:9115:1: ( 'numberRange' )
+            // InternalEntityMockDSL.g:9116:2: 'numberRange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0()); 
+            }
+            match(input,89,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__1"
+    // InternalEntityMockDSL.g:9125:1: rule__PropertyFillerSignedDoubleRange__Group__1 : rule__PropertyFillerSignedDoubleRange__Group__1__Impl rule__PropertyFillerSignedDoubleRange__Group__2 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9129:1: ( rule__PropertyFillerSignedDoubleRange__Group__1__Impl rule__PropertyFillerSignedDoubleRange__Group__2 )
+            // InternalEntityMockDSL.g:9130:2: rule__PropertyFillerSignedDoubleRange__Group__1__Impl rule__PropertyFillerSignedDoubleRange__Group__2
+            {
+            pushFollow(FOLLOW_58);
+            rule__PropertyFillerSignedDoubleRange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__1__Impl"
+    // InternalEntityMockDSL.g:9137:1: rule__PropertyFillerSignedDoubleRange__Group__1__Impl : ( 'from' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9141:1: ( ( 'from' ) )
+            // InternalEntityMockDSL.g:9142:1: ( 'from' )
+            {
+            // InternalEntityMockDSL.g:9142:1: ( 'from' )
+            // InternalEntityMockDSL.g:9143:2: 'from'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1()); 
+            }
+            match(input,87,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__2"
+    // InternalEntityMockDSL.g:9152:1: rule__PropertyFillerSignedDoubleRange__Group__2 : rule__PropertyFillerSignedDoubleRange__Group__2__Impl rule__PropertyFillerSignedDoubleRange__Group__3 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9156:1: ( rule__PropertyFillerSignedDoubleRange__Group__2__Impl rule__PropertyFillerSignedDoubleRange__Group__3 )
+            // InternalEntityMockDSL.g:9157:2: rule__PropertyFillerSignedDoubleRange__Group__2__Impl rule__PropertyFillerSignedDoubleRange__Group__3
+            {
+            pushFollow(FOLLOW_58);
+            rule__PropertyFillerSignedDoubleRange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__2__Impl"
+    // InternalEntityMockDSL.g:9164:1: rule__PropertyFillerSignedDoubleRange__Group__2__Impl : ( ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )? ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9168:1: ( ( ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )? ) )
+            // InternalEntityMockDSL.g:9169:1: ( ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )? )
+            {
+            // InternalEntityMockDSL.g:9169:1: ( ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )? )
+            // InternalEntityMockDSL.g:9170:2: ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:9171:2: ( rule__PropertyFillerSignedDoubleRange__Group_2__0 )?
+            int alt91=2;
+            int LA91_0 = input.LA(1);
+
+            if ( (LA91_0==RULE_ID||LA91_0==RULE_INT||LA91_0==36||LA91_0==88) ) {
+                alt91=1;
+            }
+            switch (alt91) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9171:3: rule__PropertyFillerSignedDoubleRange__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__3"
+    // InternalEntityMockDSL.g:9179:1: rule__PropertyFillerSignedDoubleRange__Group__3 : rule__PropertyFillerSignedDoubleRange__Group__3__Impl rule__PropertyFillerSignedDoubleRange__Group__4 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9183:1: ( rule__PropertyFillerSignedDoubleRange__Group__3__Impl rule__PropertyFillerSignedDoubleRange__Group__4 )
+            // InternalEntityMockDSL.g:9184:2: rule__PropertyFillerSignedDoubleRange__Group__3__Impl rule__PropertyFillerSignedDoubleRange__Group__4
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerSignedDoubleRange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__3__Impl"
+    // InternalEntityMockDSL.g:9191:1: rule__PropertyFillerSignedDoubleRange__Group__3__Impl : ( 'with' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9195:1: ( ( 'with' ) )
+            // InternalEntityMockDSL.g:9196:1: ( 'with' )
+            {
+            // InternalEntityMockDSL.g:9196:1: ( 'with' )
+            // InternalEntityMockDSL.g:9197:2: 'with'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__4"
+    // InternalEntityMockDSL.g:9206:1: rule__PropertyFillerSignedDoubleRange__Group__4 : rule__PropertyFillerSignedDoubleRange__Group__4__Impl rule__PropertyFillerSignedDoubleRange__Group__5 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9210:1: ( rule__PropertyFillerSignedDoubleRange__Group__4__Impl rule__PropertyFillerSignedDoubleRange__Group__5 )
+            // InternalEntityMockDSL.g:9211:2: rule__PropertyFillerSignedDoubleRange__Group__4__Impl rule__PropertyFillerSignedDoubleRange__Group__5
+            {
+            pushFollow(FOLLOW_59);
+            rule__PropertyFillerSignedDoubleRange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__4"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__4__Impl"
+    // InternalEntityMockDSL.g:9218:1: rule__PropertyFillerSignedDoubleRange__Group__4__Impl : ( ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9222:1: ( ( ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:9223:1: ( ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:9223:1: ( ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 ) )
+            // InternalEntityMockDSL.g:9224:2: ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:9225:2: ( rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 )
+            // InternalEntityMockDSL.g:9225:3: rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__5"
+    // InternalEntityMockDSL.g:9233:1: rule__PropertyFillerSignedDoubleRange__Group__5 : rule__PropertyFillerSignedDoubleRange__Group__5__Impl rule__PropertyFillerSignedDoubleRange__Group__6 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9237:1: ( rule__PropertyFillerSignedDoubleRange__Group__5__Impl rule__PropertyFillerSignedDoubleRange__Group__6 )
+            // InternalEntityMockDSL.g:9238:2: rule__PropertyFillerSignedDoubleRange__Group__5__Impl rule__PropertyFillerSignedDoubleRange__Group__6
+            {
+            pushFollow(FOLLOW_60);
+            rule__PropertyFillerSignedDoubleRange__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__5"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__5__Impl"
+    // InternalEntityMockDSL.g:9245:1: rule__PropertyFillerSignedDoubleRange__Group__5__Impl : ( 'decimals' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9249:1: ( ( 'decimals' ) )
+            // InternalEntityMockDSL.g:9250:1: ( 'decimals' )
+            {
+            // InternalEntityMockDSL.g:9250:1: ( 'decimals' )
+            // InternalEntityMockDSL.g:9251:2: 'decimals'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5()); 
+            }
+            match(input,90,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__6"
+    // InternalEntityMockDSL.g:9260:1: rule__PropertyFillerSignedDoubleRange__Group__6 : rule__PropertyFillerSignedDoubleRange__Group__6__Impl ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9264:1: ( rule__PropertyFillerSignedDoubleRange__Group__6__Impl )
+            // InternalEntityMockDSL.g:9265:2: rule__PropertyFillerSignedDoubleRange__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__6"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group__6__Impl"
+    // InternalEntityMockDSL.g:9271:1: rule__PropertyFillerSignedDoubleRange__Group__6__Impl : ( ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )? ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9275:1: ( ( ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )? ) )
+            // InternalEntityMockDSL.g:9276:1: ( ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )? )
+            {
+            // InternalEntityMockDSL.g:9276:1: ( ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )? )
+            // InternalEntityMockDSL.g:9277:2: ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_6()); 
+            }
+            // InternalEntityMockDSL.g:9278:2: ( rule__PropertyFillerSignedDoubleRange__Group_6__0 )?
+            int alt92=2;
+            int LA92_0 = input.LA(1);
+
+            if ( (LA92_0==91) ) {
+                alt92=1;
+            }
+            switch (alt92) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9278:3: rule__PropertyFillerSignedDoubleRange__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group__6__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__0"
+    // InternalEntityMockDSL.g:9287:1: rule__PropertyFillerSignedDoubleRange__Group_2__0 : rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl rule__PropertyFillerSignedDoubleRange__Group_2__1 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9291:1: ( rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl rule__PropertyFillerSignedDoubleRange__Group_2__1 )
+            // InternalEntityMockDSL.g:9292:2: rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl rule__PropertyFillerSignedDoubleRange__Group_2__1
+            {
+            pushFollow(FOLLOW_61);
+            rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:9299:1: rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl : ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )? ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9303:1: ( ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )? ) )
+            // InternalEntityMockDSL.g:9304:1: ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )? )
+            {
+            // InternalEntityMockDSL.g:9304:1: ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )? )
+            // InternalEntityMockDSL.g:9305:2: ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_0()); 
+            }
+            // InternalEntityMockDSL.g:9306:2: ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_0 )?
+            int alt93=2;
+            int LA93_0 = input.LA(1);
+
+            if ( (LA93_0==RULE_ID||LA93_0==RULE_INT||LA93_0==36) ) {
+                alt93=1;
+            }
+            switch (alt93) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9306:3: rule__PropertyFillerSignedDoubleRange__Alternatives_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedDoubleRange__Alternatives_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__1"
+    // InternalEntityMockDSL.g:9314:1: rule__PropertyFillerSignedDoubleRange__Group_2__1 : rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl rule__PropertyFillerSignedDoubleRange__Group_2__2 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9318:1: ( rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl rule__PropertyFillerSignedDoubleRange__Group_2__2 )
+            // InternalEntityMockDSL.g:9319:2: rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl rule__PropertyFillerSignedDoubleRange__Group_2__2
+            {
+            pushFollow(FOLLOW_62);
+            rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:9326:1: rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl : ( 'until' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9330:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:9331:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:9331:1: ( 'until' )
+            // InternalEntityMockDSL.g:9332:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__2"
+    // InternalEntityMockDSL.g:9341:1: rule__PropertyFillerSignedDoubleRange__Group_2__2 : rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9345:1: ( rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl )
+            // InternalEntityMockDSL.g:9346:2: rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl"
+    // InternalEntityMockDSL.g:9352:1: rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl : ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9356:1: ( ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 ) ) )
+            // InternalEntityMockDSL.g:9357:1: ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 ) )
+            {
+            // InternalEntityMockDSL.g:9357:1: ( ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 ) )
+            // InternalEntityMockDSL.g:9358:2: ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_2()); 
+            }
+            // InternalEntityMockDSL.g:9359:2: ( rule__PropertyFillerSignedDoubleRange__Alternatives_2_2 )
+            // InternalEntityMockDSL.g:9359:3: rule__PropertyFillerSignedDoubleRange__Alternatives_2_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Alternatives_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getAlternatives_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_6__0"
+    // InternalEntityMockDSL.g:9368:1: rule__PropertyFillerSignedDoubleRange__Group_6__0 : rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl rule__PropertyFillerSignedDoubleRange__Group_6__1 ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9372:1: ( rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl rule__PropertyFillerSignedDoubleRange__Group_6__1 )
+            // InternalEntityMockDSL.g:9373:2: rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl rule__PropertyFillerSignedDoubleRange__Group_6__1
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_6__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:9380:1: rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl : ( 'roundTo' ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9384:1: ( ( 'roundTo' ) )
+            // InternalEntityMockDSL.g:9385:1: ( 'roundTo' )
+            {
+            // InternalEntityMockDSL.g:9385:1: ( 'roundTo' )
+            // InternalEntityMockDSL.g:9386:2: 'roundTo'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0()); 
+            }
+            match(input,91,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_6__1"
+    // InternalEntityMockDSL.g:9395:1: rule__PropertyFillerSignedDoubleRange__Group_6__1 : rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9399:1: ( rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl )
+            // InternalEntityMockDSL.g:9400:2: rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_6__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:9406:1: rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl : ( ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9410:1: ( ( ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 ) ) )
+            // InternalEntityMockDSL.g:9411:1: ( ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 ) )
+            {
+            // InternalEntityMockDSL.g:9411:1: ( ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 ) )
+            // InternalEntityMockDSL.g:9412:2: ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedAssignment_6_1()); 
+            }
+            // InternalEntityMockDSL.g:9413:2: ( rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 )
+            // InternalEntityMockDSL.g:9413:3: rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__0"
+    // InternalEntityMockDSL.g:9422:1: rule__PropertyFillerSignedDoubleRandom__Group__0 : rule__PropertyFillerSignedDoubleRandom__Group__0__Impl rule__PropertyFillerSignedDoubleRandom__Group__1 ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9426:1: ( rule__PropertyFillerSignedDoubleRandom__Group__0__Impl rule__PropertyFillerSignedDoubleRandom__Group__1 )
+            // InternalEntityMockDSL.g:9427:2: rule__PropertyFillerSignedDoubleRandom__Group__0__Impl rule__PropertyFillerSignedDoubleRandom__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyFillerSignedDoubleRandom__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRandom__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__0__Impl"
+    // InternalEntityMockDSL.g:9434:1: rule__PropertyFillerSignedDoubleRandom__Group__0__Impl : ( 'numberPick' ) ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9438:1: ( ( 'numberPick' ) )
+            // InternalEntityMockDSL.g:9439:1: ( 'numberPick' )
+            {
+            // InternalEntityMockDSL.g:9439:1: ( 'numberPick' )
+            // InternalEntityMockDSL.g:9440:2: 'numberPick'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0()); 
+            }
+            match(input,92,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__1"
+    // InternalEntityMockDSL.g:9449:1: rule__PropertyFillerSignedDoubleRandom__Group__1 : rule__PropertyFillerSignedDoubleRandom__Group__1__Impl rule__PropertyFillerSignedDoubleRandom__Group__2 ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9453:1: ( rule__PropertyFillerSignedDoubleRandom__Group__1__Impl rule__PropertyFillerSignedDoubleRandom__Group__2 )
+            // InternalEntityMockDSL.g:9454:2: rule__PropertyFillerSignedDoubleRandom__Group__1__Impl rule__PropertyFillerSignedDoubleRandom__Group__2
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerSignedDoubleRandom__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRandom__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__1__Impl"
+    // InternalEntityMockDSL.g:9461:1: rule__PropertyFillerSignedDoubleRandom__Group__1__Impl : ( '(' ) ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9465:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:9466:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:9466:1: ( '(' )
+            // InternalEntityMockDSL.g:9467:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__2"
+    // InternalEntityMockDSL.g:9476:1: rule__PropertyFillerSignedDoubleRandom__Group__2 : rule__PropertyFillerSignedDoubleRandom__Group__2__Impl rule__PropertyFillerSignedDoubleRandom__Group__3 ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9480:1: ( rule__PropertyFillerSignedDoubleRandom__Group__2__Impl rule__PropertyFillerSignedDoubleRandom__Group__3 )
+            // InternalEntityMockDSL.g:9481:2: rule__PropertyFillerSignedDoubleRandom__Group__2__Impl rule__PropertyFillerSignedDoubleRandom__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__PropertyFillerSignedDoubleRandom__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRandom__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__2__Impl"
+    // InternalEntityMockDSL.g:9488:1: rule__PropertyFillerSignedDoubleRandom__Group__2__Impl : ( ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9492:1: ( ( ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* ) ) )
+            // InternalEntityMockDSL.g:9493:1: ( ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* ) )
+            {
+            // InternalEntityMockDSL.g:9493:1: ( ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* ) )
+            // InternalEntityMockDSL.g:9494:2: ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* )
+            {
+            // InternalEntityMockDSL.g:9494:2: ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 ) )
+            // InternalEntityMockDSL.g:9495:3: ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9496:3: ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )
+            // InternalEntityMockDSL.g:9496:4: rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2
+            {
+            pushFollow(FOLLOW_64);
+            rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:9499:2: ( ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )* )
+            // InternalEntityMockDSL.g:9500:3: ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9501:3: ( rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 )*
+            loop94:
+            do {
+                int alt94=2;
+                int LA94_0 = input.LA(1);
+
+                if ( (LA94_0==RULE_INT||LA94_0==36) ) {
+                    alt94=1;
+                }
+
+
+                switch (alt94) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:9501:4: rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2
+            	    {
+            	    pushFollow(FOLLOW_64);
+            	    rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop94;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__3"
+    // InternalEntityMockDSL.g:9510:1: rule__PropertyFillerSignedDoubleRandom__Group__3 : rule__PropertyFillerSignedDoubleRandom__Group__3__Impl ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9514:1: ( rule__PropertyFillerSignedDoubleRandom__Group__3__Impl )
+            // InternalEntityMockDSL.g:9515:2: rule__PropertyFillerSignedDoubleRandom__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedDoubleRandom__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__Group__3__Impl"
+    // InternalEntityMockDSL.g:9521:1: rule__PropertyFillerSignedDoubleRandom__Group__3__Impl : ( ')' ) ;
+    public final void rule__PropertyFillerSignedDoubleRandom__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9525:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:9526:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:9526:1: ( ')' )
+            // InternalEntityMockDSL.g:9527:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__0"
+    // InternalEntityMockDSL.g:9537:1: rule__PropertyFillerSignedIntegerRange__Group__0 : rule__PropertyFillerSignedIntegerRange__Group__0__Impl rule__PropertyFillerSignedIntegerRange__Group__1 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9541:1: ( rule__PropertyFillerSignedIntegerRange__Group__0__Impl rule__PropertyFillerSignedIntegerRange__Group__1 )
+            // InternalEntityMockDSL.g:9542:2: rule__PropertyFillerSignedIntegerRange__Group__0__Impl rule__PropertyFillerSignedIntegerRange__Group__1
+            {
+            pushFollow(FOLLOW_65);
+            rule__PropertyFillerSignedIntegerRange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__0__Impl"
+    // InternalEntityMockDSL.g:9549:1: rule__PropertyFillerSignedIntegerRange__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9553:1: ( ( () ) )
+            // InternalEntityMockDSL.g:9554:1: ( () )
+            {
+            // InternalEntityMockDSL.g:9554:1: ( () )
+            // InternalEntityMockDSL.g:9555:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:9556:2: ()
+            // InternalEntityMockDSL.g:9556:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__1"
+    // InternalEntityMockDSL.g:9564:1: rule__PropertyFillerSignedIntegerRange__Group__1 : rule__PropertyFillerSignedIntegerRange__Group__1__Impl rule__PropertyFillerSignedIntegerRange__Group__2 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9568:1: ( rule__PropertyFillerSignedIntegerRange__Group__1__Impl rule__PropertyFillerSignedIntegerRange__Group__2 )
+            // InternalEntityMockDSL.g:9569:2: rule__PropertyFillerSignedIntegerRange__Group__1__Impl rule__PropertyFillerSignedIntegerRange__Group__2
+            {
+            pushFollow(FOLLOW_55);
+            rule__PropertyFillerSignedIntegerRange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__1__Impl"
+    // InternalEntityMockDSL.g:9576:1: rule__PropertyFillerSignedIntegerRange__Group__1__Impl : ( 'integerRange' ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9580:1: ( ( 'integerRange' ) )
+            // InternalEntityMockDSL.g:9581:1: ( 'integerRange' )
+            {
+            // InternalEntityMockDSL.g:9581:1: ( 'integerRange' )
+            // InternalEntityMockDSL.g:9582:2: 'integerRange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1()); 
+            }
+            match(input,93,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__2"
+    // InternalEntityMockDSL.g:9591:1: rule__PropertyFillerSignedIntegerRange__Group__2 : rule__PropertyFillerSignedIntegerRange__Group__2__Impl rule__PropertyFillerSignedIntegerRange__Group__3 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9595:1: ( rule__PropertyFillerSignedIntegerRange__Group__2__Impl rule__PropertyFillerSignedIntegerRange__Group__3 )
+            // InternalEntityMockDSL.g:9596:2: rule__PropertyFillerSignedIntegerRange__Group__2__Impl rule__PropertyFillerSignedIntegerRange__Group__3
+            {
+            pushFollow(FOLLOW_66);
+            rule__PropertyFillerSignedIntegerRange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__2__Impl"
+    // InternalEntityMockDSL.g:9603:1: rule__PropertyFillerSignedIntegerRange__Group__2__Impl : ( 'from' ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9607:1: ( ( 'from' ) )
+            // InternalEntityMockDSL.g:9608:1: ( 'from' )
+            {
+            // InternalEntityMockDSL.g:9608:1: ( 'from' )
+            // InternalEntityMockDSL.g:9609:2: 'from'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2()); 
+            }
+            match(input,87,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__3"
+    // InternalEntityMockDSL.g:9618:1: rule__PropertyFillerSignedIntegerRange__Group__3 : rule__PropertyFillerSignedIntegerRange__Group__3__Impl rule__PropertyFillerSignedIntegerRange__Group__4 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9622:1: ( rule__PropertyFillerSignedIntegerRange__Group__3__Impl rule__PropertyFillerSignedIntegerRange__Group__4 )
+            // InternalEntityMockDSL.g:9623:2: rule__PropertyFillerSignedIntegerRange__Group__3__Impl rule__PropertyFillerSignedIntegerRange__Group__4
+            {
+            pushFollow(FOLLOW_66);
+            rule__PropertyFillerSignedIntegerRange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__3__Impl"
+    // InternalEntityMockDSL.g:9630:1: rule__PropertyFillerSignedIntegerRange__Group__3__Impl : ( ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )? ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9634:1: ( ( ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:9635:1: ( ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:9635:1: ( ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )? )
+            // InternalEntityMockDSL.g:9636:2: ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:9637:2: ( rule__PropertyFillerSignedIntegerRange__Group_3__0 )?
+            int alt95=2;
+            int LA95_0 = input.LA(1);
+
+            if ( (LA95_0==RULE_ID||LA95_0==RULE_INT||LA95_0==36||LA95_0==88) ) {
+                alt95=1;
+            }
+            switch (alt95) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9637:3: rule__PropertyFillerSignedIntegerRange__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__4"
+    // InternalEntityMockDSL.g:9645:1: rule__PropertyFillerSignedIntegerRange__Group__4 : rule__PropertyFillerSignedIntegerRange__Group__4__Impl ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9649:1: ( rule__PropertyFillerSignedIntegerRange__Group__4__Impl )
+            // InternalEntityMockDSL.g:9650:2: rule__PropertyFillerSignedIntegerRange__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__4"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group__4__Impl"
+    // InternalEntityMockDSL.g:9656:1: rule__PropertyFillerSignedIntegerRange__Group__4__Impl : ( ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )? ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9660:1: ( ( ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:9661:1: ( ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:9661:1: ( ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )? )
+            // InternalEntityMockDSL.g:9662:2: ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:9663:2: ( rule__PropertyFillerSignedIntegerRange__Group_4__0 )?
+            int alt96=2;
+            int LA96_0 = input.LA(1);
+
+            if ( (LA96_0==91) ) {
+                alt96=1;
+            }
+            switch (alt96) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9663:3: rule__PropertyFillerSignedIntegerRange__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__0"
+    // InternalEntityMockDSL.g:9672:1: rule__PropertyFillerSignedIntegerRange__Group_3__0 : rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl rule__PropertyFillerSignedIntegerRange__Group_3__1 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9676:1: ( rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl rule__PropertyFillerSignedIntegerRange__Group_3__1 )
+            // InternalEntityMockDSL.g:9677:2: rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl rule__PropertyFillerSignedIntegerRange__Group_3__1
+            {
+            pushFollow(FOLLOW_61);
+            rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:9684:1: rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl : ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )? ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9688:1: ( ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )? ) )
+            // InternalEntityMockDSL.g:9689:1: ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )? )
+            {
+            // InternalEntityMockDSL.g:9689:1: ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )? )
+            // InternalEntityMockDSL.g:9690:2: ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_0()); 
+            }
+            // InternalEntityMockDSL.g:9691:2: ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_0 )?
+            int alt97=2;
+            int LA97_0 = input.LA(1);
+
+            if ( (LA97_0==RULE_ID||LA97_0==RULE_INT||LA97_0==36) ) {
+                alt97=1;
+            }
+            switch (alt97) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9691:3: rule__PropertyFillerSignedIntegerRange__Alternatives_3_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerSignedIntegerRange__Alternatives_3_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__1"
+    // InternalEntityMockDSL.g:9699:1: rule__PropertyFillerSignedIntegerRange__Group_3__1 : rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl rule__PropertyFillerSignedIntegerRange__Group_3__2 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9703:1: ( rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl rule__PropertyFillerSignedIntegerRange__Group_3__2 )
+            // InternalEntityMockDSL.g:9704:2: rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl rule__PropertyFillerSignedIntegerRange__Group_3__2
+            {
+            pushFollow(FOLLOW_62);
+            rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:9711:1: rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl : ( 'until' ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9715:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:9716:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:9716:1: ( 'until' )
+            // InternalEntityMockDSL.g:9717:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__2"
+    // InternalEntityMockDSL.g:9726:1: rule__PropertyFillerSignedIntegerRange__Group_3__2 : rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9730:1: ( rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl )
+            // InternalEntityMockDSL.g:9731:2: rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:9737:1: rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl : ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 ) ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9741:1: ( ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 ) ) )
+            // InternalEntityMockDSL.g:9742:1: ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 ) )
+            {
+            // InternalEntityMockDSL.g:9742:1: ( ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 ) )
+            // InternalEntityMockDSL.g:9743:2: ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_2()); 
+            }
+            // InternalEntityMockDSL.g:9744:2: ( rule__PropertyFillerSignedIntegerRange__Alternatives_3_2 )
+            // InternalEntityMockDSL.g:9744:3: rule__PropertyFillerSignedIntegerRange__Alternatives_3_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Alternatives_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getAlternatives_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_4__0"
+    // InternalEntityMockDSL.g:9753:1: rule__PropertyFillerSignedIntegerRange__Group_4__0 : rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl rule__PropertyFillerSignedIntegerRange__Group_4__1 ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9757:1: ( rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl rule__PropertyFillerSignedIntegerRange__Group_4__1 )
+            // InternalEntityMockDSL.g:9758:2: rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl rule__PropertyFillerSignedIntegerRange__Group_4__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_4__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:9765:1: rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl : ( 'roundTo' ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9769:1: ( ( 'roundTo' ) )
+            // InternalEntityMockDSL.g:9770:1: ( 'roundTo' )
+            {
+            // InternalEntityMockDSL.g:9770:1: ( 'roundTo' )
+            // InternalEntityMockDSL.g:9771:2: 'roundTo'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0()); 
+            }
+            match(input,91,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_4__1"
+    // InternalEntityMockDSL.g:9780:1: rule__PropertyFillerSignedIntegerRange__Group_4__1 : rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9784:1: ( rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl )
+            // InternalEntityMockDSL.g:9785:2: rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_4__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:9791:1: rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl : ( ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 ) ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9795:1: ( ( ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 ) ) )
+            // InternalEntityMockDSL.g:9796:1: ( ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:9796:1: ( ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 ) )
+            // InternalEntityMockDSL.g:9797:2: ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedAssignment_4_1()); 
+            }
+            // InternalEntityMockDSL.g:9798:2: ( rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 )
+            // InternalEntityMockDSL.g:9798:3: rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__0"
+    // InternalEntityMockDSL.g:9807:1: rule__PropertyFillerSignedIntegerRandom__Group__0 : rule__PropertyFillerSignedIntegerRandom__Group__0__Impl rule__PropertyFillerSignedIntegerRandom__Group__1 ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9811:1: ( rule__PropertyFillerSignedIntegerRandom__Group__0__Impl rule__PropertyFillerSignedIntegerRandom__Group__1 )
+            // InternalEntityMockDSL.g:9812:2: rule__PropertyFillerSignedIntegerRandom__Group__0__Impl rule__PropertyFillerSignedIntegerRandom__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyFillerSignedIntegerRandom__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRandom__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__0__Impl"
+    // InternalEntityMockDSL.g:9819:1: rule__PropertyFillerSignedIntegerRandom__Group__0__Impl : ( 'integerPick' ) ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9823:1: ( ( 'integerPick' ) )
+            // InternalEntityMockDSL.g:9824:1: ( 'integerPick' )
+            {
+            // InternalEntityMockDSL.g:9824:1: ( 'integerPick' )
+            // InternalEntityMockDSL.g:9825:2: 'integerPick'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0()); 
+            }
+            match(input,94,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__1"
+    // InternalEntityMockDSL.g:9834:1: rule__PropertyFillerSignedIntegerRandom__Group__1 : rule__PropertyFillerSignedIntegerRandom__Group__1__Impl rule__PropertyFillerSignedIntegerRandom__Group__2 ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9838:1: ( rule__PropertyFillerSignedIntegerRandom__Group__1__Impl rule__PropertyFillerSignedIntegerRandom__Group__2 )
+            // InternalEntityMockDSL.g:9839:2: rule__PropertyFillerSignedIntegerRandom__Group__1__Impl rule__PropertyFillerSignedIntegerRandom__Group__2
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerSignedIntegerRandom__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRandom__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__1__Impl"
+    // InternalEntityMockDSL.g:9846:1: rule__PropertyFillerSignedIntegerRandom__Group__1__Impl : ( '(' ) ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9850:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:9851:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:9851:1: ( '(' )
+            // InternalEntityMockDSL.g:9852:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__2"
+    // InternalEntityMockDSL.g:9861:1: rule__PropertyFillerSignedIntegerRandom__Group__2 : rule__PropertyFillerSignedIntegerRandom__Group__2__Impl rule__PropertyFillerSignedIntegerRandom__Group__3 ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9865:1: ( rule__PropertyFillerSignedIntegerRandom__Group__2__Impl rule__PropertyFillerSignedIntegerRandom__Group__3 )
+            // InternalEntityMockDSL.g:9866:2: rule__PropertyFillerSignedIntegerRandom__Group__2__Impl rule__PropertyFillerSignedIntegerRandom__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__PropertyFillerSignedIntegerRandom__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRandom__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__2__Impl"
+    // InternalEntityMockDSL.g:9873:1: rule__PropertyFillerSignedIntegerRandom__Group__2__Impl : ( ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* ) ) ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9877:1: ( ( ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* ) ) )
+            // InternalEntityMockDSL.g:9878:1: ( ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* ) )
+            {
+            // InternalEntityMockDSL.g:9878:1: ( ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* ) )
+            // InternalEntityMockDSL.g:9879:2: ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* )
+            {
+            // InternalEntityMockDSL.g:9879:2: ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 ) )
+            // InternalEntityMockDSL.g:9880:3: ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9881:3: ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )
+            // InternalEntityMockDSL.g:9881:4: rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2
+            {
+            pushFollow(FOLLOW_64);
+            rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:9884:2: ( ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )* )
+            // InternalEntityMockDSL.g:9885:3: ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9886:3: ( rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 )*
+            loop98:
+            do {
+                int alt98=2;
+                int LA98_0 = input.LA(1);
+
+                if ( (LA98_0==RULE_INT||LA98_0==36) ) {
+                    alt98=1;
+                }
+
+
+                switch (alt98) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:9886:4: rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2
+            	    {
+            	    pushFollow(FOLLOW_64);
+            	    rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop98;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__3"
+    // InternalEntityMockDSL.g:9895:1: rule__PropertyFillerSignedIntegerRandom__Group__3 : rule__PropertyFillerSignedIntegerRandom__Group__3__Impl ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9899:1: ( rule__PropertyFillerSignedIntegerRandom__Group__3__Impl )
+            // InternalEntityMockDSL.g:9900:2: rule__PropertyFillerSignedIntegerRandom__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerSignedIntegerRandom__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__Group__3__Impl"
+    // InternalEntityMockDSL.g:9906:1: rule__PropertyFillerSignedIntegerRandom__Group__3__Impl : ( ')' ) ;
+    public final void rule__PropertyFillerSignedIntegerRandom__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9910:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:9911:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:9911:1: ( ')' )
+            // InternalEntityMockDSL.g:9912:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__0"
+    // InternalEntityMockDSL.g:9922:1: rule__PropertyFillerTextRandom__Group__0 : rule__PropertyFillerTextRandom__Group__0__Impl rule__PropertyFillerTextRandom__Group__1 ;
+    public final void rule__PropertyFillerTextRandom__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9926:1: ( rule__PropertyFillerTextRandom__Group__0__Impl rule__PropertyFillerTextRandom__Group__1 )
+            // InternalEntityMockDSL.g:9927:2: rule__PropertyFillerTextRandom__Group__0__Impl rule__PropertyFillerTextRandom__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyFillerTextRandom__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextRandom__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__0__Impl"
+    // InternalEntityMockDSL.g:9934:1: rule__PropertyFillerTextRandom__Group__0__Impl : ( 'textPick' ) ;
+    public final void rule__PropertyFillerTextRandom__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9938:1: ( ( 'textPick' ) )
+            // InternalEntityMockDSL.g:9939:1: ( 'textPick' )
+            {
+            // InternalEntityMockDSL.g:9939:1: ( 'textPick' )
+            // InternalEntityMockDSL.g:9940:2: 'textPick'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0()); 
+            }
+            match(input,95,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__1"
+    // InternalEntityMockDSL.g:9949:1: rule__PropertyFillerTextRandom__Group__1 : rule__PropertyFillerTextRandom__Group__1__Impl rule__PropertyFillerTextRandom__Group__2 ;
+    public final void rule__PropertyFillerTextRandom__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9953:1: ( rule__PropertyFillerTextRandom__Group__1__Impl rule__PropertyFillerTextRandom__Group__2 )
+            // InternalEntityMockDSL.g:9954:2: rule__PropertyFillerTextRandom__Group__1__Impl rule__PropertyFillerTextRandom__Group__2
+            {
+            pushFollow(FOLLOW_13);
+            rule__PropertyFillerTextRandom__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextRandom__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__1__Impl"
+    // InternalEntityMockDSL.g:9961:1: rule__PropertyFillerTextRandom__Group__1__Impl : ( '(' ) ;
+    public final void rule__PropertyFillerTextRandom__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9965:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:9966:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:9966:1: ( '(' )
+            // InternalEntityMockDSL.g:9967:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__2"
+    // InternalEntityMockDSL.g:9976:1: rule__PropertyFillerTextRandom__Group__2 : rule__PropertyFillerTextRandom__Group__2__Impl rule__PropertyFillerTextRandom__Group__3 ;
+    public final void rule__PropertyFillerTextRandom__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9980:1: ( rule__PropertyFillerTextRandom__Group__2__Impl rule__PropertyFillerTextRandom__Group__3 )
+            // InternalEntityMockDSL.g:9981:2: rule__PropertyFillerTextRandom__Group__2__Impl rule__PropertyFillerTextRandom__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__PropertyFillerTextRandom__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextRandom__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__2__Impl"
+    // InternalEntityMockDSL.g:9988:1: rule__PropertyFillerTextRandom__Group__2__Impl : ( ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* ) ) ;
+    public final void rule__PropertyFillerTextRandom__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:9992:1: ( ( ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* ) ) )
+            // InternalEntityMockDSL.g:9993:1: ( ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* ) )
+            {
+            // InternalEntityMockDSL.g:9993:1: ( ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* ) )
+            // InternalEntityMockDSL.g:9994:2: ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* )
+            {
+            // InternalEntityMockDSL.g:9994:2: ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 ) )
+            // InternalEntityMockDSL.g:9995:3: ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:9996:3: ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )
+            // InternalEntityMockDSL.g:9996:4: rule__PropertyFillerTextRandom__ItemsAssignment_2
+            {
+            pushFollow(FOLLOW_31);
+            rule__PropertyFillerTextRandom__ItemsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:9999:2: ( ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )* )
+            // InternalEntityMockDSL.g:10000:3: ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10001:3: ( rule__PropertyFillerTextRandom__ItemsAssignment_2 )*
+            loop99:
+            do {
+                int alt99=2;
+                int LA99_0 = input.LA(1);
+
+                if ( (LA99_0==RULE_STRING) ) {
+                    alt99=1;
+                }
+
+
+                switch (alt99) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:10001:4: rule__PropertyFillerTextRandom__ItemsAssignment_2
+            	    {
+            	    pushFollow(FOLLOW_31);
+            	    rule__PropertyFillerTextRandom__ItemsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop99;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__3"
+    // InternalEntityMockDSL.g:10010:1: rule__PropertyFillerTextRandom__Group__3 : rule__PropertyFillerTextRandom__Group__3__Impl ;
+    public final void rule__PropertyFillerTextRandom__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10014:1: ( rule__PropertyFillerTextRandom__Group__3__Impl )
+            // InternalEntityMockDSL.g:10015:2: rule__PropertyFillerTextRandom__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextRandom__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__Group__3__Impl"
+    // InternalEntityMockDSL.g:10021:1: rule__PropertyFillerTextRandom__Group__3__Impl : ( ')' ) ;
+    public final void rule__PropertyFillerTextRandom__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10025:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:10026:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:10026:1: ( ')' )
+            // InternalEntityMockDSL.g:10027:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__0"
+    // InternalEntityMockDSL.g:10037:1: rule__PropertyFillerTextParagraphs__Group__0 : rule__PropertyFillerTextParagraphs__Group__0__Impl rule__PropertyFillerTextParagraphs__Group__1 ;
+    public final void rule__PropertyFillerTextParagraphs__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10041:1: ( rule__PropertyFillerTextParagraphs__Group__0__Impl rule__PropertyFillerTextParagraphs__Group__1 )
+            // InternalEntityMockDSL.g:10042:2: rule__PropertyFillerTextParagraphs__Group__0__Impl rule__PropertyFillerTextParagraphs__Group__1
+            {
+            pushFollow(FOLLOW_67);
+            rule__PropertyFillerTextParagraphs__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextParagraphs__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__0__Impl"
+    // InternalEntityMockDSL.g:10049:1: rule__PropertyFillerTextParagraphs__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerTextParagraphs__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10053:1: ( ( () ) )
+            // InternalEntityMockDSL.g:10054:1: ( () )
+            {
+            // InternalEntityMockDSL.g:10054:1: ( () )
+            // InternalEntityMockDSL.g:10055:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0()); 
+            }
+            // InternalEntityMockDSL.g:10056:2: ()
+            // InternalEntityMockDSL.g:10056:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__1"
+    // InternalEntityMockDSL.g:10064:1: rule__PropertyFillerTextParagraphs__Group__1 : rule__PropertyFillerTextParagraphs__Group__1__Impl rule__PropertyFillerTextParagraphs__Group__2 ;
+    public final void rule__PropertyFillerTextParagraphs__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10068:1: ( rule__PropertyFillerTextParagraphs__Group__1__Impl rule__PropertyFillerTextParagraphs__Group__2 )
+            // InternalEntityMockDSL.g:10069:2: rule__PropertyFillerTextParagraphs__Group__1__Impl rule__PropertyFillerTextParagraphs__Group__2
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerTextParagraphs__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextParagraphs__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__1__Impl"
+    // InternalEntityMockDSL.g:10076:1: rule__PropertyFillerTextParagraphs__Group__1__Impl : ( 'paragraphs' ) ;
+    public final void rule__PropertyFillerTextParagraphs__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10080:1: ( ( 'paragraphs' ) )
+            // InternalEntityMockDSL.g:10081:1: ( 'paragraphs' )
+            {
+            // InternalEntityMockDSL.g:10081:1: ( 'paragraphs' )
+            // InternalEntityMockDSL.g:10082:2: 'paragraphs'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1()); 
+            }
+            match(input,96,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__2"
+    // InternalEntityMockDSL.g:10091:1: rule__PropertyFillerTextParagraphs__Group__2 : rule__PropertyFillerTextParagraphs__Group__2__Impl ;
+    public final void rule__PropertyFillerTextParagraphs__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10095:1: ( rule__PropertyFillerTextParagraphs__Group__2__Impl )
+            // InternalEntityMockDSL.g:10096:2: rule__PropertyFillerTextParagraphs__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextParagraphs__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__Group__2__Impl"
+    // InternalEntityMockDSL.g:10102:1: rule__PropertyFillerTextParagraphs__Group__2__Impl : ( ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )? ) ;
+    public final void rule__PropertyFillerTextParagraphs__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10106:1: ( ( ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )? ) )
+            // InternalEntityMockDSL.g:10107:1: ( ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )? )
+            {
+            // InternalEntityMockDSL.g:10107:1: ( ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )? )
+            // InternalEntityMockDSL.g:10108:2: ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10109:2: ( rule__PropertyFillerTextParagraphs__CountAssignment_2 )?
+            int alt100=2;
+            int LA100_0 = input.LA(1);
+
+            if ( (LA100_0==RULE_INT) ) {
+                alt100=1;
+            }
+            switch (alt100) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10109:3: rule__PropertyFillerTextParagraphs__CountAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerTextParagraphs__CountAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__0"
+    // InternalEntityMockDSL.g:10118:1: rule__PropertyFillerTextSentences__Group__0 : rule__PropertyFillerTextSentences__Group__0__Impl rule__PropertyFillerTextSentences__Group__1 ;
+    public final void rule__PropertyFillerTextSentences__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10122:1: ( rule__PropertyFillerTextSentences__Group__0__Impl rule__PropertyFillerTextSentences__Group__1 )
+            // InternalEntityMockDSL.g:10123:2: rule__PropertyFillerTextSentences__Group__0__Impl rule__PropertyFillerTextSentences__Group__1
+            {
+            pushFollow(FOLLOW_68);
+            rule__PropertyFillerTextSentences__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextSentences__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__0__Impl"
+    // InternalEntityMockDSL.g:10130:1: rule__PropertyFillerTextSentences__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerTextSentences__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10134:1: ( ( () ) )
+            // InternalEntityMockDSL.g:10135:1: ( () )
+            {
+            // InternalEntityMockDSL.g:10135:1: ( () )
+            // InternalEntityMockDSL.g:10136:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0()); 
+            }
+            // InternalEntityMockDSL.g:10137:2: ()
+            // InternalEntityMockDSL.g:10137:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__1"
+    // InternalEntityMockDSL.g:10145:1: rule__PropertyFillerTextSentences__Group__1 : rule__PropertyFillerTextSentences__Group__1__Impl rule__PropertyFillerTextSentences__Group__2 ;
+    public final void rule__PropertyFillerTextSentences__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10149:1: ( rule__PropertyFillerTextSentences__Group__1__Impl rule__PropertyFillerTextSentences__Group__2 )
+            // InternalEntityMockDSL.g:10150:2: rule__PropertyFillerTextSentences__Group__1__Impl rule__PropertyFillerTextSentences__Group__2
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerTextSentences__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextSentences__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__1__Impl"
+    // InternalEntityMockDSL.g:10157:1: rule__PropertyFillerTextSentences__Group__1__Impl : ( 'sentences' ) ;
+    public final void rule__PropertyFillerTextSentences__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10161:1: ( ( 'sentences' ) )
+            // InternalEntityMockDSL.g:10162:1: ( 'sentences' )
+            {
+            // InternalEntityMockDSL.g:10162:1: ( 'sentences' )
+            // InternalEntityMockDSL.g:10163:2: 'sentences'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1()); 
+            }
+            match(input,97,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__2"
+    // InternalEntityMockDSL.g:10172:1: rule__PropertyFillerTextSentences__Group__2 : rule__PropertyFillerTextSentences__Group__2__Impl ;
+    public final void rule__PropertyFillerTextSentences__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10176:1: ( rule__PropertyFillerTextSentences__Group__2__Impl )
+            // InternalEntityMockDSL.g:10177:2: rule__PropertyFillerTextSentences__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextSentences__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__Group__2__Impl"
+    // InternalEntityMockDSL.g:10183:1: rule__PropertyFillerTextSentences__Group__2__Impl : ( ( rule__PropertyFillerTextSentences__CountAssignment_2 )? ) ;
+    public final void rule__PropertyFillerTextSentences__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10187:1: ( ( ( rule__PropertyFillerTextSentences__CountAssignment_2 )? ) )
+            // InternalEntityMockDSL.g:10188:1: ( ( rule__PropertyFillerTextSentences__CountAssignment_2 )? )
+            {
+            // InternalEntityMockDSL.g:10188:1: ( ( rule__PropertyFillerTextSentences__CountAssignment_2 )? )
+            // InternalEntityMockDSL.g:10189:2: ( rule__PropertyFillerTextSentences__CountAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesAccess().getCountAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10190:2: ( rule__PropertyFillerTextSentences__CountAssignment_2 )?
+            int alt101=2;
+            int LA101_0 = input.LA(1);
+
+            if ( (LA101_0==RULE_INT) ) {
+                alt101=1;
+            }
+            switch (alt101) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10190:3: rule__PropertyFillerTextSentences__CountAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerTextSentences__CountAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesAccess().getCountAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__0"
+    // InternalEntityMockDSL.g:10199:1: rule__PropertyFillerTextWords__Group__0 : rule__PropertyFillerTextWords__Group__0__Impl rule__PropertyFillerTextWords__Group__1 ;
+    public final void rule__PropertyFillerTextWords__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10203:1: ( rule__PropertyFillerTextWords__Group__0__Impl rule__PropertyFillerTextWords__Group__1 )
+            // InternalEntityMockDSL.g:10204:2: rule__PropertyFillerTextWords__Group__0__Impl rule__PropertyFillerTextWords__Group__1
+            {
+            pushFollow(FOLLOW_69);
+            rule__PropertyFillerTextWords__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextWords__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__0__Impl"
+    // InternalEntityMockDSL.g:10211:1: rule__PropertyFillerTextWords__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerTextWords__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10215:1: ( ( () ) )
+            // InternalEntityMockDSL.g:10216:1: ( () )
+            {
+            // InternalEntityMockDSL.g:10216:1: ( () )
+            // InternalEntityMockDSL.g:10217:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0()); 
+            }
+            // InternalEntityMockDSL.g:10218:2: ()
+            // InternalEntityMockDSL.g:10218:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__1"
+    // InternalEntityMockDSL.g:10226:1: rule__PropertyFillerTextWords__Group__1 : rule__PropertyFillerTextWords__Group__1__Impl rule__PropertyFillerTextWords__Group__2 ;
+    public final void rule__PropertyFillerTextWords__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10230:1: ( rule__PropertyFillerTextWords__Group__1__Impl rule__PropertyFillerTextWords__Group__2 )
+            // InternalEntityMockDSL.g:10231:2: rule__PropertyFillerTextWords__Group__1__Impl rule__PropertyFillerTextWords__Group__2
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerTextWords__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextWords__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__1__Impl"
+    // InternalEntityMockDSL.g:10238:1: rule__PropertyFillerTextWords__Group__1__Impl : ( 'words' ) ;
+    public final void rule__PropertyFillerTextWords__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10242:1: ( ( 'words' ) )
+            // InternalEntityMockDSL.g:10243:1: ( 'words' )
+            {
+            // InternalEntityMockDSL.g:10243:1: ( 'words' )
+            // InternalEntityMockDSL.g:10244:2: 'words'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1()); 
+            }
+            match(input,98,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__2"
+    // InternalEntityMockDSL.g:10253:1: rule__PropertyFillerTextWords__Group__2 : rule__PropertyFillerTextWords__Group__2__Impl ;
+    public final void rule__PropertyFillerTextWords__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10257:1: ( rule__PropertyFillerTextWords__Group__2__Impl )
+            // InternalEntityMockDSL.g:10258:2: rule__PropertyFillerTextWords__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerTextWords__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__Group__2__Impl"
+    // InternalEntityMockDSL.g:10264:1: rule__PropertyFillerTextWords__Group__2__Impl : ( ( rule__PropertyFillerTextWords__CountAssignment_2 )? ) ;
+    public final void rule__PropertyFillerTextWords__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10268:1: ( ( ( rule__PropertyFillerTextWords__CountAssignment_2 )? ) )
+            // InternalEntityMockDSL.g:10269:1: ( ( rule__PropertyFillerTextWords__CountAssignment_2 )? )
+            {
+            // InternalEntityMockDSL.g:10269:1: ( ( rule__PropertyFillerTextWords__CountAssignment_2 )? )
+            // InternalEntityMockDSL.g:10270:2: ( rule__PropertyFillerTextWords__CountAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsAccess().getCountAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10271:2: ( rule__PropertyFillerTextWords__CountAssignment_2 )?
+            int alt102=2;
+            int LA102_0 = input.LA(1);
+
+            if ( (LA102_0==RULE_INT) ) {
+                alt102=1;
+            }
+            switch (alt102) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10271:3: rule__PropertyFillerTextWords__CountAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerTextWords__CountAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsAccess().getCountAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__0"
+    // InternalEntityMockDSL.g:10280:1: rule__PropertyFillerUnsignedDoubleRange__Group__0 : rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group__1 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10284:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group__1 )
+            // InternalEntityMockDSL.g:10285:2: rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group__1
+            {
+            pushFollow(FOLLOW_55);
+            rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl"
+    // InternalEntityMockDSL.g:10292:1: rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl : ( 'unsignedNumberRange' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10296:1: ( ( 'unsignedNumberRange' ) )
+            // InternalEntityMockDSL.g:10297:1: ( 'unsignedNumberRange' )
+            {
+            // InternalEntityMockDSL.g:10297:1: ( 'unsignedNumberRange' )
+            // InternalEntityMockDSL.g:10298:2: 'unsignedNumberRange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0()); 
+            }
+            match(input,99,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__1"
+    // InternalEntityMockDSL.g:10307:1: rule__PropertyFillerUnsignedDoubleRange__Group__1 : rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group__2 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10311:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group__2 )
+            // InternalEntityMockDSL.g:10312:2: rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group__2
+            {
+            pushFollow(FOLLOW_58);
+            rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl"
+    // InternalEntityMockDSL.g:10319:1: rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl : ( 'from' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10323:1: ( ( 'from' ) )
+            // InternalEntityMockDSL.g:10324:1: ( 'from' )
+            {
+            // InternalEntityMockDSL.g:10324:1: ( 'from' )
+            // InternalEntityMockDSL.g:10325:2: 'from'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1()); 
+            }
+            match(input,87,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__2"
+    // InternalEntityMockDSL.g:10334:1: rule__PropertyFillerUnsignedDoubleRange__Group__2 : rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl rule__PropertyFillerUnsignedDoubleRange__Group__3 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10338:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl rule__PropertyFillerUnsignedDoubleRange__Group__3 )
+            // InternalEntityMockDSL.g:10339:2: rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl rule__PropertyFillerUnsignedDoubleRange__Group__3
+            {
+            pushFollow(FOLLOW_58);
+            rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl"
+    // InternalEntityMockDSL.g:10346:1: rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )? ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10350:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )? ) )
+            // InternalEntityMockDSL.g:10351:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )? )
+            {
+            // InternalEntityMockDSL.g:10351:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )? )
+            // InternalEntityMockDSL.g:10352:2: ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:10353:2: ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0 )?
+            int alt103=2;
+            int LA103_0 = input.LA(1);
+
+            if ( (LA103_0==RULE_ID||LA103_0==RULE_INT||LA103_0==88) ) {
+                alt103=1;
+            }
+            switch (alt103) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10353:3: rule__PropertyFillerUnsignedDoubleRange__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__3"
+    // InternalEntityMockDSL.g:10361:1: rule__PropertyFillerUnsignedDoubleRange__Group__3 : rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl rule__PropertyFillerUnsignedDoubleRange__Group__4 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10365:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl rule__PropertyFillerUnsignedDoubleRange__Group__4 )
+            // InternalEntityMockDSL.g:10366:2: rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl rule__PropertyFillerUnsignedDoubleRange__Group__4
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl"
+    // InternalEntityMockDSL.g:10373:1: rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl : ( 'with' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10377:1: ( ( 'with' ) )
+            // InternalEntityMockDSL.g:10378:1: ( 'with' )
+            {
+            // InternalEntityMockDSL.g:10378:1: ( 'with' )
+            // InternalEntityMockDSL.g:10379:2: 'with'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__4"
+    // InternalEntityMockDSL.g:10388:1: rule__PropertyFillerUnsignedDoubleRange__Group__4 : rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl rule__PropertyFillerUnsignedDoubleRange__Group__5 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10392:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl rule__PropertyFillerUnsignedDoubleRange__Group__5 )
+            // InternalEntityMockDSL.g:10393:2: rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl rule__PropertyFillerUnsignedDoubleRange__Group__5
+            {
+            pushFollow(FOLLOW_59);
+            rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__4"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl"
+    // InternalEntityMockDSL.g:10400:1: rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10404:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:10405:1: ( ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:10405:1: ( ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 ) )
+            // InternalEntityMockDSL.g:10406:2: ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:10407:2: ( rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 )
+            // InternalEntityMockDSL.g:10407:3: rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__5"
+    // InternalEntityMockDSL.g:10415:1: rule__PropertyFillerUnsignedDoubleRange__Group__5 : rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl rule__PropertyFillerUnsignedDoubleRange__Group__6 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10419:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl rule__PropertyFillerUnsignedDoubleRange__Group__6 )
+            // InternalEntityMockDSL.g:10420:2: rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl rule__PropertyFillerUnsignedDoubleRange__Group__6
+            {
+            pushFollow(FOLLOW_60);
+            rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__5"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl"
+    // InternalEntityMockDSL.g:10427:1: rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl : ( 'decimals' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10431:1: ( ( 'decimals' ) )
+            // InternalEntityMockDSL.g:10432:1: ( 'decimals' )
+            {
+            // InternalEntityMockDSL.g:10432:1: ( 'decimals' )
+            // InternalEntityMockDSL.g:10433:2: 'decimals'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5()); 
+            }
+            match(input,90,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__6"
+    // InternalEntityMockDSL.g:10442:1: rule__PropertyFillerUnsignedDoubleRange__Group__6 : rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10446:1: ( rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl )
+            // InternalEntityMockDSL.g:10447:2: rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__6"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl"
+    // InternalEntityMockDSL.g:10453:1: rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )? ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10457:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )? ) )
+            // InternalEntityMockDSL.g:10458:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )? )
+            {
+            // InternalEntityMockDSL.g:10458:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )? )
+            // InternalEntityMockDSL.g:10459:2: ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_6()); 
+            }
+            // InternalEntityMockDSL.g:10460:2: ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0 )?
+            int alt104=2;
+            int LA104_0 = input.LA(1);
+
+            if ( (LA104_0==91) ) {
+                alt104=1;
+            }
+            switch (alt104) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10460:3: rule__PropertyFillerUnsignedDoubleRange__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group__6__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__0"
+    // InternalEntityMockDSL.g:10469:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__0 : rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__1 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10473:1: ( rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__1 )
+            // InternalEntityMockDSL.g:10474:2: rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__1
+            {
+            pushFollow(FOLLOW_61);
+            rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:10481:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )? ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10485:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )? ) )
+            // InternalEntityMockDSL.g:10486:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )? )
+            {
+            // InternalEntityMockDSL.g:10486:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )? )
+            // InternalEntityMockDSL.g:10487:2: ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_0()); 
+            }
+            // InternalEntityMockDSL.g:10488:2: ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0 )?
+            int alt105=2;
+            int LA105_0 = input.LA(1);
+
+            if ( (LA105_0==RULE_ID||LA105_0==RULE_INT) ) {
+                alt105=1;
+            }
+            switch (alt105) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10488:3: rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__1"
+    // InternalEntityMockDSL.g:10496:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__1 : rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__2 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10500:1: ( rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__2 )
+            // InternalEntityMockDSL.g:10501:2: rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl rule__PropertyFillerUnsignedDoubleRange__Group_2__2
+            {
+            pushFollow(FOLLOW_62);
+            rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:10508:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl : ( 'until' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10512:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:10513:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:10513:1: ( 'until' )
+            // InternalEntityMockDSL.g:10514:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__2"
+    // InternalEntityMockDSL.g:10523:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__2 : rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10527:1: ( rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl )
+            // InternalEntityMockDSL.g:10528:2: rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl"
+    // InternalEntityMockDSL.g:10534:1: rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10538:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 ) ) )
+            // InternalEntityMockDSL.g:10539:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 ) )
+            {
+            // InternalEntityMockDSL.g:10539:1: ( ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 ) )
+            // InternalEntityMockDSL.g:10540:2: ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_2()); 
+            }
+            // InternalEntityMockDSL.g:10541:2: ( rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2 )
+            // InternalEntityMockDSL.g:10541:3: rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Alternatives_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getAlternatives_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_6__0"
+    // InternalEntityMockDSL.g:10550:1: rule__PropertyFillerUnsignedDoubleRange__Group_6__0 : rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_6__1 ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10554:1: ( rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_6__1 )
+            // InternalEntityMockDSL.g:10555:2: rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl rule__PropertyFillerUnsignedDoubleRange__Group_6__1
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_6__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:10562:1: rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl : ( 'roundTo' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10566:1: ( ( 'roundTo' ) )
+            // InternalEntityMockDSL.g:10567:1: ( 'roundTo' )
+            {
+            // InternalEntityMockDSL.g:10567:1: ( 'roundTo' )
+            // InternalEntityMockDSL.g:10568:2: 'roundTo'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0()); 
+            }
+            match(input,91,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_6__1"
+    // InternalEntityMockDSL.g:10577:1: rule__PropertyFillerUnsignedDoubleRange__Group_6__1 : rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10581:1: ( rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl )
+            // InternalEntityMockDSL.g:10582:2: rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_6__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:10588:1: rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl : ( ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10592:1: ( ( ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 ) ) )
+            // InternalEntityMockDSL.g:10593:1: ( ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 ) )
+            {
+            // InternalEntityMockDSL.g:10593:1: ( ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 ) )
+            // InternalEntityMockDSL.g:10594:2: ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedAssignment_6_1()); 
+            }
+            // InternalEntityMockDSL.g:10595:2: ( rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 )
+            // InternalEntityMockDSL.g:10595:3: rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__0"
+    // InternalEntityMockDSL.g:10604:1: rule__PropertyFillerUnsignedDoubleRandom__Group__0 : rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__1 ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10608:1: ( rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__1 )
+            // InternalEntityMockDSL.g:10609:2: rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl"
+    // InternalEntityMockDSL.g:10616:1: rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl : ( 'unsignedNumberPick' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10620:1: ( ( 'unsignedNumberPick' ) )
+            // InternalEntityMockDSL.g:10621:1: ( 'unsignedNumberPick' )
+            {
+            // InternalEntityMockDSL.g:10621:1: ( 'unsignedNumberPick' )
+            // InternalEntityMockDSL.g:10622:2: 'unsignedNumberPick'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0()); 
+            }
+            match(input,100,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__1"
+    // InternalEntityMockDSL.g:10631:1: rule__PropertyFillerUnsignedDoubleRandom__Group__1 : rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__2 ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10635:1: ( rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__2 )
+            // InternalEntityMockDSL.g:10636:2: rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__2
+            {
+            pushFollow(FOLLOW_56);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl"
+    // InternalEntityMockDSL.g:10643:1: rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl : ( '(' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10647:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:10648:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:10648:1: ( '(' )
+            // InternalEntityMockDSL.g:10649:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__2"
+    // InternalEntityMockDSL.g:10658:1: rule__PropertyFillerUnsignedDoubleRandom__Group__2 : rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__3 ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10662:1: ( rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__3 )
+            // InternalEntityMockDSL.g:10663:2: rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl rule__PropertyFillerUnsignedDoubleRandom__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl"
+    // InternalEntityMockDSL.g:10670:1: rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl : ( ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10674:1: ( ( ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* ) ) )
+            // InternalEntityMockDSL.g:10675:1: ( ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* ) )
+            {
+            // InternalEntityMockDSL.g:10675:1: ( ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* ) )
+            // InternalEntityMockDSL.g:10676:2: ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* )
+            {
+            // InternalEntityMockDSL.g:10676:2: ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 ) )
+            // InternalEntityMockDSL.g:10677:3: ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10678:3: ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )
+            // InternalEntityMockDSL.g:10678:4: rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2
+            {
+            pushFollow(FOLLOW_64);
+            rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:10681:2: ( ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )* )
+            // InternalEntityMockDSL.g:10682:3: ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:10683:3: ( rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 )*
+            loop106:
+            do {
+                int alt106=2;
+                int LA106_0 = input.LA(1);
+
+                if ( (LA106_0==RULE_INT) ) {
+                    alt106=1;
+                }
+
+
+                switch (alt106) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:10683:4: rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2
+            	    {
+            	    pushFollow(FOLLOW_64);
+            	    rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop106;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__3"
+    // InternalEntityMockDSL.g:10692:1: rule__PropertyFillerUnsignedDoubleRandom__Group__3 : rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10696:1: ( rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl )
+            // InternalEntityMockDSL.g:10697:2: rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl"
+    // InternalEntityMockDSL.g:10703:1: rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl : ( ')' ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10707:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:10708:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:10708:1: ( ')' )
+            // InternalEntityMockDSL.g:10709:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__0"
+    // InternalEntityMockDSL.g:10719:1: rule__PropertyFillerUnsignedIntegerRange__Group__0 : rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group__1 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10723:1: ( rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group__1 )
+            // InternalEntityMockDSL.g:10724:2: rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group__1
+            {
+            pushFollow(FOLLOW_70);
+            rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl"
+    // InternalEntityMockDSL.g:10731:1: rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10735:1: ( ( () ) )
+            // InternalEntityMockDSL.g:10736:1: ( () )
+            {
+            // InternalEntityMockDSL.g:10736:1: ( () )
+            // InternalEntityMockDSL.g:10737:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:10738:2: ()
+            // InternalEntityMockDSL.g:10738:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__1"
+    // InternalEntityMockDSL.g:10746:1: rule__PropertyFillerUnsignedIntegerRange__Group__1 : rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group__2 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10750:1: ( rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group__2 )
+            // InternalEntityMockDSL.g:10751:2: rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group__2
+            {
+            pushFollow(FOLLOW_55);
+            rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl"
+    // InternalEntityMockDSL.g:10758:1: rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl : ( 'unsignedIntegerRange' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10762:1: ( ( 'unsignedIntegerRange' ) )
+            // InternalEntityMockDSL.g:10763:1: ( 'unsignedIntegerRange' )
+            {
+            // InternalEntityMockDSL.g:10763:1: ( 'unsignedIntegerRange' )
+            // InternalEntityMockDSL.g:10764:2: 'unsignedIntegerRange'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1()); 
+            }
+            match(input,101,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__2"
+    // InternalEntityMockDSL.g:10773:1: rule__PropertyFillerUnsignedIntegerRange__Group__2 : rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl rule__PropertyFillerUnsignedIntegerRange__Group__3 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10777:1: ( rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl rule__PropertyFillerUnsignedIntegerRange__Group__3 )
+            // InternalEntityMockDSL.g:10778:2: rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl rule__PropertyFillerUnsignedIntegerRange__Group__3
+            {
+            pushFollow(FOLLOW_71);
+            rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl"
+    // InternalEntityMockDSL.g:10785:1: rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl : ( 'from' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10789:1: ( ( 'from' ) )
+            // InternalEntityMockDSL.g:10790:1: ( 'from' )
+            {
+            // InternalEntityMockDSL.g:10790:1: ( 'from' )
+            // InternalEntityMockDSL.g:10791:2: 'from'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2()); 
+            }
+            match(input,87,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__3"
+    // InternalEntityMockDSL.g:10800:1: rule__PropertyFillerUnsignedIntegerRange__Group__3 : rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl rule__PropertyFillerUnsignedIntegerRange__Group__4 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10804:1: ( rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl rule__PropertyFillerUnsignedIntegerRange__Group__4 )
+            // InternalEntityMockDSL.g:10805:2: rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl rule__PropertyFillerUnsignedIntegerRange__Group__4
+            {
+            pushFollow(FOLLOW_71);
+            rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl"
+    // InternalEntityMockDSL.g:10812:1: rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl : ( ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )? ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10816:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:10817:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:10817:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )? )
+            // InternalEntityMockDSL.g:10818:2: ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:10819:2: ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0 )?
+            int alt107=2;
+            int LA107_0 = input.LA(1);
+
+            if ( (LA107_0==RULE_ID||LA107_0==RULE_INT||LA107_0==88) ) {
+                alt107=1;
+            }
+            switch (alt107) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10819:3: rule__PropertyFillerUnsignedIntegerRange__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__4"
+    // InternalEntityMockDSL.g:10827:1: rule__PropertyFillerUnsignedIntegerRange__Group__4 : rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10831:1: ( rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl )
+            // InternalEntityMockDSL.g:10832:2: rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__4"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl"
+    // InternalEntityMockDSL.g:10838:1: rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl : ( ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )? ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10842:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:10843:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:10843:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )? )
+            // InternalEntityMockDSL.g:10844:2: ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:10845:2: ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0 )?
+            int alt108=2;
+            int LA108_0 = input.LA(1);
+
+            if ( (LA108_0==91) ) {
+                alt108=1;
+            }
+            switch (alt108) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10845:3: rule__PropertyFillerUnsignedIntegerRange__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__0"
+    // InternalEntityMockDSL.g:10854:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__0 : rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__1 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10858:1: ( rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__1 )
+            // InternalEntityMockDSL.g:10859:2: rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__1
+            {
+            pushFollow(FOLLOW_72);
+            rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:10866:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl : ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )? ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10870:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )? ) )
+            // InternalEntityMockDSL.g:10871:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )? )
+            {
+            // InternalEntityMockDSL.g:10871:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )? )
+            // InternalEntityMockDSL.g:10872:2: ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_0()); 
+            }
+            // InternalEntityMockDSL.g:10873:2: ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0 )?
+            int alt109=2;
+            int LA109_0 = input.LA(1);
+
+            if ( (LA109_0==RULE_ID||LA109_0==RULE_INT) ) {
+                alt109=1;
+            }
+            switch (alt109) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10873:3: rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__1"
+    // InternalEntityMockDSL.g:10881:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__1 : rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__2 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10885:1: ( rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__2 )
+            // InternalEntityMockDSL.g:10886:2: rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl rule__PropertyFillerUnsignedIntegerRange__Group_3__2
+            {
+            pushFollow(FOLLOW_73);
+            rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:10893:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl : ( 'until' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10897:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:10898:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:10898:1: ( 'until' )
+            // InternalEntityMockDSL.g:10899:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__2"
+    // InternalEntityMockDSL.g:10908:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__2 : rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10912:1: ( rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl )
+            // InternalEntityMockDSL.g:10913:2: rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:10919:1: rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl : ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 ) ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10923:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 ) ) )
+            // InternalEntityMockDSL.g:10924:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 ) )
+            {
+            // InternalEntityMockDSL.g:10924:1: ( ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 ) )
+            // InternalEntityMockDSL.g:10925:2: ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_2()); 
+            }
+            // InternalEntityMockDSL.g:10926:2: ( rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2 )
+            // InternalEntityMockDSL.g:10926:3: rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Alternatives_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getAlternatives_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_4__0"
+    // InternalEntityMockDSL.g:10935:1: rule__PropertyFillerUnsignedIntegerRange__Group_4__0 : rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_4__1 ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10939:1: ( rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_4__1 )
+            // InternalEntityMockDSL.g:10940:2: rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl rule__PropertyFillerUnsignedIntegerRange__Group_4__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_4__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:10947:1: rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl : ( 'roundTo' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10951:1: ( ( 'roundTo' ) )
+            // InternalEntityMockDSL.g:10952:1: ( 'roundTo' )
+            {
+            // InternalEntityMockDSL.g:10952:1: ( 'roundTo' )
+            // InternalEntityMockDSL.g:10953:2: 'roundTo'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0()); 
+            }
+            match(input,91,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_4__1"
+    // InternalEntityMockDSL.g:10962:1: rule__PropertyFillerUnsignedIntegerRange__Group_4__1 : rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10966:1: ( rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl )
+            // InternalEntityMockDSL.g:10967:2: rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_4__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:10973:1: rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl : ( ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 ) ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10977:1: ( ( ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 ) ) )
+            // InternalEntityMockDSL.g:10978:1: ( ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:10978:1: ( ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 ) )
+            // InternalEntityMockDSL.g:10979:2: ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedAssignment_4_1()); 
+            }
+            // InternalEntityMockDSL.g:10980:2: ( rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 )
+            // InternalEntityMockDSL.g:10980:3: rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__0"
+    // InternalEntityMockDSL.g:10989:1: rule__PropertyFillerUnsignedIntegerRandom__Group__0 : rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__1 ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:10993:1: ( rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__1 )
+            // InternalEntityMockDSL.g:10994:2: rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl"
+    // InternalEntityMockDSL.g:11001:1: rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl : ( 'unsignedIntegerPick' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11005:1: ( ( 'unsignedIntegerPick' ) )
+            // InternalEntityMockDSL.g:11006:1: ( 'unsignedIntegerPick' )
+            {
+            // InternalEntityMockDSL.g:11006:1: ( 'unsignedIntegerPick' )
+            // InternalEntityMockDSL.g:11007:2: 'unsignedIntegerPick'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0()); 
+            }
+            match(input,102,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__1"
+    // InternalEntityMockDSL.g:11016:1: rule__PropertyFillerUnsignedIntegerRandom__Group__1 : rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__2 ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11020:1: ( rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__2 )
+            // InternalEntityMockDSL.g:11021:2: rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__2
+            {
+            pushFollow(FOLLOW_16);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl"
+    // InternalEntityMockDSL.g:11028:1: rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl : ( '(' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11032:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:11033:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:11033:1: ( '(' )
+            // InternalEntityMockDSL.g:11034:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__2"
+    // InternalEntityMockDSL.g:11043:1: rule__PropertyFillerUnsignedIntegerRandom__Group__2 : rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__3 ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11047:1: ( rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__3 )
+            // InternalEntityMockDSL.g:11048:2: rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl rule__PropertyFillerUnsignedIntegerRandom__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl"
+    // InternalEntityMockDSL.g:11055:1: rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl : ( ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* ) ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11059:1: ( ( ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* ) ) )
+            // InternalEntityMockDSL.g:11060:1: ( ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* ) )
+            {
+            // InternalEntityMockDSL.g:11060:1: ( ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* ) )
+            // InternalEntityMockDSL.g:11061:2: ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) ) ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* )
+            {
+            // InternalEntityMockDSL.g:11061:2: ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 ) )
+            // InternalEntityMockDSL.g:11062:3: ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:11063:3: ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )
+            // InternalEntityMockDSL.g:11063:4: rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2
+            {
+            pushFollow(FOLLOW_74);
+            rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:11066:2: ( ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )* )
+            // InternalEntityMockDSL.g:11067:3: ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:11068:3: ( rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 )*
+            loop110:
+            do {
+                int alt110=2;
+                int LA110_0 = input.LA(1);
+
+                if ( (LA110_0==RULE_INT) ) {
+                    alt110=1;
+                }
+
+
+                switch (alt110) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11068:4: rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2
+            	    {
+            	    pushFollow(FOLLOW_74);
+            	    rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop110;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__3"
+    // InternalEntityMockDSL.g:11077:1: rule__PropertyFillerUnsignedIntegerRandom__Group__3 : rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11081:1: ( rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl )
+            // InternalEntityMockDSL.g:11082:2: rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__3"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl"
+    // InternalEntityMockDSL.g:11088:1: rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl : ( ')' ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11092:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:11093:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:11093:1: ( ')' )
+            // InternalEntityMockDSL.g:11094:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__0"
+    // InternalEntityMockDSL.g:11104:1: rule__EntityMockEntities__Group__0 : rule__EntityMockEntities__Group__0__Impl rule__EntityMockEntities__Group__1 ;
+    public final void rule__EntityMockEntities__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11108:1: ( rule__EntityMockEntities__Group__0__Impl rule__EntityMockEntities__Group__1 )
+            // InternalEntityMockDSL.g:11109:2: rule__EntityMockEntities__Group__0__Impl rule__EntityMockEntities__Group__1
+            {
+            pushFollow(FOLLOW_14);
+            rule__EntityMockEntities__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__0__Impl"
+    // InternalEntityMockDSL.g:11116:1: rule__EntityMockEntities__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockEntities__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11120:1: ( ( () ) )
+            // InternalEntityMockDSL.g:11121:1: ( () )
+            {
+            // InternalEntityMockDSL.g:11121:1: ( () )
+            // InternalEntityMockDSL.g:11122:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0()); 
+            }
+            // InternalEntityMockDSL.g:11123:2: ()
+            // InternalEntityMockDSL.g:11123:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__1"
+    // InternalEntityMockDSL.g:11131:1: rule__EntityMockEntities__Group__1 : rule__EntityMockEntities__Group__1__Impl rule__EntityMockEntities__Group__2 ;
+    public final void rule__EntityMockEntities__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11135:1: ( rule__EntityMockEntities__Group__1__Impl rule__EntityMockEntities__Group__2 )
+            // InternalEntityMockDSL.g:11136:2: rule__EntityMockEntities__Group__1__Impl rule__EntityMockEntities__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockEntities__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__1__Impl"
+    // InternalEntityMockDSL.g:11143:1: rule__EntityMockEntities__Group__1__Impl : ( 'entities' ) ;
+    public final void rule__EntityMockEntities__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11147:1: ( ( 'entities' ) )
+            // InternalEntityMockDSL.g:11148:1: ( 'entities' )
+            {
+            // InternalEntityMockDSL.g:11148:1: ( 'entities' )
+            // InternalEntityMockDSL.g:11149:2: 'entities'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1()); 
+            }
+            match(input,103,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__2"
+    // InternalEntityMockDSL.g:11158:1: rule__EntityMockEntities__Group__2 : rule__EntityMockEntities__Group__2__Impl rule__EntityMockEntities__Group__3 ;
+    public final void rule__EntityMockEntities__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11162:1: ( rule__EntityMockEntities__Group__2__Impl rule__EntityMockEntities__Group__3 )
+            // InternalEntityMockDSL.g:11163:2: rule__EntityMockEntities__Group__2__Impl rule__EntityMockEntities__Group__3
+            {
+            pushFollow(FOLLOW_75);
+            rule__EntityMockEntities__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__2__Impl"
+    // InternalEntityMockDSL.g:11170:1: rule__EntityMockEntities__Group__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockEntities__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11174:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:11175:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:11175:1: ( '{' )
+            // InternalEntityMockDSL.g:11176:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__3"
+    // InternalEntityMockDSL.g:11185:1: rule__EntityMockEntities__Group__3 : rule__EntityMockEntities__Group__3__Impl rule__EntityMockEntities__Group__4 ;
+    public final void rule__EntityMockEntities__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11189:1: ( rule__EntityMockEntities__Group__3__Impl rule__EntityMockEntities__Group__4 )
+            // InternalEntityMockDSL.g:11190:2: rule__EntityMockEntities__Group__3__Impl rule__EntityMockEntities__Group__4
+            {
+            pushFollow(FOLLOW_75);
+            rule__EntityMockEntities__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__3__Impl"
+    // InternalEntityMockDSL.g:11197:1: rule__EntityMockEntities__Group__3__Impl : ( ( rule__EntityMockEntities__EntitiesAssignment_3 )* ) ;
+    public final void rule__EntityMockEntities__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11201:1: ( ( ( rule__EntityMockEntities__EntitiesAssignment_3 )* ) )
+            // InternalEntityMockDSL.g:11202:1: ( ( rule__EntityMockEntities__EntitiesAssignment_3 )* )
+            {
+            // InternalEntityMockDSL.g:11202:1: ( ( rule__EntityMockEntities__EntitiesAssignment_3 )* )
+            // InternalEntityMockDSL.g:11203:2: ( rule__EntityMockEntities__EntitiesAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:11204:2: ( rule__EntityMockEntities__EntitiesAssignment_3 )*
+            loop111:
+            do {
+                int alt111=2;
+                int LA111_0 = input.LA(1);
+
+                if ( (LA111_0==104) ) {
+                    alt111=1;
+                }
+
+
+                switch (alt111) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11204:3: rule__EntityMockEntities__EntitiesAssignment_3
+            	    {
+            	    pushFollow(FOLLOW_76);
+            	    rule__EntityMockEntities__EntitiesAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop111;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__4"
+    // InternalEntityMockDSL.g:11212:1: rule__EntityMockEntities__Group__4 : rule__EntityMockEntities__Group__4__Impl ;
+    public final void rule__EntityMockEntities__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11216:1: ( rule__EntityMockEntities__Group__4__Impl )
+            // InternalEntityMockDSL.g:11217:2: rule__EntityMockEntities__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntities__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockEntities__Group__4__Impl"
+    // InternalEntityMockDSL.g:11223:1: rule__EntityMockEntities__Group__4__Impl : ( '}' ) ;
+    public final void rule__EntityMockEntities__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11227:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:11228:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:11228:1: ( '}' )
+            // InternalEntityMockDSL.g:11229:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__0"
+    // InternalEntityMockDSL.g:11239:1: rule__EntityMockEntity__Group__0 : rule__EntityMockEntity__Group__0__Impl rule__EntityMockEntity__Group__1 ;
+    public final void rule__EntityMockEntity__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11243:1: ( rule__EntityMockEntity__Group__0__Impl rule__EntityMockEntity__Group__1 )
+            // InternalEntityMockDSL.g:11244:2: rule__EntityMockEntity__Group__0__Impl rule__EntityMockEntity__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntity__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__0__Impl"
+    // InternalEntityMockDSL.g:11251:1: rule__EntityMockEntity__Group__0__Impl : ( 'mocking' ) ;
+    public final void rule__EntityMockEntity__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11255:1: ( ( 'mocking' ) )
+            // InternalEntityMockDSL.g:11256:1: ( 'mocking' )
+            {
+            // InternalEntityMockDSL.g:11256:1: ( 'mocking' )
+            // InternalEntityMockDSL.g:11257:2: 'mocking'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0()); 
+            }
+            match(input,104,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__1"
+    // InternalEntityMockDSL.g:11266:1: rule__EntityMockEntity__Group__1 : rule__EntityMockEntity__Group__1__Impl rule__EntityMockEntity__Group__2 ;
+    public final void rule__EntityMockEntity__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11270:1: ( rule__EntityMockEntity__Group__1__Impl rule__EntityMockEntity__Group__2 )
+            // InternalEntityMockDSL.g:11271:2: rule__EntityMockEntity__Group__1__Impl rule__EntityMockEntity__Group__2
+            {
+            pushFollow(FOLLOW_77);
+            rule__EntityMockEntity__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__1__Impl"
+    // InternalEntityMockDSL.g:11278:1: rule__EntityMockEntity__Group__1__Impl : ( ( rule__EntityMockEntity__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockEntity__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11282:1: ( ( ( rule__EntityMockEntity__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:11283:1: ( ( rule__EntityMockEntity__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:11283:1: ( ( rule__EntityMockEntity__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:11284:2: ( rule__EntityMockEntity__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:11285:2: ( rule__EntityMockEntity__NameAssignment_1 )
+            // InternalEntityMockDSL.g:11285:3: rule__EntityMockEntity__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__2"
+    // InternalEntityMockDSL.g:11293:1: rule__EntityMockEntity__Group__2 : rule__EntityMockEntity__Group__2__Impl rule__EntityMockEntity__Group__3 ;
+    public final void rule__EntityMockEntity__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11297:1: ( rule__EntityMockEntity__Group__2__Impl rule__EntityMockEntity__Group__3 )
+            // InternalEntityMockDSL.g:11298:2: rule__EntityMockEntity__Group__2__Impl rule__EntityMockEntity__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntity__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__2__Impl"
+    // InternalEntityMockDSL.g:11305:1: rule__EntityMockEntity__Group__2__Impl : ( 'entity' ) ;
+    public final void rule__EntityMockEntity__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11309:1: ( ( 'entity' ) )
+            // InternalEntityMockDSL.g:11310:1: ( 'entity' )
+            {
+            // InternalEntityMockDSL.g:11310:1: ( 'entity' )
+            // InternalEntityMockDSL.g:11311:2: 'entity'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2()); 
+            }
+            match(input,105,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__3"
+    // InternalEntityMockDSL.g:11320:1: rule__EntityMockEntity__Group__3 : rule__EntityMockEntity__Group__3__Impl rule__EntityMockEntity__Group__4 ;
+    public final void rule__EntityMockEntity__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11324:1: ( rule__EntityMockEntity__Group__3__Impl rule__EntityMockEntity__Group__4 )
+            // InternalEntityMockDSL.g:11325:2: rule__EntityMockEntity__Group__3__Impl rule__EntityMockEntity__Group__4
+            {
+            pushFollow(FOLLOW_78);
+            rule__EntityMockEntity__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__3__Impl"
+    // InternalEntityMockDSL.g:11332:1: rule__EntityMockEntity__Group__3__Impl : ( ( rule__EntityMockEntity__EntityRefAssignment_3 ) ) ;
+    public final void rule__EntityMockEntity__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11336:1: ( ( ( rule__EntityMockEntity__EntityRefAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:11337:1: ( ( rule__EntityMockEntity__EntityRefAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:11337:1: ( ( rule__EntityMockEntity__EntityRefAssignment_3 ) )
+            // InternalEntityMockDSL.g:11338:2: ( rule__EntityMockEntity__EntityRefAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getEntityRefAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:11339:2: ( rule__EntityMockEntity__EntityRefAssignment_3 )
+            // InternalEntityMockDSL.g:11339:3: rule__EntityMockEntity__EntityRefAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__EntityRefAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getEntityRefAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__4"
+    // InternalEntityMockDSL.g:11347:1: rule__EntityMockEntity__Group__4 : rule__EntityMockEntity__Group__4__Impl ;
+    public final void rule__EntityMockEntity__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11351:1: ( rule__EntityMockEntity__Group__4__Impl )
+            // InternalEntityMockDSL.g:11352:2: rule__EntityMockEntity__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group__4__Impl"
+    // InternalEntityMockDSL.g:11358:1: rule__EntityMockEntity__Group__4__Impl : ( ( rule__EntityMockEntity__Alternatives_4 ) ) ;
+    public final void rule__EntityMockEntity__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11362:1: ( ( ( rule__EntityMockEntity__Alternatives_4 ) ) )
+            // InternalEntityMockDSL.g:11363:1: ( ( rule__EntityMockEntity__Alternatives_4 ) )
+            {
+            // InternalEntityMockDSL.g:11363:1: ( ( rule__EntityMockEntity__Alternatives_4 ) )
+            // InternalEntityMockDSL.g:11364:2: ( rule__EntityMockEntity__Alternatives_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getAlternatives_4()); 
+            }
+            // InternalEntityMockDSL.g:11365:2: ( rule__EntityMockEntity__Alternatives_4 )
+            // InternalEntityMockDSL.g:11365:3: rule__EntityMockEntity__Alternatives_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Alternatives_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getAlternatives_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__0"
+    // InternalEntityMockDSL.g:11374:1: rule__EntityMockEntity__Group_4_0__0 : rule__EntityMockEntity__Group_4_0__0__Impl rule__EntityMockEntity__Group_4_0__1 ;
+    public final void rule__EntityMockEntity__Group_4_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11378:1: ( rule__EntityMockEntity__Group_4_0__0__Impl rule__EntityMockEntity__Group_4_0__1 )
+            // InternalEntityMockDSL.g:11379:2: rule__EntityMockEntity__Group_4_0__0__Impl rule__EntityMockEntity__Group_4_0__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__EntityMockEntity__Group_4_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__0__Impl"
+    // InternalEntityMockDSL.g:11386:1: rule__EntityMockEntity__Group_4_0__0__Impl : ( 'rows' ) ;
+    public final void rule__EntityMockEntity__Group_4_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11390:1: ( ( 'rows' ) )
+            // InternalEntityMockDSL.g:11391:1: ( 'rows' )
+            {
+            // InternalEntityMockDSL.g:11391:1: ( 'rows' )
+            // InternalEntityMockDSL.g:11392:2: 'rows'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0()); 
+            }
+            match(input,106,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__1"
+    // InternalEntityMockDSL.g:11401:1: rule__EntityMockEntity__Group_4_0__1 : rule__EntityMockEntity__Group_4_0__1__Impl rule__EntityMockEntity__Group_4_0__2 ;
+    public final void rule__EntityMockEntity__Group_4_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11405:1: ( rule__EntityMockEntity__Group_4_0__1__Impl rule__EntityMockEntity__Group_4_0__2 )
+            // InternalEntityMockDSL.g:11406:2: rule__EntityMockEntity__Group_4_0__1__Impl rule__EntityMockEntity__Group_4_0__2
+            {
+            pushFollow(FOLLOW_79);
+            rule__EntityMockEntity__Group_4_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__1__Impl"
+    // InternalEntityMockDSL.g:11413:1: rule__EntityMockEntity__Group_4_0__1__Impl : ( ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11417:1: ( ( ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 ) ) )
+            // InternalEntityMockDSL.g:11418:1: ( ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:11418:1: ( ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 ) )
+            // InternalEntityMockDSL.g:11419:2: ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getMinRowsAssignment_4_0_1()); 
+            }
+            // InternalEntityMockDSL.g:11420:2: ( rule__EntityMockEntity__MinRowsAssignment_4_0_1 )
+            // InternalEntityMockDSL.g:11420:3: rule__EntityMockEntity__MinRowsAssignment_4_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__MinRowsAssignment_4_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getMinRowsAssignment_4_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__2"
+    // InternalEntityMockDSL.g:11428:1: rule__EntityMockEntity__Group_4_0__2 : rule__EntityMockEntity__Group_4_0__2__Impl rule__EntityMockEntity__Group_4_0__3 ;
+    public final void rule__EntityMockEntity__Group_4_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11432:1: ( rule__EntityMockEntity__Group_4_0__2__Impl rule__EntityMockEntity__Group_4_0__3 )
+            // InternalEntityMockDSL.g:11433:2: rule__EntityMockEntity__Group_4_0__2__Impl rule__EntityMockEntity__Group_4_0__3
+            {
+            pushFollow(FOLLOW_16);
+            rule__EntityMockEntity__Group_4_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__2"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__2__Impl"
+    // InternalEntityMockDSL.g:11440:1: rule__EntityMockEntity__Group_4_0__2__Impl : ( 'to' ) ;
+    public final void rule__EntityMockEntity__Group_4_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11444:1: ( ( 'to' ) )
+            // InternalEntityMockDSL.g:11445:1: ( 'to' )
+            {
+            // InternalEntityMockDSL.g:11445:1: ( 'to' )
+            // InternalEntityMockDSL.g:11446:2: 'to'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2()); 
+            }
+            match(input,107,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__3"
+    // InternalEntityMockDSL.g:11455:1: rule__EntityMockEntity__Group_4_0__3 : rule__EntityMockEntity__Group_4_0__3__Impl rule__EntityMockEntity__Group_4_0__4 ;
+    public final void rule__EntityMockEntity__Group_4_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11459:1: ( rule__EntityMockEntity__Group_4_0__3__Impl rule__EntityMockEntity__Group_4_0__4 )
+            // InternalEntityMockDSL.g:11460:2: rule__EntityMockEntity__Group_4_0__3__Impl rule__EntityMockEntity__Group_4_0__4
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockEntity__Group_4_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__3__Impl"
+    // InternalEntityMockDSL.g:11467:1: rule__EntityMockEntity__Group_4_0__3__Impl : ( ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11471:1: ( ( ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 ) ) )
+            // InternalEntityMockDSL.g:11472:1: ( ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 ) )
+            {
+            // InternalEntityMockDSL.g:11472:1: ( ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 ) )
+            // InternalEntityMockDSL.g:11473:2: ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getMaxRowsAssignment_4_0_3()); 
+            }
+            // InternalEntityMockDSL.g:11474:2: ( rule__EntityMockEntity__MaxRowsAssignment_4_0_3 )
+            // InternalEntityMockDSL.g:11474:3: rule__EntityMockEntity__MaxRowsAssignment_4_0_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__MaxRowsAssignment_4_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getMaxRowsAssignment_4_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__4"
+    // InternalEntityMockDSL.g:11482:1: rule__EntityMockEntity__Group_4_0__4 : rule__EntityMockEntity__Group_4_0__4__Impl rule__EntityMockEntity__Group_4_0__5 ;
+    public final void rule__EntityMockEntity__Group_4_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11486:1: ( rule__EntityMockEntity__Group_4_0__4__Impl rule__EntityMockEntity__Group_4_0__5 )
+            // InternalEntityMockDSL.g:11487:2: rule__EntityMockEntity__Group_4_0__4__Impl rule__EntityMockEntity__Group_4_0__5
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__4"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__4__Impl"
+    // InternalEntityMockDSL.g:11494:1: rule__EntityMockEntity__Group_4_0__4__Impl : ( '{' ) ;
+    public final void rule__EntityMockEntity__Group_4_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11498:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:11499:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:11499:1: ( '{' )
+            // InternalEntityMockDSL.g:11500:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__5"
+    // InternalEntityMockDSL.g:11509:1: rule__EntityMockEntity__Group_4_0__5 : rule__EntityMockEntity__Group_4_0__5__Impl rule__EntityMockEntity__Group_4_0__6 ;
+    public final void rule__EntityMockEntity__Group_4_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11513:1: ( rule__EntityMockEntity__Group_4_0__5__Impl rule__EntityMockEntity__Group_4_0__6 )
+            // InternalEntityMockDSL.g:11514:2: rule__EntityMockEntity__Group_4_0__5__Impl rule__EntityMockEntity__Group_4_0__6
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__5"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__5__Impl"
+    // InternalEntityMockDSL.g:11521:1: rule__EntityMockEntity__Group_4_0__5__Impl : ( ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11525:1: ( ( ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )* ) )
+            // InternalEntityMockDSL.g:11526:1: ( ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )* )
+            {
+            // InternalEntityMockDSL.g:11526:1: ( ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )* )
+            // InternalEntityMockDSL.g:11527:2: ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_0_5()); 
+            }
+            // InternalEntityMockDSL.g:11528:2: ( rule__EntityMockEntity__TemplatesAssignment_4_0_5 )*
+            loop112:
+            do {
+                int alt112=2;
+                int LA112_0 = input.LA(1);
+
+                if ( (LA112_0==114) ) {
+                    alt112=1;
+                }
+
+
+                switch (alt112) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11528:3: rule__EntityMockEntity__TemplatesAssignment_4_0_5
+            	    {
+            	    pushFollow(FOLLOW_81);
+            	    rule__EntityMockEntity__TemplatesAssignment_4_0_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop112;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__6"
+    // InternalEntityMockDSL.g:11536:1: rule__EntityMockEntity__Group_4_0__6 : rule__EntityMockEntity__Group_4_0__6__Impl rule__EntityMockEntity__Group_4_0__7 ;
+    public final void rule__EntityMockEntity__Group_4_0__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11540:1: ( rule__EntityMockEntity__Group_4_0__6__Impl rule__EntityMockEntity__Group_4_0__7 )
+            // InternalEntityMockDSL.g:11541:2: rule__EntityMockEntity__Group_4_0__6__Impl rule__EntityMockEntity__Group_4_0__7
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_0__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__6"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__6__Impl"
+    // InternalEntityMockDSL.g:11548:1: rule__EntityMockEntity__Group_4_0__6__Impl : ( ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_0__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11552:1: ( ( ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )* ) )
+            // InternalEntityMockDSL.g:11553:1: ( ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )* )
+            {
+            // InternalEntityMockDSL.g:11553:1: ( ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )* )
+            // InternalEntityMockDSL.g:11554:2: ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_0_6()); 
+            }
+            // InternalEntityMockDSL.g:11555:2: ( rule__EntityMockEntity__AttributesAssignment_4_0_6 )*
+            loop113:
+            do {
+                int alt113=2;
+                int LA113_0 = input.LA(1);
+
+                if ( (LA113_0==73) ) {
+                    int LA113_1 = input.LA(2);
+
+                    if ( (LA113_1==RULE_ID) ) {
+                        int LA113_4 = input.LA(3);
+
+                        if ( (LA113_4==82||LA113_4==113) ) {
+                            alt113=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( ((LA113_0>=117 && LA113_0<=118)) ) {
+                    alt113=1;
+                }
+
+
+                switch (alt113) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11555:3: rule__EntityMockEntity__AttributesAssignment_4_0_6
+            	    {
+            	    pushFollow(FOLLOW_82);
+            	    rule__EntityMockEntity__AttributesAssignment_4_0_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop113;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_0_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__7"
+    // InternalEntityMockDSL.g:11563:1: rule__EntityMockEntity__Group_4_0__7 : rule__EntityMockEntity__Group_4_0__7__Impl rule__EntityMockEntity__Group_4_0__8 ;
+    public final void rule__EntityMockEntity__Group_4_0__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11567:1: ( rule__EntityMockEntity__Group_4_0__7__Impl rule__EntityMockEntity__Group_4_0__8 )
+            // InternalEntityMockDSL.g:11568:2: rule__EntityMockEntity__Group_4_0__7__Impl rule__EntityMockEntity__Group_4_0__8
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_0__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__7"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__7__Impl"
+    // InternalEntityMockDSL.g:11575:1: rule__EntityMockEntity__Group_4_0__7__Impl : ( ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_0__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11579:1: ( ( ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )* ) )
+            // InternalEntityMockDSL.g:11580:1: ( ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )* )
+            {
+            // InternalEntityMockDSL.g:11580:1: ( ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )* )
+            // InternalEntityMockDSL.g:11581:2: ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_0_7()); 
+            }
+            // InternalEntityMockDSL.g:11582:2: ( rule__EntityMockEntity__CalculationsAssignment_4_0_7 )*
+            loop114:
+            do {
+                int alt114=2;
+                int LA114_0 = input.LA(1);
+
+                if ( (LA114_0==73) ) {
+                    alt114=1;
+                }
+
+
+                switch (alt114) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11582:3: rule__EntityMockEntity__CalculationsAssignment_4_0_7
+            	    {
+            	    pushFollow(FOLLOW_36);
+            	    rule__EntityMockEntity__CalculationsAssignment_4_0_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop114;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_0_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__7__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__8"
+    // InternalEntityMockDSL.g:11590:1: rule__EntityMockEntity__Group_4_0__8 : rule__EntityMockEntity__Group_4_0__8__Impl ;
+    public final void rule__EntityMockEntity__Group_4_0__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11594:1: ( rule__EntityMockEntity__Group_4_0__8__Impl )
+            // InternalEntityMockDSL.g:11595:2: rule__EntityMockEntity__Group_4_0__8__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_0__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__8"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_0__8__Impl"
+    // InternalEntityMockDSL.g:11601:1: rule__EntityMockEntity__Group_4_0__8__Impl : ( '}' ) ;
+    public final void rule__EntityMockEntity__Group_4_0__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11605:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:11606:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:11606:1: ( '}' )
+            // InternalEntityMockDSL.g:11607:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_0__8__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__0"
+    // InternalEntityMockDSL.g:11617:1: rule__EntityMockEntity__Group_4_1__0 : rule__EntityMockEntity__Group_4_1__0__Impl rule__EntityMockEntity__Group_4_1__1 ;
+    public final void rule__EntityMockEntity__Group_4_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11621:1: ( rule__EntityMockEntity__Group_4_1__0__Impl rule__EntityMockEntity__Group_4_1__1 )
+            // InternalEntityMockDSL.g:11622:2: rule__EntityMockEntity__Group_4_1__0__Impl rule__EntityMockEntity__Group_4_1__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntity__Group_4_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__0__Impl"
+    // InternalEntityMockDSL.g:11629:1: rule__EntityMockEntity__Group_4_1__0__Impl : ( 'resource' ) ;
+    public final void rule__EntityMockEntity__Group_4_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11633:1: ( ( 'resource' ) )
+            // InternalEntityMockDSL.g:11634:1: ( 'resource' )
+            {
+            // InternalEntityMockDSL.g:11634:1: ( 'resource' )
+            // InternalEntityMockDSL.g:11635:2: 'resource'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0()); 
+            }
+            match(input,65,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__1"
+    // InternalEntityMockDSL.g:11644:1: rule__EntityMockEntity__Group_4_1__1 : rule__EntityMockEntity__Group_4_1__1__Impl rule__EntityMockEntity__Group_4_1__2 ;
+    public final void rule__EntityMockEntity__Group_4_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11648:1: ( rule__EntityMockEntity__Group_4_1__1__Impl rule__EntityMockEntity__Group_4_1__2 )
+            // InternalEntityMockDSL.g:11649:2: rule__EntityMockEntity__Group_4_1__1__Impl rule__EntityMockEntity__Group_4_1__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockEntity__Group_4_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__1__Impl"
+    // InternalEntityMockDSL.g:11656:1: rule__EntityMockEntity__Group_4_1__1__Impl : ( ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11660:1: ( ( ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 ) ) )
+            // InternalEntityMockDSL.g:11661:1: ( ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:11661:1: ( ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 ) )
+            // InternalEntityMockDSL.g:11662:2: ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getByResourceAssignment_4_1_1()); 
+            }
+            // InternalEntityMockDSL.g:11663:2: ( rule__EntityMockEntity__ByResourceAssignment_4_1_1 )
+            // InternalEntityMockDSL.g:11663:3: rule__EntityMockEntity__ByResourceAssignment_4_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__ByResourceAssignment_4_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getByResourceAssignment_4_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__2"
+    // InternalEntityMockDSL.g:11671:1: rule__EntityMockEntity__Group_4_1__2 : rule__EntityMockEntity__Group_4_1__2__Impl rule__EntityMockEntity__Group_4_1__3 ;
+    public final void rule__EntityMockEntity__Group_4_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11675:1: ( rule__EntityMockEntity__Group_4_1__2__Impl rule__EntityMockEntity__Group_4_1__3 )
+            // InternalEntityMockDSL.g:11676:2: rule__EntityMockEntity__Group_4_1__2__Impl rule__EntityMockEntity__Group_4_1__3
+            {
+            pushFollow(FOLLOW_83);
+            rule__EntityMockEntity__Group_4_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__2"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__2__Impl"
+    // InternalEntityMockDSL.g:11683:1: rule__EntityMockEntity__Group_4_1__2__Impl : ( '{' ) ;
+    public final void rule__EntityMockEntity__Group_4_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11687:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:11688:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:11688:1: ( '{' )
+            // InternalEntityMockDSL.g:11689:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__3"
+    // InternalEntityMockDSL.g:11698:1: rule__EntityMockEntity__Group_4_1__3 : rule__EntityMockEntity__Group_4_1__3__Impl rule__EntityMockEntity__Group_4_1__4 ;
+    public final void rule__EntityMockEntity__Group_4_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11702:1: ( rule__EntityMockEntity__Group_4_1__3__Impl rule__EntityMockEntity__Group_4_1__4 )
+            // InternalEntityMockDSL.g:11703:2: rule__EntityMockEntity__Group_4_1__3__Impl rule__EntityMockEntity__Group_4_1__4
+            {
+            pushFollow(FOLLOW_15);
+            rule__EntityMockEntity__Group_4_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__3__Impl"
+    // InternalEntityMockDSL.g:11710:1: rule__EntityMockEntity__Group_4_1__3__Impl : ( ( rule__EntityMockEntity__UnorderedGroup_4_1_3 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11714:1: ( ( ( rule__EntityMockEntity__UnorderedGroup_4_1_3 ) ) )
+            // InternalEntityMockDSL.g:11715:1: ( ( rule__EntityMockEntity__UnorderedGroup_4_1_3 ) )
+            {
+            // InternalEntityMockDSL.g:11715:1: ( ( rule__EntityMockEntity__UnorderedGroup_4_1_3 ) )
+            // InternalEntityMockDSL.g:11716:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3()); 
+            }
+            // InternalEntityMockDSL.g:11717:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3 )
+            // InternalEntityMockDSL.g:11717:3: rule__EntityMockEntity__UnorderedGroup_4_1_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__UnorderedGroup_4_1_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__4"
+    // InternalEntityMockDSL.g:11725:1: rule__EntityMockEntity__Group_4_1__4 : rule__EntityMockEntity__Group_4_1__4__Impl ;
+    public final void rule__EntityMockEntity__Group_4_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11729:1: ( rule__EntityMockEntity__Group_4_1__4__Impl )
+            // InternalEntityMockDSL.g:11730:2: rule__EntityMockEntity__Group_4_1__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__4"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_1__4__Impl"
+    // InternalEntityMockDSL.g:11736:1: rule__EntityMockEntity__Group_4_1__4__Impl : ( '}' ) ;
+    public final void rule__EntityMockEntity__Group_4_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11740:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:11741:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:11741:1: ( '}' )
+            // InternalEntityMockDSL.g:11742:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_1__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__0"
+    // InternalEntityMockDSL.g:11752:1: rule__EntityMockEntity__Group_4_2__0 : rule__EntityMockEntity__Group_4_2__0__Impl rule__EntityMockEntity__Group_4_2__1 ;
+    public final void rule__EntityMockEntity__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11756:1: ( rule__EntityMockEntity__Group_4_2__0__Impl rule__EntityMockEntity__Group_4_2__1 )
+            // InternalEntityMockDSL.g:11757:2: rule__EntityMockEntity__Group_4_2__0__Impl rule__EntityMockEntity__Group_4_2__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntity__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__0__Impl"
+    // InternalEntityMockDSL.g:11764:1: rule__EntityMockEntity__Group_4_2__0__Impl : ( 'iterate' ) ;
+    public final void rule__EntityMockEntity__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11768:1: ( ( 'iterate' ) )
+            // InternalEntityMockDSL.g:11769:1: ( 'iterate' )
+            {
+            // InternalEntityMockDSL.g:11769:1: ( 'iterate' )
+            // InternalEntityMockDSL.g:11770:2: 'iterate'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0()); 
+            }
+            match(input,108,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__1"
+    // InternalEntityMockDSL.g:11779:1: rule__EntityMockEntity__Group_4_2__1 : rule__EntityMockEntity__Group_4_2__1__Impl rule__EntityMockEntity__Group_4_2__2 ;
+    public final void rule__EntityMockEntity__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11783:1: ( rule__EntityMockEntity__Group_4_2__1__Impl rule__EntityMockEntity__Group_4_2__2 )
+            // InternalEntityMockDSL.g:11784:2: rule__EntityMockEntity__Group_4_2__1__Impl rule__EntityMockEntity__Group_4_2__2
+            {
+            pushFollow(FOLLOW_39);
+            rule__EntityMockEntity__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__1__Impl"
+    // InternalEntityMockDSL.g:11791:1: rule__EntityMockEntity__Group_4_2__1__Impl : ( ( rule__EntityMockEntity__IteratorAssignment_4_2_1 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11795:1: ( ( ( rule__EntityMockEntity__IteratorAssignment_4_2_1 ) ) )
+            // InternalEntityMockDSL.g:11796:1: ( ( rule__EntityMockEntity__IteratorAssignment_4_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:11796:1: ( ( rule__EntityMockEntity__IteratorAssignment_4_2_1 ) )
+            // InternalEntityMockDSL.g:11797:2: ( rule__EntityMockEntity__IteratorAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIteratorAssignment_4_2_1()); 
+            }
+            // InternalEntityMockDSL.g:11798:2: ( rule__EntityMockEntity__IteratorAssignment_4_2_1 )
+            // InternalEntityMockDSL.g:11798:3: rule__EntityMockEntity__IteratorAssignment_4_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__IteratorAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIteratorAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__2"
+    // InternalEntityMockDSL.g:11806:1: rule__EntityMockEntity__Group_4_2__2 : rule__EntityMockEntity__Group_4_2__2__Impl rule__EntityMockEntity__Group_4_2__3 ;
+    public final void rule__EntityMockEntity__Group_4_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11810:1: ( rule__EntityMockEntity__Group_4_2__2__Impl rule__EntityMockEntity__Group_4_2__3 )
+            // InternalEntityMockDSL.g:11811:2: rule__EntityMockEntity__Group_4_2__2__Impl rule__EntityMockEntity__Group_4_2__3
+            {
+            pushFollow(FOLLOW_84);
+            rule__EntityMockEntity__Group_4_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__2"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__2__Impl"
+    // InternalEntityMockDSL.g:11818:1: rule__EntityMockEntity__Group_4_2__2__Impl : ( 'with' ) ;
+    public final void rule__EntityMockEntity__Group_4_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11822:1: ( ( 'with' ) )
+            // InternalEntityMockDSL.g:11823:1: ( 'with' )
+            {
+            // InternalEntityMockDSL.g:11823:1: ( 'with' )
+            // InternalEntityMockDSL.g:11824:2: 'with'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__3"
+    // InternalEntityMockDSL.g:11833:1: rule__EntityMockEntity__Group_4_2__3 : rule__EntityMockEntity__Group_4_2__3__Impl rule__EntityMockEntity__Group_4_2__4 ;
+    public final void rule__EntityMockEntity__Group_4_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11837:1: ( rule__EntityMockEntity__Group_4_2__3__Impl rule__EntityMockEntity__Group_4_2__4 )
+            // InternalEntityMockDSL.g:11838:2: rule__EntityMockEntity__Group_4_2__3__Impl rule__EntityMockEntity__Group_4_2__4
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockEntity__Group_4_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__3__Impl"
+    // InternalEntityMockDSL.g:11845:1: rule__EntityMockEntity__Group_4_2__3__Impl : ( ( rule__EntityMockEntity__IterateAssignment_4_2_3 ) ) ;
+    public final void rule__EntityMockEntity__Group_4_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11849:1: ( ( ( rule__EntityMockEntity__IterateAssignment_4_2_3 ) ) )
+            // InternalEntityMockDSL.g:11850:1: ( ( rule__EntityMockEntity__IterateAssignment_4_2_3 ) )
+            {
+            // InternalEntityMockDSL.g:11850:1: ( ( rule__EntityMockEntity__IterateAssignment_4_2_3 ) )
+            // InternalEntityMockDSL.g:11851:2: ( rule__EntityMockEntity__IterateAssignment_4_2_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIterateAssignment_4_2_3()); 
+            }
+            // InternalEntityMockDSL.g:11852:2: ( rule__EntityMockEntity__IterateAssignment_4_2_3 )
+            // InternalEntityMockDSL.g:11852:3: rule__EntityMockEntity__IterateAssignment_4_2_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__IterateAssignment_4_2_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIterateAssignment_4_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__4"
+    // InternalEntityMockDSL.g:11860:1: rule__EntityMockEntity__Group_4_2__4 : rule__EntityMockEntity__Group_4_2__4__Impl rule__EntityMockEntity__Group_4_2__5 ;
+    public final void rule__EntityMockEntity__Group_4_2__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11864:1: ( rule__EntityMockEntity__Group_4_2__4__Impl rule__EntityMockEntity__Group_4_2__5 )
+            // InternalEntityMockDSL.g:11865:2: rule__EntityMockEntity__Group_4_2__4__Impl rule__EntityMockEntity__Group_4_2__5
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_2__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__4"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__4__Impl"
+    // InternalEntityMockDSL.g:11872:1: rule__EntityMockEntity__Group_4_2__4__Impl : ( '{' ) ;
+    public final void rule__EntityMockEntity__Group_4_2__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11876:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:11877:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:11877:1: ( '{' )
+            // InternalEntityMockDSL.g:11878:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__5"
+    // InternalEntityMockDSL.g:11887:1: rule__EntityMockEntity__Group_4_2__5 : rule__EntityMockEntity__Group_4_2__5__Impl rule__EntityMockEntity__Group_4_2__6 ;
+    public final void rule__EntityMockEntity__Group_4_2__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11891:1: ( rule__EntityMockEntity__Group_4_2__5__Impl rule__EntityMockEntity__Group_4_2__6 )
+            // InternalEntityMockDSL.g:11892:2: rule__EntityMockEntity__Group_4_2__5__Impl rule__EntityMockEntity__Group_4_2__6
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_2__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__5"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__5__Impl"
+    // InternalEntityMockDSL.g:11899:1: rule__EntityMockEntity__Group_4_2__5__Impl : ( ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_2__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11903:1: ( ( ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )* ) )
+            // InternalEntityMockDSL.g:11904:1: ( ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )* )
+            {
+            // InternalEntityMockDSL.g:11904:1: ( ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )* )
+            // InternalEntityMockDSL.g:11905:2: ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_2_5()); 
+            }
+            // InternalEntityMockDSL.g:11906:2: ( rule__EntityMockEntity__TemplatesAssignment_4_2_5 )*
+            loop115:
+            do {
+                int alt115=2;
+                int LA115_0 = input.LA(1);
+
+                if ( (LA115_0==114) ) {
+                    alt115=1;
+                }
+
+
+                switch (alt115) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11906:3: rule__EntityMockEntity__TemplatesAssignment_4_2_5
+            	    {
+            	    pushFollow(FOLLOW_81);
+            	    rule__EntityMockEntity__TemplatesAssignment_4_2_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop115;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getTemplatesAssignment_4_2_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__6"
+    // InternalEntityMockDSL.g:11914:1: rule__EntityMockEntity__Group_4_2__6 : rule__EntityMockEntity__Group_4_2__6__Impl rule__EntityMockEntity__Group_4_2__7 ;
+    public final void rule__EntityMockEntity__Group_4_2__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11918:1: ( rule__EntityMockEntity__Group_4_2__6__Impl rule__EntityMockEntity__Group_4_2__7 )
+            // InternalEntityMockDSL.g:11919:2: rule__EntityMockEntity__Group_4_2__6__Impl rule__EntityMockEntity__Group_4_2__7
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_2__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__6"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__6__Impl"
+    // InternalEntityMockDSL.g:11926:1: rule__EntityMockEntity__Group_4_2__6__Impl : ( ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_2__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11930:1: ( ( ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )* ) )
+            // InternalEntityMockDSL.g:11931:1: ( ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )* )
+            {
+            // InternalEntityMockDSL.g:11931:1: ( ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )* )
+            // InternalEntityMockDSL.g:11932:2: ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_2_6()); 
+            }
+            // InternalEntityMockDSL.g:11933:2: ( rule__EntityMockEntity__AttributesAssignment_4_2_6 )*
+            loop116:
+            do {
+                int alt116=2;
+                int LA116_0 = input.LA(1);
+
+                if ( (LA116_0==73) ) {
+                    int LA116_1 = input.LA(2);
+
+                    if ( (LA116_1==RULE_ID) ) {
+                        int LA116_4 = input.LA(3);
+
+                        if ( (LA116_4==82||LA116_4==113) ) {
+                            alt116=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( ((LA116_0>=117 && LA116_0<=118)) ) {
+                    alt116=1;
+                }
+
+
+                switch (alt116) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11933:3: rule__EntityMockEntity__AttributesAssignment_4_2_6
+            	    {
+            	    pushFollow(FOLLOW_82);
+            	    rule__EntityMockEntity__AttributesAssignment_4_2_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop116;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getAttributesAssignment_4_2_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__7"
+    // InternalEntityMockDSL.g:11941:1: rule__EntityMockEntity__Group_4_2__7 : rule__EntityMockEntity__Group_4_2__7__Impl rule__EntityMockEntity__Group_4_2__8 ;
+    public final void rule__EntityMockEntity__Group_4_2__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11945:1: ( rule__EntityMockEntity__Group_4_2__7__Impl rule__EntityMockEntity__Group_4_2__8 )
+            // InternalEntityMockDSL.g:11946:2: rule__EntityMockEntity__Group_4_2__7__Impl rule__EntityMockEntity__Group_4_2__8
+            {
+            pushFollow(FOLLOW_80);
+            rule__EntityMockEntity__Group_4_2__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__7"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__7__Impl"
+    // InternalEntityMockDSL.g:11953:1: rule__EntityMockEntity__Group_4_2__7__Impl : ( ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )* ) ;
+    public final void rule__EntityMockEntity__Group_4_2__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11957:1: ( ( ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )* ) )
+            // InternalEntityMockDSL.g:11958:1: ( ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )* )
+            {
+            // InternalEntityMockDSL.g:11958:1: ( ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )* )
+            // InternalEntityMockDSL.g:11959:2: ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_2_7()); 
+            }
+            // InternalEntityMockDSL.g:11960:2: ( rule__EntityMockEntity__CalculationsAssignment_4_2_7 )*
+            loop117:
+            do {
+                int alt117=2;
+                int LA117_0 = input.LA(1);
+
+                if ( (LA117_0==73) ) {
+                    alt117=1;
+                }
+
+
+                switch (alt117) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11960:3: rule__EntityMockEntity__CalculationsAssignment_4_2_7
+            	    {
+            	    pushFollow(FOLLOW_36);
+            	    rule__EntityMockEntity__CalculationsAssignment_4_2_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop117;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCalculationsAssignment_4_2_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__7__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__8"
+    // InternalEntityMockDSL.g:11968:1: rule__EntityMockEntity__Group_4_2__8 : rule__EntityMockEntity__Group_4_2__8__Impl ;
+    public final void rule__EntityMockEntity__Group_4_2__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11972:1: ( rule__EntityMockEntity__Group_4_2__8__Impl )
+            // InternalEntityMockDSL.g:11973:2: rule__EntityMockEntity__Group_4_2__8__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__Group_4_2__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__8"
+
+
+    // $ANTLR start "rule__EntityMockEntity__Group_4_2__8__Impl"
+    // InternalEntityMockDSL.g:11979:1: rule__EntityMockEntity__Group_4_2__8__Impl : ( '}' ) ;
+    public final void rule__EntityMockEntity__Group_4_2__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11983:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:11984:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:11984:1: ( '}' )
+            // InternalEntityMockDSL.g:11985:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__Group_4_2__8__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__0"
+    // InternalEntityMockDSL.g:11995:1: rule__IntegerIterate__Group__0 : rule__IntegerIterate__Group__0__Impl rule__IntegerIterate__Group__1 ;
+    public final void rule__IntegerIterate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:11999:1: ( rule__IntegerIterate__Group__0__Impl rule__IntegerIterate__Group__1 )
+            // InternalEntityMockDSL.g:12000:2: rule__IntegerIterate__Group__0__Impl rule__IntegerIterate__Group__1
+            {
+            pushFollow(FOLLOW_56);
+            rule__IntegerIterate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__0"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__0__Impl"
+    // InternalEntityMockDSL.g:12007:1: rule__IntegerIterate__Group__0__Impl : ( 'integerFrom' ) ;
+    public final void rule__IntegerIterate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12011:1: ( ( 'integerFrom' ) )
+            // InternalEntityMockDSL.g:12012:1: ( 'integerFrom' )
+            {
+            // InternalEntityMockDSL.g:12012:1: ( 'integerFrom' )
+            // InternalEntityMockDSL.g:12013:2: 'integerFrom'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0()); 
+            }
+            match(input,109,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__1"
+    // InternalEntityMockDSL.g:12022:1: rule__IntegerIterate__Group__1 : rule__IntegerIterate__Group__1__Impl rule__IntegerIterate__Group__2 ;
+    public final void rule__IntegerIterate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12026:1: ( rule__IntegerIterate__Group__1__Impl rule__IntegerIterate__Group__2 )
+            // InternalEntityMockDSL.g:12027:2: rule__IntegerIterate__Group__1__Impl rule__IntegerIterate__Group__2
+            {
+            pushFollow(FOLLOW_57);
+            rule__IntegerIterate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__1"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__1__Impl"
+    // InternalEntityMockDSL.g:12034:1: rule__IntegerIterate__Group__1__Impl : ( ( rule__IntegerIterate__FromAssignment_1 ) ) ;
+    public final void rule__IntegerIterate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12038:1: ( ( ( rule__IntegerIterate__FromAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:12039:1: ( ( rule__IntegerIterate__FromAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:12039:1: ( ( rule__IntegerIterate__FromAssignment_1 ) )
+            // InternalEntityMockDSL.g:12040:2: ( rule__IntegerIterate__FromAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getFromAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:12041:2: ( rule__IntegerIterate__FromAssignment_1 )
+            // InternalEntityMockDSL.g:12041:3: rule__IntegerIterate__FromAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__FromAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getFromAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__2"
+    // InternalEntityMockDSL.g:12049:1: rule__IntegerIterate__Group__2 : rule__IntegerIterate__Group__2__Impl rule__IntegerIterate__Group__3 ;
+    public final void rule__IntegerIterate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12053:1: ( rule__IntegerIterate__Group__2__Impl rule__IntegerIterate__Group__3 )
+            // InternalEntityMockDSL.g:12054:2: rule__IntegerIterate__Group__2__Impl rule__IntegerIterate__Group__3
+            {
+            pushFollow(FOLLOW_56);
+            rule__IntegerIterate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__2"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__2__Impl"
+    // InternalEntityMockDSL.g:12061:1: rule__IntegerIterate__Group__2__Impl : ( 'until' ) ;
+    public final void rule__IntegerIterate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12065:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:12066:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:12066:1: ( 'until' )
+            // InternalEntityMockDSL.g:12067:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getUntilKeyword_2()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getUntilKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__3"
+    // InternalEntityMockDSL.g:12076:1: rule__IntegerIterate__Group__3 : rule__IntegerIterate__Group__3__Impl rule__IntegerIterate__Group__4 ;
+    public final void rule__IntegerIterate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12080:1: ( rule__IntegerIterate__Group__3__Impl rule__IntegerIterate__Group__4 )
+            // InternalEntityMockDSL.g:12081:2: rule__IntegerIterate__Group__3__Impl rule__IntegerIterate__Group__4
+            {
+            pushFollow(FOLLOW_85);
+            rule__IntegerIterate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__3"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__3__Impl"
+    // InternalEntityMockDSL.g:12088:1: rule__IntegerIterate__Group__3__Impl : ( ( rule__IntegerIterate__UntilAssignment_3 ) ) ;
+    public final void rule__IntegerIterate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12092:1: ( ( ( rule__IntegerIterate__UntilAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:12093:1: ( ( rule__IntegerIterate__UntilAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:12093:1: ( ( rule__IntegerIterate__UntilAssignment_3 ) )
+            // InternalEntityMockDSL.g:12094:2: ( rule__IntegerIterate__UntilAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getUntilAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:12095:2: ( rule__IntegerIterate__UntilAssignment_3 )
+            // InternalEntityMockDSL.g:12095:3: rule__IntegerIterate__UntilAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__UntilAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getUntilAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__4"
+    // InternalEntityMockDSL.g:12103:1: rule__IntegerIterate__Group__4 : rule__IntegerIterate__Group__4__Impl rule__IntegerIterate__Group__5 ;
+    public final void rule__IntegerIterate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12107:1: ( rule__IntegerIterate__Group__4__Impl rule__IntegerIterate__Group__5 )
+            // InternalEntityMockDSL.g:12108:2: rule__IntegerIterate__Group__4__Impl rule__IntegerIterate__Group__5
+            {
+            pushFollow(FOLLOW_16);
+            rule__IntegerIterate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__4"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__4__Impl"
+    // InternalEntityMockDSL.g:12115:1: rule__IntegerIterate__Group__4__Impl : ( 'step' ) ;
+    public final void rule__IntegerIterate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12119:1: ( ( 'step' ) )
+            // InternalEntityMockDSL.g:12120:1: ( 'step' )
+            {
+            // InternalEntityMockDSL.g:12120:1: ( 'step' )
+            // InternalEntityMockDSL.g:12121:2: 'step'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getStepKeyword_4()); 
+            }
+            match(input,110,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getStepKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__5"
+    // InternalEntityMockDSL.g:12130:1: rule__IntegerIterate__Group__5 : rule__IntegerIterate__Group__5__Impl ;
+    public final void rule__IntegerIterate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12134:1: ( rule__IntegerIterate__Group__5__Impl )
+            // InternalEntityMockDSL.g:12135:2: rule__IntegerIterate__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__5"
+
+
+    // $ANTLR start "rule__IntegerIterate__Group__5__Impl"
+    // InternalEntityMockDSL.g:12141:1: rule__IntegerIterate__Group__5__Impl : ( ( rule__IntegerIterate__StepAssignment_5 ) ) ;
+    public final void rule__IntegerIterate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12145:1: ( ( ( rule__IntegerIterate__StepAssignment_5 ) ) )
+            // InternalEntityMockDSL.g:12146:1: ( ( rule__IntegerIterate__StepAssignment_5 ) )
+            {
+            // InternalEntityMockDSL.g:12146:1: ( ( rule__IntegerIterate__StepAssignment_5 ) )
+            // InternalEntityMockDSL.g:12147:2: ( rule__IntegerIterate__StepAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getStepAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:12148:2: ( rule__IntegerIterate__StepAssignment_5 )
+            // InternalEntityMockDSL.g:12148:3: rule__IntegerIterate__StepAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__IntegerIterate__StepAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getStepAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__0"
+    // InternalEntityMockDSL.g:12157:1: rule__DateIterate__Group__0 : rule__DateIterate__Group__0__Impl rule__DateIterate__Group__1 ;
+    public final void rule__DateIterate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12161:1: ( rule__DateIterate__Group__0__Impl rule__DateIterate__Group__1 )
+            // InternalEntityMockDSL.g:12162:2: rule__DateIterate__Group__0__Impl rule__DateIterate__Group__1
+            {
+            pushFollow(FOLLOW_86);
+            rule__DateIterate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__0"
+
+
+    // $ANTLR start "rule__DateIterate__Group__0__Impl"
+    // InternalEntityMockDSL.g:12169:1: rule__DateIterate__Group__0__Impl : ( 'dateFrom' ) ;
+    public final void rule__DateIterate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12173:1: ( ( 'dateFrom' ) )
+            // InternalEntityMockDSL.g:12174:1: ( 'dateFrom' )
+            {
+            // InternalEntityMockDSL.g:12174:1: ( 'dateFrom' )
+            // InternalEntityMockDSL.g:12175:2: 'dateFrom'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getDateFromKeyword_0()); 
+            }
+            match(input,111,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getDateFromKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__1"
+    // InternalEntityMockDSL.g:12184:1: rule__DateIterate__Group__1 : rule__DateIterate__Group__1__Impl rule__DateIterate__Group__2 ;
+    public final void rule__DateIterate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12188:1: ( rule__DateIterate__Group__1__Impl rule__DateIterate__Group__2 )
+            // InternalEntityMockDSL.g:12189:2: rule__DateIterate__Group__1__Impl rule__DateIterate__Group__2
+            {
+            pushFollow(FOLLOW_57);
+            rule__DateIterate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__1"
+
+
+    // $ANTLR start "rule__DateIterate__Group__1__Impl"
+    // InternalEntityMockDSL.g:12196:1: rule__DateIterate__Group__1__Impl : ( ( rule__DateIterate__FromAssignment_1 ) ) ;
+    public final void rule__DateIterate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12200:1: ( ( ( rule__DateIterate__FromAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:12201:1: ( ( rule__DateIterate__FromAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:12201:1: ( ( rule__DateIterate__FromAssignment_1 ) )
+            // InternalEntityMockDSL.g:12202:2: ( rule__DateIterate__FromAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getFromAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:12203:2: ( rule__DateIterate__FromAssignment_1 )
+            // InternalEntityMockDSL.g:12203:3: rule__DateIterate__FromAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__FromAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getFromAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__2"
+    // InternalEntityMockDSL.g:12211:1: rule__DateIterate__Group__2 : rule__DateIterate__Group__2__Impl rule__DateIterate__Group__3 ;
+    public final void rule__DateIterate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12215:1: ( rule__DateIterate__Group__2__Impl rule__DateIterate__Group__3 )
+            // InternalEntityMockDSL.g:12216:2: rule__DateIterate__Group__2__Impl rule__DateIterate__Group__3
+            {
+            pushFollow(FOLLOW_86);
+            rule__DateIterate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__2"
+
+
+    // $ANTLR start "rule__DateIterate__Group__2__Impl"
+    // InternalEntityMockDSL.g:12223:1: rule__DateIterate__Group__2__Impl : ( 'until' ) ;
+    public final void rule__DateIterate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12227:1: ( ( 'until' ) )
+            // InternalEntityMockDSL.g:12228:1: ( 'until' )
+            {
+            // InternalEntityMockDSL.g:12228:1: ( 'until' )
+            // InternalEntityMockDSL.g:12229:2: 'until'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getUntilKeyword_2()); 
+            }
+            match(input,88,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getUntilKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__3"
+    // InternalEntityMockDSL.g:12238:1: rule__DateIterate__Group__3 : rule__DateIterate__Group__3__Impl rule__DateIterate__Group__4 ;
+    public final void rule__DateIterate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12242:1: ( rule__DateIterate__Group__3__Impl rule__DateIterate__Group__4 )
+            // InternalEntityMockDSL.g:12243:2: rule__DateIterate__Group__3__Impl rule__DateIterate__Group__4
+            {
+            pushFollow(FOLLOW_87);
+            rule__DateIterate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__3"
+
+
+    // $ANTLR start "rule__DateIterate__Group__3__Impl"
+    // InternalEntityMockDSL.g:12250:1: rule__DateIterate__Group__3__Impl : ( ( rule__DateIterate__UntilAssignment_3 ) ) ;
+    public final void rule__DateIterate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12254:1: ( ( ( rule__DateIterate__UntilAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:12255:1: ( ( rule__DateIterate__UntilAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:12255:1: ( ( rule__DateIterate__UntilAssignment_3 ) )
+            // InternalEntityMockDSL.g:12256:2: ( rule__DateIterate__UntilAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getUntilAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:12257:2: ( rule__DateIterate__UntilAssignment_3 )
+            // InternalEntityMockDSL.g:12257:3: rule__DateIterate__UntilAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__UntilAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getUntilAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__4"
+    // InternalEntityMockDSL.g:12265:1: rule__DateIterate__Group__4 : rule__DateIterate__Group__4__Impl rule__DateIterate__Group__5 ;
+    public final void rule__DateIterate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12269:1: ( rule__DateIterate__Group__4__Impl rule__DateIterate__Group__5 )
+            // InternalEntityMockDSL.g:12270:2: rule__DateIterate__Group__4__Impl rule__DateIterate__Group__5
+            {
+            pushFollow(FOLLOW_16);
+            rule__DateIterate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__4"
+
+
+    // $ANTLR start "rule__DateIterate__Group__4__Impl"
+    // InternalEntityMockDSL.g:12277:1: rule__DateIterate__Group__4__Impl : ( 'every' ) ;
+    public final void rule__DateIterate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12281:1: ( ( 'every' ) )
+            // InternalEntityMockDSL.g:12282:1: ( 'every' )
+            {
+            // InternalEntityMockDSL.g:12282:1: ( 'every' )
+            // InternalEntityMockDSL.g:12283:2: 'every'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getEveryKeyword_4()); 
+            }
+            match(input,112,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getEveryKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__5"
+    // InternalEntityMockDSL.g:12292:1: rule__DateIterate__Group__5 : rule__DateIterate__Group__5__Impl rule__DateIterate__Group__6 ;
+    public final void rule__DateIterate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12296:1: ( rule__DateIterate__Group__5__Impl rule__DateIterate__Group__6 )
+            // InternalEntityMockDSL.g:12297:2: rule__DateIterate__Group__5__Impl rule__DateIterate__Group__6
+            {
+            pushFollow(FOLLOW_88);
+            rule__DateIterate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__5"
+
+
+    // $ANTLR start "rule__DateIterate__Group__5__Impl"
+    // InternalEntityMockDSL.g:12304:1: rule__DateIterate__Group__5__Impl : ( ( rule__DateIterate__StepCountAssignment_5 ) ) ;
+    public final void rule__DateIterate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12308:1: ( ( ( rule__DateIterate__StepCountAssignment_5 ) ) )
+            // InternalEntityMockDSL.g:12309:1: ( ( rule__DateIterate__StepCountAssignment_5 ) )
+            {
+            // InternalEntityMockDSL.g:12309:1: ( ( rule__DateIterate__StepCountAssignment_5 ) )
+            // InternalEntityMockDSL.g:12310:2: ( rule__DateIterate__StepCountAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getStepCountAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:12311:2: ( rule__DateIterate__StepCountAssignment_5 )
+            // InternalEntityMockDSL.g:12311:3: rule__DateIterate__StepCountAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__StepCountAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getStepCountAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__DateIterate__Group__6"
+    // InternalEntityMockDSL.g:12319:1: rule__DateIterate__Group__6 : rule__DateIterate__Group__6__Impl ;
+    public final void rule__DateIterate__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12323:1: ( rule__DateIterate__Group__6__Impl )
+            // InternalEntityMockDSL.g:12324:2: rule__DateIterate__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__6"
+
+
+    // $ANTLR start "rule__DateIterate__Group__6__Impl"
+    // InternalEntityMockDSL.g:12330:1: rule__DateIterate__Group__6__Impl : ( ( rule__DateIterate__StepTypeAssignment_6 ) ) ;
+    public final void rule__DateIterate__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12334:1: ( ( ( rule__DateIterate__StepTypeAssignment_6 ) ) )
+            // InternalEntityMockDSL.g:12335:1: ( ( rule__DateIterate__StepTypeAssignment_6 ) )
+            {
+            // InternalEntityMockDSL.g:12335:1: ( ( rule__DateIterate__StepTypeAssignment_6 ) )
+            // InternalEntityMockDSL.g:12336:2: ( rule__DateIterate__StepTypeAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getStepTypeAssignment_6()); 
+            }
+            // InternalEntityMockDSL.g:12337:2: ( rule__DateIterate__StepTypeAssignment_6 )
+            // InternalEntityMockDSL.g:12337:3: rule__DateIterate__StepTypeAssignment_6
+            {
+            pushFollow(FOLLOW_2);
+            rule__DateIterate__StepTypeAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getStepTypeAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Date__Group_3__0"
+    // InternalEntityMockDSL.g:12346:1: rule__Date__Group_3__0 : rule__Date__Group_3__0__Impl rule__Date__Group_3__1 ;
+    public final void rule__Date__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12350:1: ( rule__Date__Group_3__0__Impl rule__Date__Group_3__1 )
+            // InternalEntityMockDSL.g:12351:2: rule__Date__Group_3__0__Impl rule__Date__Group_3__1
+            {
+            pushFollow(FOLLOW_89);
+            rule__Date__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Date__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__0"
+
+
+    // $ANTLR start "rule__Date__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:12358:1: rule__Date__Group_3__0__Impl : ( ( rule__Date__YearAssignment_3_0 ) ) ;
+    public final void rule__Date__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12362:1: ( ( ( rule__Date__YearAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:12363:1: ( ( rule__Date__YearAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:12363:1: ( ( rule__Date__YearAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:12364:2: ( rule__Date__YearAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getYearAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:12365:2: ( rule__Date__YearAssignment_3_0 )
+            // InternalEntityMockDSL.g:12365:3: rule__Date__YearAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__Date__YearAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getYearAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__Date__Group_3__1"
+    // InternalEntityMockDSL.g:12373:1: rule__Date__Group_3__1 : rule__Date__Group_3__1__Impl rule__Date__Group_3__2 ;
+    public final void rule__Date__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12377:1: ( rule__Date__Group_3__1__Impl rule__Date__Group_3__2 )
+            // InternalEntityMockDSL.g:12378:2: rule__Date__Group_3__1__Impl rule__Date__Group_3__2
+            {
+            pushFollow(FOLLOW_16);
+            rule__Date__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Date__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__1"
+
+
+    // $ANTLR start "rule__Date__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:12385:1: rule__Date__Group_3__1__Impl : ( '-' ) ;
+    public final void rule__Date__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12389:1: ( ( '-' ) )
+            // InternalEntityMockDSL.g:12390:1: ( '-' )
+            {
+            // InternalEntityMockDSL.g:12390:1: ( '-' )
+            // InternalEntityMockDSL.g:12391:2: '-'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1()); 
+            }
+            match(input,36,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__Date__Group_3__2"
+    // InternalEntityMockDSL.g:12400:1: rule__Date__Group_3__2 : rule__Date__Group_3__2__Impl rule__Date__Group_3__3 ;
+    public final void rule__Date__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12404:1: ( rule__Date__Group_3__2__Impl rule__Date__Group_3__3 )
+            // InternalEntityMockDSL.g:12405:2: rule__Date__Group_3__2__Impl rule__Date__Group_3__3
+            {
+            pushFollow(FOLLOW_89);
+            rule__Date__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Date__Group_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__2"
+
+
+    // $ANTLR start "rule__Date__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:12412:1: rule__Date__Group_3__2__Impl : ( ( rule__Date__MonthAssignment_3_2 ) ) ;
+    public final void rule__Date__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12416:1: ( ( ( rule__Date__MonthAssignment_3_2 ) ) )
+            // InternalEntityMockDSL.g:12417:1: ( ( rule__Date__MonthAssignment_3_2 ) )
+            {
+            // InternalEntityMockDSL.g:12417:1: ( ( rule__Date__MonthAssignment_3_2 ) )
+            // InternalEntityMockDSL.g:12418:2: ( rule__Date__MonthAssignment_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getMonthAssignment_3_2()); 
+            }
+            // InternalEntityMockDSL.g:12419:2: ( rule__Date__MonthAssignment_3_2 )
+            // InternalEntityMockDSL.g:12419:3: rule__Date__MonthAssignment_3_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__Date__MonthAssignment_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getMonthAssignment_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__Date__Group_3__3"
+    // InternalEntityMockDSL.g:12427:1: rule__Date__Group_3__3 : rule__Date__Group_3__3__Impl rule__Date__Group_3__4 ;
+    public final void rule__Date__Group_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12431:1: ( rule__Date__Group_3__3__Impl rule__Date__Group_3__4 )
+            // InternalEntityMockDSL.g:12432:2: rule__Date__Group_3__3__Impl rule__Date__Group_3__4
+            {
+            pushFollow(FOLLOW_16);
+            rule__Date__Group_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Date__Group_3__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__3"
+
+
+    // $ANTLR start "rule__Date__Group_3__3__Impl"
+    // InternalEntityMockDSL.g:12439:1: rule__Date__Group_3__3__Impl : ( '-' ) ;
+    public final void rule__Date__Group_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12443:1: ( ( '-' ) )
+            // InternalEntityMockDSL.g:12444:1: ( '-' )
+            {
+            // InternalEntityMockDSL.g:12444:1: ( '-' )
+            // InternalEntityMockDSL.g:12445:2: '-'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3()); 
+            }
+            match(input,36,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__3__Impl"
+
+
+    // $ANTLR start "rule__Date__Group_3__4"
+    // InternalEntityMockDSL.g:12454:1: rule__Date__Group_3__4 : rule__Date__Group_3__4__Impl ;
+    public final void rule__Date__Group_3__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12458:1: ( rule__Date__Group_3__4__Impl )
+            // InternalEntityMockDSL.g:12459:2: rule__Date__Group_3__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Date__Group_3__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__4"
+
+
+    // $ANTLR start "rule__Date__Group_3__4__Impl"
+    // InternalEntityMockDSL.g:12465:1: rule__Date__Group_3__4__Impl : ( ( rule__Date__DayAssignment_3_4 ) ) ;
+    public final void rule__Date__Group_3__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12469:1: ( ( ( rule__Date__DayAssignment_3_4 ) ) )
+            // InternalEntityMockDSL.g:12470:1: ( ( rule__Date__DayAssignment_3_4 ) )
+            {
+            // InternalEntityMockDSL.g:12470:1: ( ( rule__Date__DayAssignment_3_4 ) )
+            // InternalEntityMockDSL.g:12471:2: ( rule__Date__DayAssignment_3_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getDayAssignment_3_4()); 
+            }
+            // InternalEntityMockDSL.g:12472:2: ( rule__Date__DayAssignment_3_4 )
+            // InternalEntityMockDSL.g:12472:3: rule__Date__DayAssignment_3_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__Date__DayAssignment_3_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getDayAssignment_3_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__Group_3__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__0"
+    // InternalEntityMockDSL.g:12481:1: rule__EntityMockByResourceAttribute__Group__0 : rule__EntityMockByResourceAttribute__Group__0__Impl rule__EntityMockByResourceAttribute__Group__1 ;
+    public final void rule__EntityMockByResourceAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12485:1: ( rule__EntityMockByResourceAttribute__Group__0__Impl rule__EntityMockByResourceAttribute__Group__1 )
+            // InternalEntityMockDSL.g:12486:2: rule__EntityMockByResourceAttribute__Group__0__Impl rule__EntityMockByResourceAttribute__Group__1
+            {
+            pushFollow(FOLLOW_90);
+            rule__EntityMockByResourceAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__0__Impl"
+    // InternalEntityMockDSL.g:12493:1: rule__EntityMockByResourceAttribute__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockByResourceAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12497:1: ( ( () ) )
+            // InternalEntityMockDSL.g:12498:1: ( () )
+            {
+            // InternalEntityMockDSL.g:12498:1: ( () )
+            // InternalEntityMockDSL.g:12499:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:12500:2: ()
+            // InternalEntityMockDSL.g:12500:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__1"
+    // InternalEntityMockDSL.g:12508:1: rule__EntityMockByResourceAttribute__Group__1 : rule__EntityMockByResourceAttribute__Group__1__Impl rule__EntityMockByResourceAttribute__Group__2 ;
+    public final void rule__EntityMockByResourceAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12512:1: ( rule__EntityMockByResourceAttribute__Group__1__Impl rule__EntityMockByResourceAttribute__Group__2 )
+            // InternalEntityMockDSL.g:12513:2: rule__EntityMockByResourceAttribute__Group__1__Impl rule__EntityMockByResourceAttribute__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockByResourceAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__1__Impl"
+    // InternalEntityMockDSL.g:12520:1: rule__EntityMockByResourceAttribute__Group__1__Impl : ( 'var' ) ;
+    public final void rule__EntityMockByResourceAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12524:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:12525:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:12525:1: ( 'var' )
+            // InternalEntityMockDSL.g:12526:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__2"
+    // InternalEntityMockDSL.g:12535:1: rule__EntityMockByResourceAttribute__Group__2 : rule__EntityMockByResourceAttribute__Group__2__Impl rule__EntityMockByResourceAttribute__Group__3 ;
+    public final void rule__EntityMockByResourceAttribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12539:1: ( rule__EntityMockByResourceAttribute__Group__2__Impl rule__EntityMockByResourceAttribute__Group__3 )
+            // InternalEntityMockDSL.g:12540:2: rule__EntityMockByResourceAttribute__Group__2__Impl rule__EntityMockByResourceAttribute__Group__3
+            {
+            pushFollow(FOLLOW_91);
+            rule__EntityMockByResourceAttribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__2__Impl"
+    // InternalEntityMockDSL.g:12547:1: rule__EntityMockByResourceAttribute__Group__2__Impl : ( ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 ) ) ;
+    public final void rule__EntityMockByResourceAttribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12551:1: ( ( ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:12552:1: ( ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:12552:1: ( ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 ) )
+            // InternalEntityMockDSL.g:12553:2: ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:12554:2: ( rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 )
+            // InternalEntityMockDSL.g:12554:3: rule__EntityMockByResourceAttribute__AttributeRefAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__AttributeRefAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__3"
+    // InternalEntityMockDSL.g:12562:1: rule__EntityMockByResourceAttribute__Group__3 : rule__EntityMockByResourceAttribute__Group__3__Impl rule__EntityMockByResourceAttribute__Group__4 ;
+    public final void rule__EntityMockByResourceAttribute__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12566:1: ( rule__EntityMockByResourceAttribute__Group__3__Impl rule__EntityMockByResourceAttribute__Group__4 )
+            // InternalEntityMockDSL.g:12567:2: rule__EntityMockByResourceAttribute__Group__3__Impl rule__EntityMockByResourceAttribute__Group__4
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockByResourceAttribute__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__3__Impl"
+    // InternalEntityMockDSL.g:12574:1: rule__EntityMockByResourceAttribute__Group__3__Impl : ( 'as' ) ;
+    public final void rule__EntityMockByResourceAttribute__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12578:1: ( ( 'as' ) )
+            // InternalEntityMockDSL.g:12579:1: ( 'as' )
+            {
+            // InternalEntityMockDSL.g:12579:1: ( 'as' )
+            // InternalEntityMockDSL.g:12580:2: 'as'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3()); 
+            }
+            match(input,113,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__4"
+    // InternalEntityMockDSL.g:12589:1: rule__EntityMockByResourceAttribute__Group__4 : rule__EntityMockByResourceAttribute__Group__4__Impl ;
+    public final void rule__EntityMockByResourceAttribute__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12593:1: ( rule__EntityMockByResourceAttribute__Group__4__Impl )
+            // InternalEntityMockDSL.g:12594:2: rule__EntityMockByResourceAttribute__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__Group__4__Impl"
+    // InternalEntityMockDSL.g:12600:1: rule__EntityMockByResourceAttribute__Group__4__Impl : ( ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 ) ) ;
+    public final void rule__EntityMockByResourceAttribute__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12604:1: ( ( ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:12605:1: ( ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:12605:1: ( ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 ) )
+            // InternalEntityMockDSL.g:12606:2: ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:12607:2: ( rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 )
+            // InternalEntityMockDSL.g:12607:3: rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__0"
+    // InternalEntityMockDSL.g:12616:1: rule__EntityMockTemplate__Group__0 : rule__EntityMockTemplate__Group__0__Impl rule__EntityMockTemplate__Group__1 ;
+    public final void rule__EntityMockTemplate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12620:1: ( rule__EntityMockTemplate__Group__0__Impl rule__EntityMockTemplate__Group__1 )
+            // InternalEntityMockDSL.g:12621:2: rule__EntityMockTemplate__Group__0__Impl rule__EntityMockTemplate__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockTemplate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__0__Impl"
+    // InternalEntityMockDSL.g:12628:1: rule__EntityMockTemplate__Group__0__Impl : ( 'template' ) ;
+    public final void rule__EntityMockTemplate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12632:1: ( ( 'template' ) )
+            // InternalEntityMockDSL.g:12633:1: ( 'template' )
+            {
+            // InternalEntityMockDSL.g:12633:1: ( 'template' )
+            // InternalEntityMockDSL.g:12634:2: 'template'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0()); 
+            }
+            match(input,114,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__1"
+    // InternalEntityMockDSL.g:12643:1: rule__EntityMockTemplate__Group__1 : rule__EntityMockTemplate__Group__1__Impl rule__EntityMockTemplate__Group__2 ;
+    public final void rule__EntityMockTemplate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12647:1: ( rule__EntityMockTemplate__Group__1__Impl rule__EntityMockTemplate__Group__2 )
+            // InternalEntityMockDSL.g:12648:2: rule__EntityMockTemplate__Group__1__Impl rule__EntityMockTemplate__Group__2
+            {
+            pushFollow(FOLLOW_92);
+            rule__EntityMockTemplate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__1__Impl"
+    // InternalEntityMockDSL.g:12655:1: rule__EntityMockTemplate__Group__1__Impl : ( ( rule__EntityMockTemplate__NameAssignment_1 ) ) ;
+    public final void rule__EntityMockTemplate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12659:1: ( ( ( rule__EntityMockTemplate__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:12660:1: ( ( rule__EntityMockTemplate__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:12660:1: ( ( rule__EntityMockTemplate__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:12661:2: ( rule__EntityMockTemplate__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:12662:2: ( rule__EntityMockTemplate__NameAssignment_1 )
+            // InternalEntityMockDSL.g:12662:3: rule__EntityMockTemplate__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__2"
+    // InternalEntityMockDSL.g:12670:1: rule__EntityMockTemplate__Group__2 : rule__EntityMockTemplate__Group__2__Impl rule__EntityMockTemplate__Group__3 ;
+    public final void rule__EntityMockTemplate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12674:1: ( rule__EntityMockTemplate__Group__2__Impl rule__EntityMockTemplate__Group__3 )
+            // InternalEntityMockDSL.g:12675:2: rule__EntityMockTemplate__Group__2__Impl rule__EntityMockTemplate__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockTemplate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__2__Impl"
+    // InternalEntityMockDSL.g:12682:1: rule__EntityMockTemplate__Group__2__Impl : ( 'byObject' ) ;
+    public final void rule__EntityMockTemplate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12686:1: ( ( 'byObject' ) )
+            // InternalEntityMockDSL.g:12687:1: ( 'byObject' )
+            {
+            // InternalEntityMockDSL.g:12687:1: ( 'byObject' )
+            // InternalEntityMockDSL.g:12688:2: 'byObject'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2()); 
+            }
+            match(input,115,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__3"
+    // InternalEntityMockDSL.g:12697:1: rule__EntityMockTemplate__Group__3 : rule__EntityMockTemplate__Group__3__Impl ;
+    public final void rule__EntityMockTemplate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12701:1: ( rule__EntityMockTemplate__Group__3__Impl )
+            // InternalEntityMockDSL.g:12702:2: rule__EntityMockTemplate__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__Group__3__Impl"
+    // InternalEntityMockDSL.g:12708:1: rule__EntityMockTemplate__Group__3__Impl : ( ( rule__EntityMockTemplate__ObjectAssignment_3 ) ) ;
+    public final void rule__EntityMockTemplate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12712:1: ( ( ( rule__EntityMockTemplate__ObjectAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:12713:1: ( ( rule__EntityMockTemplate__ObjectAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:12713:1: ( ( rule__EntityMockTemplate__ObjectAssignment_3 ) )
+            // InternalEntityMockDSL.g:12714:2: ( rule__EntityMockTemplate__ObjectAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getObjectAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:12715:2: ( rule__EntityMockTemplate__ObjectAssignment_3 )
+            // InternalEntityMockDSL.g:12715:3: rule__EntityMockTemplate__ObjectAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockTemplate__ObjectAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getObjectAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__0"
+    // InternalEntityMockDSL.g:12724:1: rule__EntityMockEntityFunction__Group__0 : rule__EntityMockEntityFunction__Group__0__Impl rule__EntityMockEntityFunction__Group__1 ;
+    public final void rule__EntityMockEntityFunction__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12728:1: ( rule__EntityMockEntityFunction__Group__0__Impl rule__EntityMockEntityFunction__Group__1 )
+            // InternalEntityMockDSL.g:12729:2: rule__EntityMockEntityFunction__Group__0__Impl rule__EntityMockEntityFunction__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntityFunction__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__0__Impl"
+    // InternalEntityMockDSL.g:12736:1: rule__EntityMockEntityFunction__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockEntityFunction__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12740:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:12741:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:12741:1: ( 'var' )
+            // InternalEntityMockDSL.g:12742:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__1"
+    // InternalEntityMockDSL.g:12751:1: rule__EntityMockEntityFunction__Group__1 : rule__EntityMockEntityFunction__Group__1__Impl rule__EntityMockEntityFunction__Group__2 ;
+    public final void rule__EntityMockEntityFunction__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12755:1: ( rule__EntityMockEntityFunction__Group__1__Impl rule__EntityMockEntityFunction__Group__2 )
+            // InternalEntityMockDSL.g:12756:2: rule__EntityMockEntityFunction__Group__1__Impl rule__EntityMockEntityFunction__Group__2
+            {
+            pushFollow(FOLLOW_93);
+            rule__EntityMockEntityFunction__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__1__Impl"
+    // InternalEntityMockDSL.g:12763:1: rule__EntityMockEntityFunction__Group__1__Impl : ( ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 ) ) ;
+    public final void rule__EntityMockEntityFunction__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12767:1: ( ( ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:12768:1: ( ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:12768:1: ( ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 ) )
+            // InternalEntityMockDSL.g:12769:2: ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:12770:2: ( rule__EntityMockEntityFunction__AttributeRefAssignment_1 )
+            // InternalEntityMockDSL.g:12770:3: rule__EntityMockEntityFunction__AttributeRefAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__AttributeRefAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__2"
+    // InternalEntityMockDSL.g:12778:1: rule__EntityMockEntityFunction__Group__2 : rule__EntityMockEntityFunction__Group__2__Impl rule__EntityMockEntityFunction__Group__3 ;
+    public final void rule__EntityMockEntityFunction__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12782:1: ( rule__EntityMockEntityFunction__Group__2__Impl rule__EntityMockEntityFunction__Group__3 )
+            // InternalEntityMockDSL.g:12783:2: rule__EntityMockEntityFunction__Group__2__Impl rule__EntityMockEntityFunction__Group__3
+            {
+            pushFollow(FOLLOW_27);
+            rule__EntityMockEntityFunction__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__2__Impl"
+    // InternalEntityMockDSL.g:12790:1: rule__EntityMockEntityFunction__Group__2__Impl : ( 'calculateOn' ) ;
+    public final void rule__EntityMockEntityFunction__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12794:1: ( ( 'calculateOn' ) )
+            // InternalEntityMockDSL.g:12795:1: ( 'calculateOn' )
+            {
+            // InternalEntityMockDSL.g:12795:1: ( 'calculateOn' )
+            // InternalEntityMockDSL.g:12796:2: 'calculateOn'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2()); 
+            }
+            match(input,116,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__3"
+    // InternalEntityMockDSL.g:12805:1: rule__EntityMockEntityFunction__Group__3 : rule__EntityMockEntityFunction__Group__3__Impl rule__EntityMockEntityFunction__Group__4 ;
+    public final void rule__EntityMockEntityFunction__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12809:1: ( rule__EntityMockEntityFunction__Group__3__Impl rule__EntityMockEntityFunction__Group__4 )
+            // InternalEntityMockDSL.g:12810:2: rule__EntityMockEntityFunction__Group__3__Impl rule__EntityMockEntityFunction__Group__4
+            {
+            pushFollow(FOLLOW_28);
+            rule__EntityMockEntityFunction__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__3__Impl"
+    // InternalEntityMockDSL.g:12817:1: rule__EntityMockEntityFunction__Group__3__Impl : ( '(' ) ;
+    public final void rule__EntityMockEntityFunction__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12821:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:12822:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:12822:1: ( '(' )
+            // InternalEntityMockDSL.g:12823:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__4"
+    // InternalEntityMockDSL.g:12832:1: rule__EntityMockEntityFunction__Group__4 : rule__EntityMockEntityFunction__Group__4__Impl rule__EntityMockEntityFunction__Group__5 ;
+    public final void rule__EntityMockEntityFunction__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12836:1: ( rule__EntityMockEntityFunction__Group__4__Impl rule__EntityMockEntityFunction__Group__5 )
+            // InternalEntityMockDSL.g:12837:2: rule__EntityMockEntityFunction__Group__4__Impl rule__EntityMockEntityFunction__Group__5
+            {
+            pushFollow(FOLLOW_28);
+            rule__EntityMockEntityFunction__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__4__Impl"
+    // InternalEntityMockDSL.g:12844:1: rule__EntityMockEntityFunction__Group__4__Impl : ( ( rule__EntityMockEntityFunction__Group_4__0 )? ) ;
+    public final void rule__EntityMockEntityFunction__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12848:1: ( ( ( rule__EntityMockEntityFunction__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:12849:1: ( ( rule__EntityMockEntityFunction__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:12849:1: ( ( rule__EntityMockEntityFunction__Group_4__0 )? )
+            // InternalEntityMockDSL.g:12850:2: ( rule__EntityMockEntityFunction__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:12851:2: ( rule__EntityMockEntityFunction__Group_4__0 )?
+            int alt118=2;
+            int LA118_0 = input.LA(1);
+
+            if ( (LA118_0==RULE_ID) ) {
+                alt118=1;
+            }
+            switch (alt118) {
+                case 1 :
+                    // InternalEntityMockDSL.g:12851:3: rule__EntityMockEntityFunction__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntityFunction__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__5"
+    // InternalEntityMockDSL.g:12859:1: rule__EntityMockEntityFunction__Group__5 : rule__EntityMockEntityFunction__Group__5__Impl rule__EntityMockEntityFunction__Group__6 ;
+    public final void rule__EntityMockEntityFunction__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12863:1: ( rule__EntityMockEntityFunction__Group__5__Impl rule__EntityMockEntityFunction__Group__6 )
+            // InternalEntityMockDSL.g:12864:2: rule__EntityMockEntityFunction__Group__5__Impl rule__EntityMockEntityFunction__Group__6
+            {
+            pushFollow(FOLLOW_8);
+            rule__EntityMockEntityFunction__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__5"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__5__Impl"
+    // InternalEntityMockDSL.g:12871:1: rule__EntityMockEntityFunction__Group__5__Impl : ( ')' ) ;
+    public final void rule__EntityMockEntityFunction__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12875:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:12876:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:12876:1: ( ')' )
+            // InternalEntityMockDSL.g:12877:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__6"
+    // InternalEntityMockDSL.g:12886:1: rule__EntityMockEntityFunction__Group__6 : rule__EntityMockEntityFunction__Group__6__Impl ;
+    public final void rule__EntityMockEntityFunction__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12890:1: ( rule__EntityMockEntityFunction__Group__6__Impl )
+            // InternalEntityMockDSL.g:12891:2: rule__EntityMockEntityFunction__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__6"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group__6__Impl"
+    // InternalEntityMockDSL.g:12897:1: rule__EntityMockEntityFunction__Group__6__Impl : ( ( rule__EntityMockEntityFunction__BodyAssignment_6 ) ) ;
+    public final void rule__EntityMockEntityFunction__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12901:1: ( ( ( rule__EntityMockEntityFunction__BodyAssignment_6 ) ) )
+            // InternalEntityMockDSL.g:12902:1: ( ( rule__EntityMockEntityFunction__BodyAssignment_6 ) )
+            {
+            // InternalEntityMockDSL.g:12902:1: ( ( rule__EntityMockEntityFunction__BodyAssignment_6 ) )
+            // InternalEntityMockDSL.g:12903:2: ( rule__EntityMockEntityFunction__BodyAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getBodyAssignment_6()); 
+            }
+            // InternalEntityMockDSL.g:12904:2: ( rule__EntityMockEntityFunction__BodyAssignment_6 )
+            // InternalEntityMockDSL.g:12904:3: rule__EntityMockEntityFunction__BodyAssignment_6
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__BodyAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getBodyAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4__0"
+    // InternalEntityMockDSL.g:12913:1: rule__EntityMockEntityFunction__Group_4__0 : rule__EntityMockEntityFunction__Group_4__0__Impl rule__EntityMockEntityFunction__Group_4__1 ;
+    public final void rule__EntityMockEntityFunction__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12917:1: ( rule__EntityMockEntityFunction__Group_4__0__Impl rule__EntityMockEntityFunction__Group_4__1 )
+            // InternalEntityMockDSL.g:12918:2: rule__EntityMockEntityFunction__Group_4__0__Impl rule__EntityMockEntityFunction__Group_4__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__EntityMockEntityFunction__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4__0"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:12925:1: rule__EntityMockEntityFunction__Group_4__0__Impl : ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 ) ) ;
+    public final void rule__EntityMockEntityFunction__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12929:1: ( ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 ) ) )
+            // InternalEntityMockDSL.g:12930:1: ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 ) )
+            {
+            // InternalEntityMockDSL.g:12930:1: ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 ) )
+            // InternalEntityMockDSL.g:12931:2: ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_0()); 
+            }
+            // InternalEntityMockDSL.g:12932:2: ( rule__EntityMockEntityFunction__ParamsAssignment_4_0 )
+            // InternalEntityMockDSL.g:12932:3: rule__EntityMockEntityFunction__ParamsAssignment_4_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__ParamsAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4__1"
+    // InternalEntityMockDSL.g:12940:1: rule__EntityMockEntityFunction__Group_4__1 : rule__EntityMockEntityFunction__Group_4__1__Impl ;
+    public final void rule__EntityMockEntityFunction__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12944:1: ( rule__EntityMockEntityFunction__Group_4__1__Impl )
+            // InternalEntityMockDSL.g:12945:2: rule__EntityMockEntityFunction__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4__1"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:12951:1: rule__EntityMockEntityFunction__Group_4__1__Impl : ( ( rule__EntityMockEntityFunction__Group_4_1__0 )* ) ;
+    public final void rule__EntityMockEntityFunction__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12955:1: ( ( ( rule__EntityMockEntityFunction__Group_4_1__0 )* ) )
+            // InternalEntityMockDSL.g:12956:1: ( ( rule__EntityMockEntityFunction__Group_4_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:12956:1: ( ( rule__EntityMockEntityFunction__Group_4_1__0 )* )
+            // InternalEntityMockDSL.g:12957:2: ( rule__EntityMockEntityFunction__Group_4_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4_1()); 
+            }
+            // InternalEntityMockDSL.g:12958:2: ( rule__EntityMockEntityFunction__Group_4_1__0 )*
+            loop119:
+            do {
+                int alt119=2;
+                int LA119_0 = input.LA(1);
+
+                if ( (LA119_0==70) ) {
+                    alt119=1;
+                }
+
+
+                switch (alt119) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:12958:3: rule__EntityMockEntityFunction__Group_4_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__EntityMockEntityFunction__Group_4_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop119;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getGroup_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4_1__0"
+    // InternalEntityMockDSL.g:12967:1: rule__EntityMockEntityFunction__Group_4_1__0 : rule__EntityMockEntityFunction__Group_4_1__0__Impl rule__EntityMockEntityFunction__Group_4_1__1 ;
+    public final void rule__EntityMockEntityFunction__Group_4_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12971:1: ( rule__EntityMockEntityFunction__Group_4_1__0__Impl rule__EntityMockEntityFunction__Group_4_1__1 )
+            // InternalEntityMockDSL.g:12972:2: rule__EntityMockEntityFunction__Group_4_1__0__Impl rule__EntityMockEntityFunction__Group_4_1__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntityFunction__Group_4_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group_4_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4_1__0"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4_1__0__Impl"
+    // InternalEntityMockDSL.g:12979:1: rule__EntityMockEntityFunction__Group_4_1__0__Impl : ( ',' ) ;
+    public final void rule__EntityMockEntityFunction__Group_4_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12983:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:12984:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:12984:1: ( ',' )
+            // InternalEntityMockDSL.g:12985:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4_1__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4_1__1"
+    // InternalEntityMockDSL.g:12994:1: rule__EntityMockEntityFunction__Group_4_1__1 : rule__EntityMockEntityFunction__Group_4_1__1__Impl ;
+    public final void rule__EntityMockEntityFunction__Group_4_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:12998:1: ( rule__EntityMockEntityFunction__Group_4_1__1__Impl )
+            // InternalEntityMockDSL.g:12999:2: rule__EntityMockEntityFunction__Group_4_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__Group_4_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4_1__1"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__Group_4_1__1__Impl"
+    // InternalEntityMockDSL.g:13005:1: rule__EntityMockEntityFunction__Group_4_1__1__Impl : ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 ) ) ;
+    public final void rule__EntityMockEntityFunction__Group_4_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13009:1: ( ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 ) ) )
+            // InternalEntityMockDSL.g:13010:1: ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:13010:1: ( ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 ) )
+            // InternalEntityMockDSL.g:13011:2: ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_1_1()); 
+            }
+            // InternalEntityMockDSL.g:13012:2: ( rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 )
+            // InternalEntityMockDSL.g:13012:3: rule__EntityMockEntityFunction__ParamsAssignment_4_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityFunction__ParamsAssignment_4_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsAssignment_4_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__Group_4_1__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__0"
+    // InternalEntityMockDSL.g:13021:1: rule__EntityMockEntityNestedAttribute__Group__0 : rule__EntityMockEntityNestedAttribute__Group__0__Impl rule__EntityMockEntityNestedAttribute__Group__1 ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13025:1: ( rule__EntityMockEntityNestedAttribute__Group__0__Impl rule__EntityMockEntityNestedAttribute__Group__1 )
+            // InternalEntityMockDSL.g:13026:2: rule__EntityMockEntityNestedAttribute__Group__0__Impl rule__EntityMockEntityNestedAttribute__Group__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__EntityMockEntityNestedAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__0__Impl"
+    // InternalEntityMockDSL.g:13033:1: rule__EntityMockEntityNestedAttribute__Group__0__Impl : ( ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 ) ) ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13037:1: ( ( ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 ) ) )
+            // InternalEntityMockDSL.g:13038:1: ( ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 ) )
+            {
+            // InternalEntityMockDSL.g:13038:1: ( ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 ) )
+            // InternalEntityMockDSL.g:13039:2: ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:13040:2: ( rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 )
+            // InternalEntityMockDSL.g:13040:3: rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__1"
+    // InternalEntityMockDSL.g:13048:1: rule__EntityMockEntityNestedAttribute__Group__1 : rule__EntityMockEntityNestedAttribute__Group__1__Impl rule__EntityMockEntityNestedAttribute__Group__2 ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13052:1: ( rule__EntityMockEntityNestedAttribute__Group__1__Impl rule__EntityMockEntityNestedAttribute__Group__2 )
+            // InternalEntityMockDSL.g:13053:2: rule__EntityMockEntityNestedAttribute__Group__1__Impl rule__EntityMockEntityNestedAttribute__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockEntityNestedAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__1__Impl"
+    // InternalEntityMockDSL.g:13060:1: rule__EntityMockEntityNestedAttribute__Group__1__Impl : ( '.' ) ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13064:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:13065:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:13065:1: ( '.' )
+            // InternalEntityMockDSL.g:13066:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__2"
+    // InternalEntityMockDSL.g:13075:1: rule__EntityMockEntityNestedAttribute__Group__2 : rule__EntityMockEntityNestedAttribute__Group__2__Impl ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13079:1: ( rule__EntityMockEntityNestedAttribute__Group__2__Impl )
+            // InternalEntityMockDSL.g:13080:2: rule__EntityMockEntityNestedAttribute__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__Group__2__Impl"
+    // InternalEntityMockDSL.g:13086:1: rule__EntityMockEntityNestedAttribute__Group__2__Impl : ( ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 ) ) ;
+    public final void rule__EntityMockEntityNestedAttribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13090:1: ( ( ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:13091:1: ( ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:13091:1: ( ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 ) )
+            // InternalEntityMockDSL.g:13092:2: ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:13093:2: ( rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 )
+            // InternalEntityMockDSL.g:13093:3: rule__EntityMockEntityNestedAttribute__AttributeAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntityNestedAttribute__AttributeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__0"
+    // InternalEntityMockDSL.g:13102:1: rule__EntityMockReferencedObjectAttribute__Group__0 : rule__EntityMockReferencedObjectAttribute__Group__0__Impl rule__EntityMockReferencedObjectAttribute__Group__1 ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13106:1: ( rule__EntityMockReferencedObjectAttribute__Group__0__Impl rule__EntityMockReferencedObjectAttribute__Group__1 )
+            // InternalEntityMockDSL.g:13107:2: rule__EntityMockReferencedObjectAttribute__Group__0__Impl rule__EntityMockReferencedObjectAttribute__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockReferencedObjectAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__0__Impl"
+    // InternalEntityMockDSL.g:13114:1: rule__EntityMockReferencedObjectAttribute__Group__0__Impl : ( () ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13118:1: ( ( () ) )
+            // InternalEntityMockDSL.g:13119:1: ( () )
+            {
+            // InternalEntityMockDSL.g:13119:1: ( () )
+            // InternalEntityMockDSL.g:13120:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0()); 
+            }
+            // InternalEntityMockDSL.g:13121:2: ()
+            // InternalEntityMockDSL.g:13121:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__1"
+    // InternalEntityMockDSL.g:13129:1: rule__EntityMockReferencedObjectAttribute__Group__1 : rule__EntityMockReferencedObjectAttribute__Group__1__Impl rule__EntityMockReferencedObjectAttribute__Group__2 ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13133:1: ( rule__EntityMockReferencedObjectAttribute__Group__1__Impl rule__EntityMockReferencedObjectAttribute__Group__2 )
+            // InternalEntityMockDSL.g:13134:2: rule__EntityMockReferencedObjectAttribute__Group__1__Impl rule__EntityMockReferencedObjectAttribute__Group__2
+            {
+            pushFollow(FOLLOW_94);
+            rule__EntityMockReferencedObjectAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__1__Impl"
+    // InternalEntityMockDSL.g:13141:1: rule__EntityMockReferencedObjectAttribute__Group__1__Impl : ( ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13145:1: ( ( ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:13146:1: ( ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:13146:1: ( ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 ) )
+            // InternalEntityMockDSL.g:13147:2: ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:13148:2: ( rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 )
+            // InternalEntityMockDSL.g:13148:3: rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__2"
+    // InternalEntityMockDSL.g:13156:1: rule__EntityMockReferencedObjectAttribute__Group__2 : rule__EntityMockReferencedObjectAttribute__Group__2__Impl rule__EntityMockReferencedObjectAttribute__Group__3 ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13160:1: ( rule__EntityMockReferencedObjectAttribute__Group__2__Impl rule__EntityMockReferencedObjectAttribute__Group__3 )
+            // InternalEntityMockDSL.g:13161:2: rule__EntityMockReferencedObjectAttribute__Group__2__Impl rule__EntityMockReferencedObjectAttribute__Group__3
+            {
+            pushFollow(FOLLOW_94);
+            rule__EntityMockReferencedObjectAttribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__2__Impl"
+    // InternalEntityMockDSL.g:13168:1: rule__EntityMockReferencedObjectAttribute__Group__2__Impl : ( ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )* ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13172:1: ( ( ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )* ) )
+            // InternalEntityMockDSL.g:13173:1: ( ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:13173:1: ( ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )* )
+            // InternalEntityMockDSL.g:13174:2: ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:13175:2: ( rule__EntityMockReferencedObjectAttribute__Group_2__0 )*
+            loop120:
+            do {
+                int alt120=2;
+                int LA120_0 = input.LA(1);
+
+                if ( (LA120_0==44) ) {
+                    int LA120_1 = input.LA(2);
+
+                    if ( (LA120_1==RULE_ID) ) {
+                        int LA120_3 = input.LA(3);
+
+                        if ( (LA120_3==RULE_ID||LA120_3==44) ) {
+                            alt120=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA120_0==RULE_ID) ) {
+                    alt120=1;
+                }
+
+
+                switch (alt120) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:13175:3: rule__EntityMockReferencedObjectAttribute__Group_2__0
+            	    {
+            	    pushFollow(FOLLOW_95);
+            	    rule__EntityMockReferencedObjectAttribute__Group_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop120;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__3"
+    // InternalEntityMockDSL.g:13183:1: rule__EntityMockReferencedObjectAttribute__Group__3 : rule__EntityMockReferencedObjectAttribute__Group__3__Impl rule__EntityMockReferencedObjectAttribute__Group__4 ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13187:1: ( rule__EntityMockReferencedObjectAttribute__Group__3__Impl rule__EntityMockReferencedObjectAttribute__Group__4 )
+            // InternalEntityMockDSL.g:13188:2: rule__EntityMockReferencedObjectAttribute__Group__3__Impl rule__EntityMockReferencedObjectAttribute__Group__4
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockReferencedObjectAttribute__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__3__Impl"
+    // InternalEntityMockDSL.g:13195:1: rule__EntityMockReferencedObjectAttribute__Group__3__Impl : ( '.' ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13199:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:13200:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:13200:1: ( '.' )
+            // InternalEntityMockDSL.g:13201:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__4"
+    // InternalEntityMockDSL.g:13210:1: rule__EntityMockReferencedObjectAttribute__Group__4 : rule__EntityMockReferencedObjectAttribute__Group__4__Impl ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13214:1: ( rule__EntityMockReferencedObjectAttribute__Group__4__Impl )
+            // InternalEntityMockDSL.g:13215:2: rule__EntityMockReferencedObjectAttribute__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group__4__Impl"
+    // InternalEntityMockDSL.g:13221:1: rule__EntityMockReferencedObjectAttribute__Group__4__Impl : ( ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13225:1: ( ( ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:13226:1: ( ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:13226:1: ( ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 ) )
+            // InternalEntityMockDSL.g:13227:2: ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:13228:2: ( rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 )
+            // InternalEntityMockDSL.g:13228:3: rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group_2__0"
+    // InternalEntityMockDSL.g:13237:1: rule__EntityMockReferencedObjectAttribute__Group_2__0 : rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl rule__EntityMockReferencedObjectAttribute__Group_2__1 ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13241:1: ( rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl rule__EntityMockReferencedObjectAttribute__Group_2__1 )
+            // InternalEntityMockDSL.g:13242:2: rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl rule__EntityMockReferencedObjectAttribute__Group_2__1
+            {
+            pushFollow(FOLLOW_94);
+            rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group_2__0"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:13249:1: rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl : ( ( '.' )? ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13253:1: ( ( ( '.' )? ) )
+            // InternalEntityMockDSL.g:13254:1: ( ( '.' )? )
+            {
+            // InternalEntityMockDSL.g:13254:1: ( ( '.' )? )
+            // InternalEntityMockDSL.g:13255:2: ( '.' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0()); 
+            }
+            // InternalEntityMockDSL.g:13256:2: ( '.' )?
+            int alt121=2;
+            int LA121_0 = input.LA(1);
+
+            if ( (LA121_0==44) ) {
+                alt121=1;
+            }
+            switch (alt121) {
+                case 1 :
+                    // InternalEntityMockDSL.g:13256:3: '.'
+                    {
+                    match(input,44,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group_2__1"
+    // InternalEntityMockDSL.g:13264:1: rule__EntityMockReferencedObjectAttribute__Group_2__1 : rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13268:1: ( rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl )
+            // InternalEntityMockDSL.g:13269:2: rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group_2__1"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:13275:1: rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl : ( ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13279:1: ( ( ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 ) ) )
+            // InternalEntityMockDSL.g:13280:1: ( ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:13280:1: ( ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 ) )
+            // InternalEntityMockDSL.g:13281:2: ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedAssignment_2_1()); 
+            }
+            // InternalEntityMockDSL.g:13282:2: ( rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 )
+            // InternalEntityMockDSL.g:13282:3: rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__0"
+    // InternalEntityMockDSL.g:13291:1: rule__EntityMockAttributeByObject__Group_0__0 : rule__EntityMockAttributeByObject__Group_0__0__Impl rule__EntityMockAttributeByObject__Group_0__1 ;
+    public final void rule__EntityMockAttributeByObject__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13295:1: ( rule__EntityMockAttributeByObject__Group_0__0__Impl rule__EntityMockAttributeByObject__Group_0__1 )
+            // InternalEntityMockDSL.g:13296:2: rule__EntityMockAttributeByObject__Group_0__0__Impl rule__EntityMockAttributeByObject__Group_0__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeByObject__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:13303:1: rule__EntityMockAttributeByObject__Group_0__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockAttributeByObject__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13307:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:13308:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:13308:1: ( 'var' )
+            // InternalEntityMockDSL.g:13309:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__1"
+    // InternalEntityMockDSL.g:13318:1: rule__EntityMockAttributeByObject__Group_0__1 : rule__EntityMockAttributeByObject__Group_0__1__Impl rule__EntityMockAttributeByObject__Group_0__2 ;
+    public final void rule__EntityMockAttributeByObject__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13322:1: ( rule__EntityMockAttributeByObject__Group_0__1__Impl rule__EntityMockAttributeByObject__Group_0__2 )
+            // InternalEntityMockDSL.g:13323:2: rule__EntityMockAttributeByObject__Group_0__1__Impl rule__EntityMockAttributeByObject__Group_0__2
+            {
+            pushFollow(FOLLOW_91);
+            rule__EntityMockAttributeByObject__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:13330:1: rule__EntityMockAttributeByObject__Group_0__1__Impl : ( ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 ) ) ;
+    public final void rule__EntityMockAttributeByObject__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13334:1: ( ( ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 ) ) )
+            // InternalEntityMockDSL.g:13335:1: ( ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:13335:1: ( ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 ) )
+            // InternalEntityMockDSL.g:13336:2: ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefAssignment_0_1()); 
+            }
+            // InternalEntityMockDSL.g:13337:2: ( rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 )
+            // InternalEntityMockDSL.g:13337:3: rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__2"
+    // InternalEntityMockDSL.g:13345:1: rule__EntityMockAttributeByObject__Group_0__2 : rule__EntityMockAttributeByObject__Group_0__2__Impl ;
+    public final void rule__EntityMockAttributeByObject__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13349:1: ( rule__EntityMockAttributeByObject__Group_0__2__Impl )
+            // InternalEntityMockDSL.g:13350:2: rule__EntityMockAttributeByObject__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__2"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:13356:1: rule__EntityMockAttributeByObject__Group_0__2__Impl : ( ( rule__EntityMockAttributeByObject__Group_0_2__0 ) ) ;
+    public final void rule__EntityMockAttributeByObject__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13360:1: ( ( ( rule__EntityMockAttributeByObject__Group_0_2__0 ) ) )
+            // InternalEntityMockDSL.g:13361:1: ( ( rule__EntityMockAttributeByObject__Group_0_2__0 ) )
+            {
+            // InternalEntityMockDSL.g:13361:1: ( ( rule__EntityMockAttributeByObject__Group_0_2__0 ) )
+            // InternalEntityMockDSL.g:13362:2: ( rule__EntityMockAttributeByObject__Group_0_2__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0_2()); 
+            }
+            // InternalEntityMockDSL.g:13363:2: ( rule__EntityMockAttributeByObject__Group_0_2__0 )
+            // InternalEntityMockDSL.g:13363:3: rule__EntityMockAttributeByObject__Group_0_2__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0_2__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getGroup_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0_2__0"
+    // InternalEntityMockDSL.g:13372:1: rule__EntityMockAttributeByObject__Group_0_2__0 : rule__EntityMockAttributeByObject__Group_0_2__0__Impl rule__EntityMockAttributeByObject__Group_0_2__1 ;
+    public final void rule__EntityMockAttributeByObject__Group_0_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13376:1: ( rule__EntityMockAttributeByObject__Group_0_2__0__Impl rule__EntityMockAttributeByObject__Group_0_2__1 )
+            // InternalEntityMockDSL.g:13377:2: rule__EntityMockAttributeByObject__Group_0_2__0__Impl rule__EntityMockAttributeByObject__Group_0_2__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeByObject__Group_0_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0_2__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0_2__0__Impl"
+    // InternalEntityMockDSL.g:13384:1: rule__EntityMockAttributeByObject__Group_0_2__0__Impl : ( 'as' ) ;
+    public final void rule__EntityMockAttributeByObject__Group_0_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13388:1: ( ( 'as' ) )
+            // InternalEntityMockDSL.g:13389:1: ( 'as' )
+            {
+            // InternalEntityMockDSL.g:13389:1: ( 'as' )
+            // InternalEntityMockDSL.g:13390:2: 'as'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0()); 
+            }
+            match(input,113,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0_2__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0_2__1"
+    // InternalEntityMockDSL.g:13399:1: rule__EntityMockAttributeByObject__Group_0_2__1 : rule__EntityMockAttributeByObject__Group_0_2__1__Impl ;
+    public final void rule__EntityMockAttributeByObject__Group_0_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13403:1: ( rule__EntityMockAttributeByObject__Group_0_2__1__Impl )
+            // InternalEntityMockDSL.g:13404:2: rule__EntityMockAttributeByObject__Group_0_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_0_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0_2__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_0_2__1__Impl"
+    // InternalEntityMockDSL.g:13410:1: rule__EntityMockAttributeByObject__Group_0_2__1__Impl : ( ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 ) ) ;
+    public final void rule__EntityMockAttributeByObject__Group_0_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13414:1: ( ( ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 ) ) )
+            // InternalEntityMockDSL.g:13415:1: ( ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:13415:1: ( ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 ) )
+            // InternalEntityMockDSL.g:13416:2: ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceAssignment_0_2_1()); 
+            }
+            // InternalEntityMockDSL.g:13417:2: ( rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 )
+            // InternalEntityMockDSL.g:13417:3: rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceAssignment_0_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_0_2__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__0"
+    // InternalEntityMockDSL.g:13426:1: rule__EntityMockAttributeByObject__Group_1__0 : rule__EntityMockAttributeByObject__Group_1__0__Impl rule__EntityMockAttributeByObject__Group_1__1 ;
+    public final void rule__EntityMockAttributeByObject__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13430:1: ( rule__EntityMockAttributeByObject__Group_1__0__Impl rule__EntityMockAttributeByObject__Group_1__1 )
+            // InternalEntityMockDSL.g:13431:2: rule__EntityMockAttributeByObject__Group_1__0__Impl rule__EntityMockAttributeByObject__Group_1__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeByObject__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:13438:1: rule__EntityMockAttributeByObject__Group_1__0__Impl : ( 'using' ) ;
+    public final void rule__EntityMockAttributeByObject__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13442:1: ( ( 'using' ) )
+            // InternalEntityMockDSL.g:13443:1: ( 'using' )
+            {
+            // InternalEntityMockDSL.g:13443:1: ( 'using' )
+            // InternalEntityMockDSL.g:13444:2: 'using'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0()); 
+            }
+            match(input,117,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__1"
+    // InternalEntityMockDSL.g:13453:1: rule__EntityMockAttributeByObject__Group_1__1 : rule__EntityMockAttributeByObject__Group_1__1__Impl rule__EntityMockAttributeByObject__Group_1__2 ;
+    public final void rule__EntityMockAttributeByObject__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13457:1: ( rule__EntityMockAttributeByObject__Group_1__1__Impl rule__EntityMockAttributeByObject__Group_1__2 )
+            // InternalEntityMockDSL.g:13458:2: rule__EntityMockAttributeByObject__Group_1__1__Impl rule__EntityMockAttributeByObject__Group_1__2
+            {
+            pushFollow(FOLLOW_40);
+            rule__EntityMockAttributeByObject__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:13465:1: rule__EntityMockAttributeByObject__Group_1__1__Impl : ( ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 ) ) ;
+    public final void rule__EntityMockAttributeByObject__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13469:1: ( ( ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:13470:1: ( ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:13470:1: ( ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:13471:2: ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:13472:2: ( rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 )
+            // InternalEntityMockDSL.g:13472:3: rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__2"
+    // InternalEntityMockDSL.g:13480:1: rule__EntityMockAttributeByObject__Group_1__2 : rule__EntityMockAttributeByObject__Group_1__2__Impl rule__EntityMockAttributeByObject__Group_1__3 ;
+    public final void rule__EntityMockAttributeByObject__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13484:1: ( rule__EntityMockAttributeByObject__Group_1__2__Impl rule__EntityMockAttributeByObject__Group_1__3 )
+            // InternalEntityMockDSL.g:13485:2: rule__EntityMockAttributeByObject__Group_1__2__Impl rule__EntityMockAttributeByObject__Group_1__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeByObject__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__2"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__2__Impl"
+    // InternalEntityMockDSL.g:13492:1: rule__EntityMockAttributeByObject__Group_1__2__Impl : ( '.' ) ;
+    public final void rule__EntityMockAttributeByObject__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13496:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:13497:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:13497:1: ( '.' )
+            // InternalEntityMockDSL.g:13498:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__3"
+    // InternalEntityMockDSL.g:13507:1: rule__EntityMockAttributeByObject__Group_1__3 : rule__EntityMockAttributeByObject__Group_1__3__Impl ;
+    public final void rule__EntityMockAttributeByObject__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13511:1: ( rule__EntityMockAttributeByObject__Group_1__3__Impl )
+            // InternalEntityMockDSL.g:13512:2: rule__EntityMockAttributeByObject__Group_1__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__3"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__Group_1__3__Impl"
+    // InternalEntityMockDSL.g:13518:1: rule__EntityMockAttributeByObject__Group_1__3__Impl : ( ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 ) ) ;
+    public final void rule__EntityMockAttributeByObject__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13522:1: ( ( ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 ) ) )
+            // InternalEntityMockDSL.g:13523:1: ( ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 ) )
+            {
+            // InternalEntityMockDSL.g:13523:1: ( ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 ) )
+            // InternalEntityMockDSL.g:13524:2: ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeAssignment_1_3()); 
+            }
+            // InternalEntityMockDSL.g:13525:2: ( rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 )
+            // InternalEntityMockDSL.g:13525:3: rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeAssignment_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__0"
+    // InternalEntityMockDSL.g:13534:1: rule__EntityMockAttributeFiller__Group__0 : rule__EntityMockAttributeFiller__Group__0__Impl rule__EntityMockAttributeFiller__Group__1 ;
+    public final void rule__EntityMockAttributeFiller__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13538:1: ( rule__EntityMockAttributeFiller__Group__0__Impl rule__EntityMockAttributeFiller__Group__1 )
+            // InternalEntityMockDSL.g:13539:2: rule__EntityMockAttributeFiller__Group__0__Impl rule__EntityMockAttributeFiller__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeFiller__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__0__Impl"
+    // InternalEntityMockDSL.g:13546:1: rule__EntityMockAttributeFiller__Group__0__Impl : ( 'var' ) ;
+    public final void rule__EntityMockAttributeFiller__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13550:1: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:13551:1: ( 'var' )
+            {
+            // InternalEntityMockDSL.g:13551:1: ( 'var' )
+            // InternalEntityMockDSL.g:13552:2: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__1"
+    // InternalEntityMockDSL.g:13561:1: rule__EntityMockAttributeFiller__Group__1 : rule__EntityMockAttributeFiller__Group__1__Impl rule__EntityMockAttributeFiller__Group__2 ;
+    public final void rule__EntityMockAttributeFiller__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13565:1: ( rule__EntityMockAttributeFiller__Group__1__Impl rule__EntityMockAttributeFiller__Group__2 )
+            // InternalEntityMockDSL.g:13566:2: rule__EntityMockAttributeFiller__Group__1__Impl rule__EntityMockAttributeFiller__Group__2
+            {
+            pushFollow(FOLLOW_51);
+            rule__EntityMockAttributeFiller__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__1__Impl"
+    // InternalEntityMockDSL.g:13573:1: rule__EntityMockAttributeFiller__Group__1__Impl : ( ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 ) ) ;
+    public final void rule__EntityMockAttributeFiller__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13577:1: ( ( ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:13578:1: ( ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:13578:1: ( ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 ) )
+            // InternalEntityMockDSL.g:13579:2: ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:13580:2: ( rule__EntityMockAttributeFiller__AttributeRefAssignment_1 )
+            // InternalEntityMockDSL.g:13580:3: rule__EntityMockAttributeFiller__AttributeRefAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__AttributeRefAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__2"
+    // InternalEntityMockDSL.g:13588:1: rule__EntityMockAttributeFiller__Group__2 : rule__EntityMockAttributeFiller__Group__2__Impl rule__EntityMockAttributeFiller__Group__3 ;
+    public final void rule__EntityMockAttributeFiller__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13592:1: ( rule__EntityMockAttributeFiller__Group__2__Impl rule__EntityMockAttributeFiller__Group__3 )
+            // InternalEntityMockDSL.g:13593:2: rule__EntityMockAttributeFiller__Group__2__Impl rule__EntityMockAttributeFiller__Group__3
+            {
+            pushFollow(FOLLOW_52);
+            rule__EntityMockAttributeFiller__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__2__Impl"
+    // InternalEntityMockDSL.g:13600:1: rule__EntityMockAttributeFiller__Group__2__Impl : ( 'randomize' ) ;
+    public final void rule__EntityMockAttributeFiller__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13604:1: ( ( 'randomize' ) )
+            // InternalEntityMockDSL.g:13605:1: ( 'randomize' )
+            {
+            // InternalEntityMockDSL.g:13605:1: ( 'randomize' )
+            // InternalEntityMockDSL.g:13606:2: 'randomize'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2()); 
+            }
+            match(input,82,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__3"
+    // InternalEntityMockDSL.g:13615:1: rule__EntityMockAttributeFiller__Group__3 : rule__EntityMockAttributeFiller__Group__3__Impl ;
+    public final void rule__EntityMockAttributeFiller__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13619:1: ( rule__EntityMockAttributeFiller__Group__3__Impl )
+            // InternalEntityMockDSL.g:13620:2: rule__EntityMockAttributeFiller__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__Group__3__Impl"
+    // InternalEntityMockDSL.g:13626:1: rule__EntityMockAttributeFiller__Group__3__Impl : ( ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 ) ) ;
+    public final void rule__EntityMockAttributeFiller__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13630:1: ( ( ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:13631:1: ( ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:13631:1: ( ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 ) )
+            // InternalEntityMockDSL.g:13632:2: ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypeAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:13633:2: ( rule__EntityMockAttributeFiller__FillerTypeAssignment_3 )
+            // InternalEntityMockDSL.g:13633:3: rule__EntityMockAttributeFiller__FillerTypeAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeFiller__FillerTypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__0"
+    // InternalEntityMockDSL.g:13642:1: rule__EntityMockAttributeByReference__Group__0 : rule__EntityMockAttributeByReference__Group__0__Impl rule__EntityMockAttributeByReference__Group__1 ;
+    public final void rule__EntityMockAttributeByReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13646:1: ( rule__EntityMockAttributeByReference__Group__0__Impl rule__EntityMockAttributeByReference__Group__1 )
+            // InternalEntityMockDSL.g:13647:2: rule__EntityMockAttributeByReference__Group__0__Impl rule__EntityMockAttributeByReference__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__EntityMockAttributeByReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__0__Impl"
+    // InternalEntityMockDSL.g:13654:1: rule__EntityMockAttributeByReference__Group__0__Impl : ( 'ref' ) ;
+    public final void rule__EntityMockAttributeByReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13658:1: ( ( 'ref' ) )
+            // InternalEntityMockDSL.g:13659:1: ( 'ref' )
+            {
+            // InternalEntityMockDSL.g:13659:1: ( 'ref' )
+            // InternalEntityMockDSL.g:13660:2: 'ref'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0()); 
+            }
+            match(input,118,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__1"
+    // InternalEntityMockDSL.g:13669:1: rule__EntityMockAttributeByReference__Group__1 : rule__EntityMockAttributeByReference__Group__1__Impl rule__EntityMockAttributeByReference__Group__2 ;
+    public final void rule__EntityMockAttributeByReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13673:1: ( rule__EntityMockAttributeByReference__Group__1__Impl rule__EntityMockAttributeByReference__Group__2 )
+            // InternalEntityMockDSL.g:13674:2: rule__EntityMockAttributeByReference__Group__1__Impl rule__EntityMockAttributeByReference__Group__2
+            {
+            pushFollow(FOLLOW_79);
+            rule__EntityMockAttributeByReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__1__Impl"
+    // InternalEntityMockDSL.g:13681:1: rule__EntityMockAttributeByReference__Group__1__Impl : ( ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 ) ) ;
+    public final void rule__EntityMockAttributeByReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13685:1: ( ( ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:13686:1: ( ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:13686:1: ( ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 ) )
+            // InternalEntityMockDSL.g:13687:2: ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:13688:2: ( rule__EntityMockAttributeByReference__AttributeRefAssignment_1 )
+            // InternalEntityMockDSL.g:13688:3: rule__EntityMockAttributeByReference__AttributeRefAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__AttributeRefAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__2"
+    // InternalEntityMockDSL.g:13696:1: rule__EntityMockAttributeByReference__Group__2 : rule__EntityMockAttributeByReference__Group__2__Impl rule__EntityMockAttributeByReference__Group__3 ;
+    public final void rule__EntityMockAttributeByReference__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13700:1: ( rule__EntityMockAttributeByReference__Group__2__Impl rule__EntityMockAttributeByReference__Group__3 )
+            // InternalEntityMockDSL.g:13701:2: rule__EntityMockAttributeByReference__Group__2__Impl rule__EntityMockAttributeByReference__Group__3
+            {
+            pushFollow(FOLLOW_96);
+            rule__EntityMockAttributeByReference__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__2"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__2__Impl"
+    // InternalEntityMockDSL.g:13708:1: rule__EntityMockAttributeByReference__Group__2__Impl : ( 'to' ) ;
+    public final void rule__EntityMockAttributeByReference__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13712:1: ( ( 'to' ) )
+            // InternalEntityMockDSL.g:13713:1: ( 'to' )
+            {
+            // InternalEntityMockDSL.g:13713:1: ( 'to' )
+            // InternalEntityMockDSL.g:13714:2: 'to'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2()); 
+            }
+            match(input,107,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__3"
+    // InternalEntityMockDSL.g:13723:1: rule__EntityMockAttributeByReference__Group__3 : rule__EntityMockAttributeByReference__Group__3__Impl rule__EntityMockAttributeByReference__Group__4 ;
+    public final void rule__EntityMockAttributeByReference__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13727:1: ( rule__EntityMockAttributeByReference__Group__3__Impl rule__EntityMockAttributeByReference__Group__4 )
+            // InternalEntityMockDSL.g:13728:2: rule__EntityMockAttributeByReference__Group__3__Impl rule__EntityMockAttributeByReference__Group__4
+            {
+            pushFollow(FOLLOW_97);
+            rule__EntityMockAttributeByReference__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__3"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__3__Impl"
+    // InternalEntityMockDSL.g:13735:1: rule__EntityMockAttributeByReference__Group__3__Impl : ( ( rule__EntityMockAttributeByReference__Alternatives_3 ) ) ;
+    public final void rule__EntityMockAttributeByReference__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13739:1: ( ( ( rule__EntityMockAttributeByReference__Alternatives_3 ) ) )
+            // InternalEntityMockDSL.g:13740:1: ( ( rule__EntityMockAttributeByReference__Alternatives_3 ) )
+            {
+            // InternalEntityMockDSL.g:13740:1: ( ( rule__EntityMockAttributeByReference__Alternatives_3 ) )
+            // InternalEntityMockDSL.g:13741:2: ( rule__EntityMockAttributeByReference__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAlternatives_3()); 
+            }
+            // InternalEntityMockDSL.g:13742:2: ( rule__EntityMockAttributeByReference__Alternatives_3 )
+            // InternalEntityMockDSL.g:13742:3: rule__EntityMockAttributeByReference__Alternatives_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__4"
+    // InternalEntityMockDSL.g:13750:1: rule__EntityMockAttributeByReference__Group__4 : rule__EntityMockAttributeByReference__Group__4__Impl ;
+    public final void rule__EntityMockAttributeByReference__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13754:1: ( rule__EntityMockAttributeByReference__Group__4__Impl )
+            // InternalEntityMockDSL.g:13755:2: rule__EntityMockAttributeByReference__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__4"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group__4__Impl"
+    // InternalEntityMockDSL.g:13761:1: rule__EntityMockAttributeByReference__Group__4__Impl : ( ( rule__EntityMockAttributeByReference__Group_4__0 )? ) ;
+    public final void rule__EntityMockAttributeByReference__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13765:1: ( ( ( rule__EntityMockAttributeByReference__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:13766:1: ( ( rule__EntityMockAttributeByReference__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:13766:1: ( ( rule__EntityMockAttributeByReference__Group_4__0 )? )
+            // InternalEntityMockDSL.g:13767:2: ( rule__EntityMockAttributeByReference__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:13768:2: ( rule__EntityMockAttributeByReference__Group_4__0 )?
+            int alt122=2;
+            int LA122_0 = input.LA(1);
+
+            if ( (LA122_0==119) ) {
+                alt122=1;
+            }
+            switch (alt122) {
+                case 1 :
+                    // InternalEntityMockDSL.g:13768:3: rule__EntityMockAttributeByReference__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockAttributeByReference__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__0"
+    // InternalEntityMockDSL.g:13777:1: rule__EntityMockAttributeByReference__Group_4__0 : rule__EntityMockAttributeByReference__Group_4__0__Impl rule__EntityMockAttributeByReference__Group_4__1 ;
+    public final void rule__EntityMockAttributeByReference__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13781:1: ( rule__EntityMockAttributeByReference__Group_4__0__Impl rule__EntityMockAttributeByReference__Group_4__1 )
+            // InternalEntityMockDSL.g:13782:2: rule__EntityMockAttributeByReference__Group_4__0__Impl rule__EntityMockAttributeByReference__Group_4__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__EntityMockAttributeByReference__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__0"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:13789:1: rule__EntityMockAttributeByReference__Group_4__0__Impl : ( 'optionalFor' ) ;
+    public final void rule__EntityMockAttributeByReference__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13793:1: ( ( 'optionalFor' ) )
+            // InternalEntityMockDSL.g:13794:1: ( 'optionalFor' )
+            {
+            // InternalEntityMockDSL.g:13794:1: ( 'optionalFor' )
+            // InternalEntityMockDSL.g:13795:2: 'optionalFor'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0()); 
+            }
+            match(input,119,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__1"
+    // InternalEntityMockDSL.g:13804:1: rule__EntityMockAttributeByReference__Group_4__1 : rule__EntityMockAttributeByReference__Group_4__1__Impl rule__EntityMockAttributeByReference__Group_4__2 ;
+    public final void rule__EntityMockAttributeByReference__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13808:1: ( rule__EntityMockAttributeByReference__Group_4__1__Impl rule__EntityMockAttributeByReference__Group_4__2 )
+            // InternalEntityMockDSL.g:13809:2: rule__EntityMockAttributeByReference__Group_4__1__Impl rule__EntityMockAttributeByReference__Group_4__2
+            {
+            pushFollow(FOLLOW_98);
+            rule__EntityMockAttributeByReference__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:13816:1: rule__EntityMockAttributeByReference__Group_4__1__Impl : ( ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 ) ) ;
+    public final void rule__EntityMockAttributeByReference__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13820:1: ( ( ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 ) ) )
+            // InternalEntityMockDSL.g:13821:1: ( ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:13821:1: ( ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 ) )
+            // InternalEntityMockDSL.g:13822:2: ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForAssignment_4_1()); 
+            }
+            // InternalEntityMockDSL.g:13823:2: ( rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 )
+            // InternalEntityMockDSL.g:13823:3: rule__EntityMockAttributeByReference__OptionalForAssignment_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__OptionalForAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__2"
+    // InternalEntityMockDSL.g:13831:1: rule__EntityMockAttributeByReference__Group_4__2 : rule__EntityMockAttributeByReference__Group_4__2__Impl ;
+    public final void rule__EntityMockAttributeByReference__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13835:1: ( rule__EntityMockAttributeByReference__Group_4__2__Impl )
+            // InternalEntityMockDSL.g:13836:2: rule__EntityMockAttributeByReference__Group_4__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockAttributeByReference__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__2"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__Group_4__2__Impl"
+    // InternalEntityMockDSL.g:13842:1: rule__EntityMockAttributeByReference__Group_4__2__Impl : ( 'percent' ) ;
+    public final void rule__EntityMockAttributeByReference__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13846:1: ( ( 'percent' ) )
+            // InternalEntityMockDSL.g:13847:1: ( 'percent' )
+            {
+            // InternalEntityMockDSL.g:13847:1: ( 'percent' )
+            // InternalEntityMockDSL.g:13848:2: 'percent'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2()); 
+            }
+            match(input,120,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__SignedNumber__Group__0"
+    // InternalEntityMockDSL.g:13858:1: rule__SignedNumber__Group__0 : rule__SignedNumber__Group__0__Impl rule__SignedNumber__Group__1 ;
+    public final void rule__SignedNumber__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13862:1: ( rule__SignedNumber__Group__0__Impl rule__SignedNumber__Group__1 )
+            // InternalEntityMockDSL.g:13863:2: rule__SignedNumber__Group__0__Impl rule__SignedNumber__Group__1
+            {
+            pushFollow(FOLLOW_56);
+            rule__SignedNumber__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__SignedNumber__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignedNumber__Group__0"
+
+
+    // $ANTLR start "rule__SignedNumber__Group__0__Impl"
+    // InternalEntityMockDSL.g:13870:1: rule__SignedNumber__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__SignedNumber__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13874:1: ( ( ( '-' )? ) )
+            // InternalEntityMockDSL.g:13875:1: ( ( '-' )? )
+            {
+            // InternalEntityMockDSL.g:13875:1: ( ( '-' )? )
+            // InternalEntityMockDSL.g:13876:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalEntityMockDSL.g:13877:2: ( '-' )?
+            int alt123=2;
+            int LA123_0 = input.LA(1);
+
+            if ( (LA123_0==36) ) {
+                alt123=1;
+            }
+            switch (alt123) {
+                case 1 :
+                    // InternalEntityMockDSL.g:13877:3: '-'
+                    {
+                    match(input,36,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignedNumber__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SignedNumber__Group__1"
+    // InternalEntityMockDSL.g:13885:1: rule__SignedNumber__Group__1 : rule__SignedNumber__Group__1__Impl ;
+    public final void rule__SignedNumber__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13889:1: ( rule__SignedNumber__Group__1__Impl )
+            // InternalEntityMockDSL.g:13890:2: rule__SignedNumber__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__SignedNumber__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignedNumber__Group__1"
+
+
+    // $ANTLR start "rule__SignedNumber__Group__1__Impl"
+    // InternalEntityMockDSL.g:13896:1: rule__SignedNumber__Group__1__Impl : ( ruleUnsignedNumber ) ;
+    public final void rule__SignedNumber__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13900:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:13901:1: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:13901:1: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:13902:2: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignedNumber__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group__0"
+    // InternalEntityMockDSL.g:13912:1: rule__UnsignedNumber__Group__0 : rule__UnsignedNumber__Group__0__Impl rule__UnsignedNumber__Group__1 ;
+    public final void rule__UnsignedNumber__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13916:1: ( rule__UnsignedNumber__Group__0__Impl rule__UnsignedNumber__Group__1 )
+            // InternalEntityMockDSL.g:13917:2: rule__UnsignedNumber__Group__0__Impl rule__UnsignedNumber__Group__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__UnsignedNumber__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__UnsignedNumber__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group__0"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group__0__Impl"
+    // InternalEntityMockDSL.g:13924:1: rule__UnsignedNumber__Group__0__Impl : ( RULE_INT ) ;
+    public final void rule__UnsignedNumber__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13928:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:13929:1: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:13929:1: ( RULE_INT )
+            // InternalEntityMockDSL.g:13930:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group__1"
+    // InternalEntityMockDSL.g:13939:1: rule__UnsignedNumber__Group__1 : rule__UnsignedNumber__Group__1__Impl ;
+    public final void rule__UnsignedNumber__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13943:1: ( rule__UnsignedNumber__Group__1__Impl )
+            // InternalEntityMockDSL.g:13944:2: rule__UnsignedNumber__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__UnsignedNumber__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group__1"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group__1__Impl"
+    // InternalEntityMockDSL.g:13950:1: rule__UnsignedNumber__Group__1__Impl : ( ( rule__UnsignedNumber__Group_1__0 )? ) ;
+    public final void rule__UnsignedNumber__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13954:1: ( ( ( rule__UnsignedNumber__Group_1__0 )? ) )
+            // InternalEntityMockDSL.g:13955:1: ( ( rule__UnsignedNumber__Group_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:13955:1: ( ( rule__UnsignedNumber__Group_1__0 )? )
+            // InternalEntityMockDSL.g:13956:2: ( rule__UnsignedNumber__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:13957:2: ( rule__UnsignedNumber__Group_1__0 )?
+            int alt124=2;
+            int LA124_0 = input.LA(1);
+
+            if ( (LA124_0==44) ) {
+                alt124=1;
+            }
+            switch (alt124) {
+                case 1 :
+                    // InternalEntityMockDSL.g:13957:3: rule__UnsignedNumber__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__UnsignedNumber__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group_1__0"
+    // InternalEntityMockDSL.g:13966:1: rule__UnsignedNumber__Group_1__0 : rule__UnsignedNumber__Group_1__0__Impl rule__UnsignedNumber__Group_1__1 ;
+    public final void rule__UnsignedNumber__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13970:1: ( rule__UnsignedNumber__Group_1__0__Impl rule__UnsignedNumber__Group_1__1 )
+            // InternalEntityMockDSL.g:13971:2: rule__UnsignedNumber__Group_1__0__Impl rule__UnsignedNumber__Group_1__1
+            {
+            pushFollow(FOLLOW_16);
+            rule__UnsignedNumber__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__UnsignedNumber__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group_1__0"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:13978:1: rule__UnsignedNumber__Group_1__0__Impl : ( '.' ) ;
+    public final void rule__UnsignedNumber__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13982:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:13983:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:13983:1: ( '.' )
+            // InternalEntityMockDSL.g:13984:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group_1__1"
+    // InternalEntityMockDSL.g:13993:1: rule__UnsignedNumber__Group_1__1 : rule__UnsignedNumber__Group_1__1__Impl ;
+    public final void rule__UnsignedNumber__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:13997:1: ( rule__UnsignedNumber__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:13998:2: rule__UnsignedNumber__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__UnsignedNumber__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group_1__1"
+
+
+    // $ANTLR start "rule__UnsignedNumber__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:14004:1: rule__UnsignedNumber__Group_1__1__Impl : ( RULE_INT ) ;
+    public final void rule__UnsignedNumber__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14008:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:14009:1: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:14009:1: ( RULE_INT )
+            // InternalEntityMockDSL.g:14010:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnsignedNumber__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__SINT__Group__0"
+    // InternalEntityMockDSL.g:14020:1: rule__SINT__Group__0 : rule__SINT__Group__0__Impl rule__SINT__Group__1 ;
+    public final void rule__SINT__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14024:1: ( rule__SINT__Group__0__Impl rule__SINT__Group__1 )
+            // InternalEntityMockDSL.g:14025:2: rule__SINT__Group__0__Impl rule__SINT__Group__1
+            {
+            pushFollow(FOLLOW_56);
+            rule__SINT__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__SINT__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SINT__Group__0"
+
+
+    // $ANTLR start "rule__SINT__Group__0__Impl"
+    // InternalEntityMockDSL.g:14032:1: rule__SINT__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__SINT__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14036:1: ( ( ( '-' )? ) )
+            // InternalEntityMockDSL.g:14037:1: ( ( '-' )? )
+            {
+            // InternalEntityMockDSL.g:14037:1: ( ( '-' )? )
+            // InternalEntityMockDSL.g:14038:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSINTAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalEntityMockDSL.g:14039:2: ( '-' )?
+            int alt125=2;
+            int LA125_0 = input.LA(1);
+
+            if ( (LA125_0==36) ) {
+                alt125=1;
+            }
+            switch (alt125) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14039:3: '-'
+                    {
+                    match(input,36,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSINTAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SINT__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SINT__Group__1"
+    // InternalEntityMockDSL.g:14047:1: rule__SINT__Group__1 : rule__SINT__Group__1__Impl ;
+    public final void rule__SINT__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14051:1: ( rule__SINT__Group__1__Impl )
+            // InternalEntityMockDSL.g:14052:2: rule__SINT__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__SINT__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SINT__Group__1"
+
+
+    // $ANTLR start "rule__SINT__Group__1__Impl"
+    // InternalEntityMockDSL.g:14058:1: rule__SINT__Group__1__Impl : ( RULE_INT ) ;
+    public final void rule__SINT__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14062:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:14063:1: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:14063:1: ( RULE_INT )
+            // InternalEntityMockDSL.g:14064:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSINTAccess().getINTTerminalRuleCall_1()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSINTAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SINT__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__0"
+    // InternalEntityMockDSL.g:14074:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
+    public final void rule__XImportDeclaration__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14078:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
+            // InternalEntityMockDSL.g:14079:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
+            {
+            pushFollow(FOLLOW_99);
+            rule__XImportDeclaration__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__0__Impl"
+    // InternalEntityMockDSL.g:14086:1: rule__XImportDeclaration__Group__0__Impl : ( () ) ;
+    public final void rule__XImportDeclaration__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14090:1: ( ( () ) )
+            // InternalEntityMockDSL.g:14091:1: ( () )
+            {
+            // InternalEntityMockDSL.g:14091:1: ( () )
+            // InternalEntityMockDSL.g:14092:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); 
+            }
+            // InternalEntityMockDSL.g:14093:2: ()
+            // InternalEntityMockDSL.g:14093:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__1"
+    // InternalEntityMockDSL.g:14101:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
+    public final void rule__XImportDeclaration__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14105:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
+            // InternalEntityMockDSL.g:14106:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
+            {
+            pushFollow(FOLLOW_100);
+            rule__XImportDeclaration__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__1__Impl"
+    // InternalEntityMockDSL.g:14113:1: rule__XImportDeclaration__Group__1__Impl : ( 'import' ) ;
+    public final void rule__XImportDeclaration__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14117:1: ( ( 'import' ) )
+            // InternalEntityMockDSL.g:14118:1: ( 'import' )
+            {
+            // InternalEntityMockDSL.g:14118:1: ( 'import' )
+            // InternalEntityMockDSL.g:14119:2: 'import'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); 
+            }
+            match(input,48,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__2"
+    // InternalEntityMockDSL.g:14128:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 ;
+    public final void rule__XImportDeclaration__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14132:1: ( rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 )
+            // InternalEntityMockDSL.g:14133:2: rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3
+            {
+            pushFollow(FOLLOW_101);
+            rule__XImportDeclaration__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__2__Impl"
+    // InternalEntityMockDSL.g:14140:1: rule__XImportDeclaration__Group__2__Impl : ( ( rule__XImportDeclaration__Alternatives_2 ) ) ;
+    public final void rule__XImportDeclaration__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14144:1: ( ( ( rule__XImportDeclaration__Alternatives_2 ) ) )
+            // InternalEntityMockDSL.g:14145:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            {
+            // InternalEntityMockDSL.g:14145:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            // InternalEntityMockDSL.g:14146:2: ( rule__XImportDeclaration__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); 
+            }
+            // InternalEntityMockDSL.g:14147:2: ( rule__XImportDeclaration__Alternatives_2 )
+            // InternalEntityMockDSL.g:14147:3: rule__XImportDeclaration__Alternatives_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__3"
+    // InternalEntityMockDSL.g:14155:1: rule__XImportDeclaration__Group__3 : rule__XImportDeclaration__Group__3__Impl ;
+    public final void rule__XImportDeclaration__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14159:1: ( rule__XImportDeclaration__Group__3__Impl )
+            // InternalEntityMockDSL.g:14160:2: rule__XImportDeclaration__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__3"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__3__Impl"
+    // InternalEntityMockDSL.g:14166:1: rule__XImportDeclaration__Group__3__Impl : ( ( ';' )? ) ;
+    public final void rule__XImportDeclaration__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14170:1: ( ( ( ';' )? ) )
+            // InternalEntityMockDSL.g:14171:1: ( ( ';' )? )
+            {
+            // InternalEntityMockDSL.g:14171:1: ( ( ';' )? )
+            // InternalEntityMockDSL.g:14172:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); 
+            }
+            // InternalEntityMockDSL.g:14173:2: ( ';' )?
+            int alt126=2;
+            int LA126_0 = input.LA(1);
+
+            if ( (LA126_0==121) ) {
+                alt126=1;
+            }
+            switch (alt126) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14173:3: ';'
+                    {
+                    match(input,121,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__0"
+    // InternalEntityMockDSL.g:14182:1: rule__XImportDeclaration__Group_2_0__0 : rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 ;
+    public final void rule__XImportDeclaration__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14186:1: ( rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 )
+            // InternalEntityMockDSL.g:14187:2: rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1
+            {
+            pushFollow(FOLLOW_102);
+            rule__XImportDeclaration__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__0__Impl"
+    // InternalEntityMockDSL.g:14194:1: rule__XImportDeclaration__Group_2_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) ;
+    public final void rule__XImportDeclaration__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14198:1: ( ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) )
+            // InternalEntityMockDSL.g:14199:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:14199:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            // InternalEntityMockDSL.g:14200:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14201:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            // InternalEntityMockDSL.g:14201:3: rule__XImportDeclaration__StaticAssignment_2_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__StaticAssignment_2_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__1"
+    // InternalEntityMockDSL.g:14209:1: rule__XImportDeclaration__Group_2_0__1 : rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 ;
+    public final void rule__XImportDeclaration__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14213:1: ( rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 )
+            // InternalEntityMockDSL.g:14214:2: rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2
+            {
+            pushFollow(FOLLOW_102);
+            rule__XImportDeclaration__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__1__Impl"
+    // InternalEntityMockDSL.g:14221:1: rule__XImportDeclaration__Group_2_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) ;
+    public final void rule__XImportDeclaration__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14225:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) )
+            // InternalEntityMockDSL.g:14226:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            {
+            // InternalEntityMockDSL.g:14226:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            // InternalEntityMockDSL.g:14227:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); 
+            }
+            // InternalEntityMockDSL.g:14228:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            int alt127=2;
+            int LA127_0 = input.LA(1);
+
+            if ( (LA127_0==49) ) {
+                alt127=1;
+            }
+            switch (alt127) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14228:3: rule__XImportDeclaration__ExtensionAssignment_2_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ExtensionAssignment_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__2"
+    // InternalEntityMockDSL.g:14236:1: rule__XImportDeclaration__Group_2_0__2 : rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 ;
+    public final void rule__XImportDeclaration__Group_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14240:1: ( rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 )
+            // InternalEntityMockDSL.g:14241:2: rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3
+            {
+            pushFollow(FOLLOW_103);
+            rule__XImportDeclaration__Group_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__2__Impl"
+    // InternalEntityMockDSL.g:14248:1: rule__XImportDeclaration__Group_2_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) ;
+    public final void rule__XImportDeclaration__Group_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14252:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) )
+            // InternalEntityMockDSL.g:14253:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            {
+            // InternalEntityMockDSL.g:14253:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            // InternalEntityMockDSL.g:14254:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); 
+            }
+            // InternalEntityMockDSL.g:14255:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            // InternalEntityMockDSL.g:14255:3: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__ImportedTypeAssignment_2_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__3"
+    // InternalEntityMockDSL.g:14263:1: rule__XImportDeclaration__Group_2_0__3 : rule__XImportDeclaration__Group_2_0__3__Impl ;
+    public final void rule__XImportDeclaration__Group_2_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14267:1: ( rule__XImportDeclaration__Group_2_0__3__Impl )
+            // InternalEntityMockDSL.g:14268:2: rule__XImportDeclaration__Group_2_0__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__3"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_0__3__Impl"
+    // InternalEntityMockDSL.g:14274:1: rule__XImportDeclaration__Group_2_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) ;
+    public final void rule__XImportDeclaration__Group_2_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14278:1: ( ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) )
+            // InternalEntityMockDSL.g:14279:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            {
+            // InternalEntityMockDSL.g:14279:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            // InternalEntityMockDSL.g:14280:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); 
+            }
+            // InternalEntityMockDSL.g:14281:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            // InternalEntityMockDSL.g:14281:3: rule__XImportDeclaration__Alternatives_2_0_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Alternatives_2_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_0__3__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_3__0"
+    // InternalEntityMockDSL.g:14290:1: rule__XImportDeclaration__Group_2_3__0 : rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 ;
+    public final void rule__XImportDeclaration__Group_2_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14294:1: ( rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 )
+            // InternalEntityMockDSL.g:14295:2: rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__XImportDeclaration__Group_2_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_3__0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_3__0__Impl"
+    // InternalEntityMockDSL.g:14302:1: rule__XImportDeclaration__Group_2_3__0__Impl : ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) ;
+    public final void rule__XImportDeclaration__Group_2_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14306:1: ( ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) )
+            // InternalEntityMockDSL.g:14307:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:14307:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            // InternalEntityMockDSL.g:14308:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); 
+            }
+            // InternalEntityMockDSL.g:14309:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            // InternalEntityMockDSL.g:14309:3: rule__XImportDeclaration__FqnImportAssignment_2_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__FqnImportAssignment_2_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_3__0__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_3__1"
+    // InternalEntityMockDSL.g:14317:1: rule__XImportDeclaration__Group_2_3__1 : rule__XImportDeclaration__Group_2_3__1__Impl ;
+    public final void rule__XImportDeclaration__Group_2_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14321:1: ( rule__XImportDeclaration__Group_2_3__1__Impl )
+            // InternalEntityMockDSL.g:14322:2: rule__XImportDeclaration__Group_2_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_2_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_3__1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_2_3__1__Impl"
+    // InternalEntityMockDSL.g:14328:1: rule__XImportDeclaration__Group_2_3__1__Impl : ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) ;
+    public final void rule__XImportDeclaration__Group_2_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14332:1: ( ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) )
+            // InternalEntityMockDSL.g:14333:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            {
+            // InternalEntityMockDSL.g:14333:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            // InternalEntityMockDSL.g:14334:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); 
+            }
+            // InternalEntityMockDSL.g:14335:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            // InternalEntityMockDSL.g:14335:3: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_2_3__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__0"
+    // InternalEntityMockDSL.g:14344:1: rule__XAnnotation__Group__0 : rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 ;
+    public final void rule__XAnnotation__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14348:1: ( rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 )
+            // InternalEntityMockDSL.g:14349:2: rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1
+            {
+            pushFollow(FOLLOW_104);
+            rule__XAnnotation__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__0"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__0__Impl"
+    // InternalEntityMockDSL.g:14356:1: rule__XAnnotation__Group__0__Impl : ( () ) ;
+    public final void rule__XAnnotation__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14360:1: ( ( () ) )
+            // InternalEntityMockDSL.g:14361:1: ( () )
+            {
+            // InternalEntityMockDSL.g:14361:1: ( () )
+            // InternalEntityMockDSL.g:14362:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); 
+            }
+            // InternalEntityMockDSL.g:14363:2: ()
+            // InternalEntityMockDSL.g:14363:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__1"
+    // InternalEntityMockDSL.g:14371:1: rule__XAnnotation__Group__1 : rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 ;
+    public final void rule__XAnnotation__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14375:1: ( rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 )
+            // InternalEntityMockDSL.g:14376:2: rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__XAnnotation__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__1"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__1__Impl"
+    // InternalEntityMockDSL.g:14383:1: rule__XAnnotation__Group__1__Impl : ( '@' ) ;
+    public final void rule__XAnnotation__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14387:1: ( ( '@' ) )
+            // InternalEntityMockDSL.g:14388:1: ( '@' )
+            {
+            // InternalEntityMockDSL.g:14388:1: ( '@' )
+            // InternalEntityMockDSL.g:14389:2: '@'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); 
+            }
+            match(input,122,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__2"
+    // InternalEntityMockDSL.g:14398:1: rule__XAnnotation__Group__2 : rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 ;
+    public final void rule__XAnnotation__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14402:1: ( rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 )
+            // InternalEntityMockDSL.g:14403:2: rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3
+            {
+            pushFollow(FOLLOW_27);
+            rule__XAnnotation__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__2"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__2__Impl"
+    // InternalEntityMockDSL.g:14410:1: rule__XAnnotation__Group__2__Impl : ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) ;
+    public final void rule__XAnnotation__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14414:1: ( ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:14415:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:14415:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            // InternalEntityMockDSL.g:14416:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:14417:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            // InternalEntityMockDSL.g:14417:3: rule__XAnnotation__AnnotationTypeAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__AnnotationTypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__3"
+    // InternalEntityMockDSL.g:14425:1: rule__XAnnotation__Group__3 : rule__XAnnotation__Group__3__Impl ;
+    public final void rule__XAnnotation__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14429:1: ( rule__XAnnotation__Group__3__Impl )
+            // InternalEntityMockDSL.g:14430:2: rule__XAnnotation__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__3"
+
+
+    // $ANTLR start "rule__XAnnotation__Group__3__Impl"
+    // InternalEntityMockDSL.g:14436:1: rule__XAnnotation__Group__3__Impl : ( ( rule__XAnnotation__Group_3__0 )? ) ;
+    public final void rule__XAnnotation__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14440:1: ( ( ( rule__XAnnotation__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:14441:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:14441:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            // InternalEntityMockDSL.g:14442:2: ( rule__XAnnotation__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:14443:2: ( rule__XAnnotation__Group_3__0 )?
+            int alt128=2;
+            int LA128_0 = input.LA(1);
+
+            if ( (LA128_0==68) ) {
+                alt128=1;
+            }
+            switch (alt128) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14443:3: rule__XAnnotation__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotation__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__0"
+    // InternalEntityMockDSL.g:14452:1: rule__XAnnotation__Group_3__0 : rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 ;
+    public final void rule__XAnnotation__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14456:1: ( rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 )
+            // InternalEntityMockDSL.g:14457:2: rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1
+            {
+            pushFollow(FOLLOW_105);
+            rule__XAnnotation__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__0"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:14464:1: rule__XAnnotation__Group_3__0__Impl : ( ( '(' ) ) ;
+    public final void rule__XAnnotation__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14468:1: ( ( ( '(' ) ) )
+            // InternalEntityMockDSL.g:14469:1: ( ( '(' ) )
+            {
+            // InternalEntityMockDSL.g:14469:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:14470:2: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); 
+            }
+            // InternalEntityMockDSL.g:14471:2: ( '(' )
+            // InternalEntityMockDSL.g:14471:3: '('
+            {
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__1"
+    // InternalEntityMockDSL.g:14479:1: rule__XAnnotation__Group_3__1 : rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 ;
+    public final void rule__XAnnotation__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14483:1: ( rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 )
+            // InternalEntityMockDSL.g:14484:2: rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2
+            {
+            pushFollow(FOLLOW_105);
+            rule__XAnnotation__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__1"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:14491:1: rule__XAnnotation__Group_3__1__Impl : ( ( rule__XAnnotation__Alternatives_3_1 )? ) ;
+    public final void rule__XAnnotation__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14495:1: ( ( ( rule__XAnnotation__Alternatives_3_1 )? ) )
+            // InternalEntityMockDSL.g:14496:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            {
+            // InternalEntityMockDSL.g:14496:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            // InternalEntityMockDSL.g:14497:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); 
+            }
+            // InternalEntityMockDSL.g:14498:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            int alt129=2;
+            int LA129_0 = input.LA(1);
+
+            if ( ((LA129_0>=RULE_ID && LA129_0<=RULE_STRING)||LA129_0==28||(LA129_0>=35 && LA129_0<=36)||LA129_0==41||(LA129_0>=46 && LA129_0<=51)||LA129_0==57||LA129_0==68||LA129_0==122||(LA129_0>=124 && LA129_0<=125)||LA129_0==127||LA129_0==129||(LA129_0>=133 && LA129_0<=141)||LA129_0==143||LA129_0==156) ) {
+                alt129=1;
+            }
+            switch (alt129) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14498:3: rule__XAnnotation__Alternatives_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotation__Alternatives_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__2"
+    // InternalEntityMockDSL.g:14506:1: rule__XAnnotation__Group_3__2 : rule__XAnnotation__Group_3__2__Impl ;
+    public final void rule__XAnnotation__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14510:1: ( rule__XAnnotation__Group_3__2__Impl )
+            // InternalEntityMockDSL.g:14511:2: rule__XAnnotation__Group_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__2"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:14517:1: rule__XAnnotation__Group_3__2__Impl : ( ')' ) ;
+    public final void rule__XAnnotation__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14521:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:14522:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:14522:1: ( ')' )
+            // InternalEntityMockDSL.g:14523:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0__0"
+    // InternalEntityMockDSL.g:14533:1: rule__XAnnotation__Group_3_1_0__0 : rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 ;
+    public final void rule__XAnnotation__Group_3_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14537:1: ( rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 )
+            // InternalEntityMockDSL.g:14538:2: rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XAnnotation__Group_3_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0__0"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0__0__Impl"
+    // InternalEntityMockDSL.g:14545:1: rule__XAnnotation__Group_3_1_0__0__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) ;
+    public final void rule__XAnnotation__Group_3_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14549:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) )
+            // InternalEntityMockDSL.g:14550:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:14550:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            // InternalEntityMockDSL.g:14551:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14552:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            // InternalEntityMockDSL.g:14552:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0__1"
+    // InternalEntityMockDSL.g:14560:1: rule__XAnnotation__Group_3_1_0__1 : rule__XAnnotation__Group_3_1_0__1__Impl ;
+    public final void rule__XAnnotation__Group_3_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14564:1: ( rule__XAnnotation__Group_3_1_0__1__Impl )
+            // InternalEntityMockDSL.g:14565:2: rule__XAnnotation__Group_3_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0__1"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0__1__Impl"
+    // InternalEntityMockDSL.g:14571:1: rule__XAnnotation__Group_3_1_0__1__Impl : ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) ;
+    public final void rule__XAnnotation__Group_3_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14575:1: ( ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) )
+            // InternalEntityMockDSL.g:14576:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:14576:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            // InternalEntityMockDSL.g:14577:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:14578:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            loop130:
+            do {
+                int alt130=2;
+                int LA130_0 = input.LA(1);
+
+                if ( (LA130_0==70) ) {
+                    alt130=1;
+                }
+
+
+                switch (alt130) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:14578:3: rule__XAnnotation__Group_3_1_0_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XAnnotation__Group_3_1_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop130;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0"
+    // InternalEntityMockDSL.g:14587:1: rule__XAnnotation__Group_3_1_0_1__0 : rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 ;
+    public final void rule__XAnnotation__Group_3_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14591:1: ( rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 )
+            // InternalEntityMockDSL.g:14592:2: rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__XAnnotation__Group_3_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0_1__0"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0__Impl"
+    // InternalEntityMockDSL.g:14599:1: rule__XAnnotation__Group_3_1_0_1__0__Impl : ( ',' ) ;
+    public final void rule__XAnnotation__Group_3_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14603:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:14604:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:14604:1: ( ',' )
+            // InternalEntityMockDSL.g:14605:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1"
+    // InternalEntityMockDSL.g:14614:1: rule__XAnnotation__Group_3_1_0_1__1 : rule__XAnnotation__Group_3_1_0_1__1__Impl ;
+    public final void rule__XAnnotation__Group_3_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14618:1: ( rule__XAnnotation__Group_3_1_0_1__1__Impl )
+            // InternalEntityMockDSL.g:14619:2: rule__XAnnotation__Group_3_1_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__Group_3_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0_1__1"
+
+
+    // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1__Impl"
+    // InternalEntityMockDSL.g:14625:1: rule__XAnnotation__Group_3_1_0_1__1__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) ;
+    public final void rule__XAnnotation__Group_3_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14629:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) )
+            // InternalEntityMockDSL.g:14630:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:14630:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            // InternalEntityMockDSL.g:14631:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:14632:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            // InternalEntityMockDSL.g:14632:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__Group_3_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group__0"
+    // InternalEntityMockDSL.g:14641:1: rule__XAnnotationElementValuePair__Group__0 : rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 ;
+    public final void rule__XAnnotationElementValuePair__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14645:1: ( rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 )
+            // InternalEntityMockDSL.g:14646:2: rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAnnotationElementValuePair__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group__0__Impl"
+    // InternalEntityMockDSL.g:14653:1: rule__XAnnotationElementValuePair__Group__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) ;
+    public final void rule__XAnnotationElementValuePair__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14657:1: ( ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) )
+            // InternalEntityMockDSL.g:14658:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:14658:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            // InternalEntityMockDSL.g:14659:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:14660:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            // InternalEntityMockDSL.g:14660:3: rule__XAnnotationElementValuePair__Group_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group__1"
+    // InternalEntityMockDSL.g:14668:1: rule__XAnnotationElementValuePair__Group__1 : rule__XAnnotationElementValuePair__Group__1__Impl ;
+    public final void rule__XAnnotationElementValuePair__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14672:1: ( rule__XAnnotationElementValuePair__Group__1__Impl )
+            // InternalEntityMockDSL.g:14673:2: rule__XAnnotationElementValuePair__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group__1__Impl"
+    // InternalEntityMockDSL.g:14679:1: rule__XAnnotationElementValuePair__Group__1__Impl : ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) ;
+    public final void rule__XAnnotationElementValuePair__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14683:1: ( ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:14684:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:14684:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            // InternalEntityMockDSL.g:14685:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:14686:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            // InternalEntityMockDSL.g:14686:3: rule__XAnnotationElementValuePair__ValueAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0"
+    // InternalEntityMockDSL.g:14695:1: rule__XAnnotationElementValuePair__Group_0__0 : rule__XAnnotationElementValuePair__Group_0__0__Impl ;
+    public final void rule__XAnnotationElementValuePair__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14699:1: ( rule__XAnnotationElementValuePair__Group_0__0__Impl )
+            // InternalEntityMockDSL.g:14700:2: rule__XAnnotationElementValuePair__Group_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:14706:1: rule__XAnnotationElementValuePair__Group_0__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) ;
+    public final void rule__XAnnotationElementValuePair__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14710:1: ( ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:14711:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:14711:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:14712:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14713:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            // InternalEntityMockDSL.g:14713:3: rule__XAnnotationElementValuePair__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0"
+    // InternalEntityMockDSL.g:14722:1: rule__XAnnotationElementValuePair__Group_0_0__0 : rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 ;
+    public final void rule__XAnnotationElementValuePair__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14726:1: ( rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 )
+            // InternalEntityMockDSL.g:14727:2: rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1
+            {
+            pushFollow(FOLLOW_107);
+            rule__XAnnotationElementValuePair__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:14734:1: rule__XAnnotationElementValuePair__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) ;
+    public final void rule__XAnnotationElementValuePair__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14738:1: ( ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) )
+            // InternalEntityMockDSL.g:14739:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:14739:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            // InternalEntityMockDSL.g:14740:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14741:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            // InternalEntityMockDSL.g:14741:3: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__ElementAssignment_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1"
+    // InternalEntityMockDSL.g:14749:1: rule__XAnnotationElementValuePair__Group_0_0__1 : rule__XAnnotationElementValuePair__Group_0_0__1__Impl ;
+    public final void rule__XAnnotationElementValuePair__Group_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14753:1: ( rule__XAnnotationElementValuePair__Group_0_0__1__Impl )
+            // InternalEntityMockDSL.g:14754:2: rule__XAnnotationElementValuePair__Group_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValuePair__Group_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0_0__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1__Impl"
+    // InternalEntityMockDSL.g:14760:1: rule__XAnnotationElementValuePair__Group_0_0__1__Impl : ( '=' ) ;
+    public final void rule__XAnnotationElementValuePair__Group_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14764:1: ( ( '=' ) )
+            // InternalEntityMockDSL.g:14765:1: ( '=' )
+            {
+            // InternalEntityMockDSL.g:14765:1: ( '=' )
+            // InternalEntityMockDSL.g:14766:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); 
+            }
+            match(input,13,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__Group_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0"
+    // InternalEntityMockDSL.g:14776:1: rule__XAnnotationElementValueOrCommaList__Group_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14780:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 )
+            // InternalEntityMockDSL.g:14781:2: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1
+            {
+            pushFollow(FOLLOW_108);
+            rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:14788:1: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14792:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:14793:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:14793:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:14794:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14795:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            // InternalEntityMockDSL.g:14795:3: rule__XAnnotationElementValueOrCommaList__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1"
+    // InternalEntityMockDSL.g:14803:1: rule__XAnnotationElementValueOrCommaList__Group_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14807:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 )
+            // InternalEntityMockDSL.g:14808:2: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2
+            {
+            pushFollow(FOLLOW_108);
+            rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:14815:1: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14819:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) )
+            // InternalEntityMockDSL.g:14820:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:14820:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            // InternalEntityMockDSL.g:14821:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); 
+            }
+            // InternalEntityMockDSL.g:14822:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            int alt131=2;
+            int LA131_0 = input.LA(1);
+
+            if ( ((LA131_0>=RULE_ID && LA131_0<=RULE_STRING)||LA131_0==28||(LA131_0>=35 && LA131_0<=36)||LA131_0==41||(LA131_0>=46 && LA131_0<=51)||LA131_0==57||LA131_0==68||LA131_0==122||(LA131_0>=124 && LA131_0<=125)||LA131_0==127||LA131_0==129||(LA131_0>=133 && LA131_0<=141)||LA131_0==143||LA131_0==156) ) {
+                alt131=1;
+            }
+            switch (alt131) {
+                case 1 :
+                    // InternalEntityMockDSL.g:14822:3: rule__XAnnotationElementValueOrCommaList__Group_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValueOrCommaList__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2"
+    // InternalEntityMockDSL.g:14830:1: rule__XAnnotationElementValueOrCommaList__Group_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14834:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl )
+            // InternalEntityMockDSL.g:14835:2: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__2"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:14841:1: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl : ( ']' ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14845:1: ( ( ']' ) )
+            // InternalEntityMockDSL.g:14846:1: ( ']' )
+            {
+            // InternalEntityMockDSL.g:14846:1: ( ']' )
+            // InternalEntityMockDSL.g:14847:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); 
+            }
+            match(input,123,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0"
+    // InternalEntityMockDSL.g:14857:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14861:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl )
+            // InternalEntityMockDSL.g:14862:2: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:14868:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14872:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:14873:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:14873:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            // InternalEntityMockDSL.g:14874:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14875:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            // InternalEntityMockDSL.g:14875:3: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0"
+    // InternalEntityMockDSL.g:14884:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14888:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 )
+            // InternalEntityMockDSL.g:14889:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
+            {
+            pushFollow(FOLLOW_109);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl"
+    // InternalEntityMockDSL.g:14896:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl : ( () ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14900:1: ( ( () ) )
+            // InternalEntityMockDSL.g:14901:1: ( () )
+            {
+            // InternalEntityMockDSL.g:14901:1: ( () )
+            // InternalEntityMockDSL.g:14902:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:14903:2: ()
+            // InternalEntityMockDSL.g:14903:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1"
+    // InternalEntityMockDSL.g:14911:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14915:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 )
+            // InternalEntityMockDSL.g:14916:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
+            {
+            pushFollow(FOLLOW_110);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl"
+    // InternalEntityMockDSL.g:14923:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl : ( '#' ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14927:1: ( ( '#' ) )
+            // InternalEntityMockDSL.g:14928:1: ( '#' )
+            {
+            // InternalEntityMockDSL.g:14928:1: ( '#' )
+            // InternalEntityMockDSL.g:14929:2: '#'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); 
+            }
+            match(input,124,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2"
+    // InternalEntityMockDSL.g:14938:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14942:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl )
+            // InternalEntityMockDSL.g:14943:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl"
+    // InternalEntityMockDSL.g:14949:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl : ( '[' ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14953:1: ( ( '[' ) )
+            // InternalEntityMockDSL.g:14954:1: ( '[' )
+            {
+            // InternalEntityMockDSL.g:14954:1: ( '[' )
+            // InternalEntityMockDSL.g:14955:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0"
+    // InternalEntityMockDSL.g:14965:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14969:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 )
+            // InternalEntityMockDSL.g:14970:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl"
+    // InternalEntityMockDSL.g:14977:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14981:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) )
+            // InternalEntityMockDSL.g:14982:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:14982:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            // InternalEntityMockDSL.g:14983:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:14984:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            // InternalEntityMockDSL.g:14984:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1"
+    // InternalEntityMockDSL.g:14992:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:14996:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl )
+            // InternalEntityMockDSL.g:14997:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl"
+    // InternalEntityMockDSL.g:15003:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15007:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:15008:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:15008:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            // InternalEntityMockDSL.g:15009:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15010:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            loop132:
+            do {
+                int alt132=2;
+                int LA132_0 = input.LA(1);
+
+                if ( (LA132_0==70) ) {
+                    alt132=1;
+                }
+
+
+                switch (alt132) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:15010:3: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop132;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0"
+    // InternalEntityMockDSL.g:15019:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15023:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 )
+            // InternalEntityMockDSL.g:15024:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl"
+    // InternalEntityMockDSL.g:15031:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15035:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:15036:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:15036:1: ( ',' )
+            // InternalEntityMockDSL.g:15037:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1"
+    // InternalEntityMockDSL.g:15046:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15050:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl )
+            // InternalEntityMockDSL.g:15051:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl"
+    // InternalEntityMockDSL.g:15057:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15061:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:15062:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:15062:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            // InternalEntityMockDSL.g:15063:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15064:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            // InternalEntityMockDSL.g:15064:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0"
+    // InternalEntityMockDSL.g:15073:1: rule__XAnnotationElementValueOrCommaList__Group_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15077:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 )
+            // InternalEntityMockDSL.g:15078:2: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:15085:1: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15089:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:15090:1: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:15090:1: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:15091:2: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1"
+    // InternalEntityMockDSL.g:15100:1: rule__XAnnotationElementValueOrCommaList__Group_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15104:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:15105:2: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:15111:1: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15115:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) )
+            // InternalEntityMockDSL.g:15116:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:15116:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            // InternalEntityMockDSL.g:15117:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15118:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            int alt133=2;
+            int LA133_0 = input.LA(1);
+
+            if ( (LA133_0==70) ) {
+                alt133=1;
+            }
+            switch (alt133) {
+                case 1 :
+                    // InternalEntityMockDSL.g:15118:3: rule__XAnnotationElementValueOrCommaList__Group_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValueOrCommaList__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0"
+    // InternalEntityMockDSL.g:15127:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15131:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 )
+            // InternalEntityMockDSL.g:15132:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl"
+    // InternalEntityMockDSL.g:15139:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl : ( () ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15143:1: ( ( () ) )
+            // InternalEntityMockDSL.g:15144:1: ( () )
+            {
+            // InternalEntityMockDSL.g:15144:1: ( () )
+            // InternalEntityMockDSL.g:15145:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:15146:2: ()
+            // InternalEntityMockDSL.g:15146:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1"
+    // InternalEntityMockDSL.g:15154:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15158:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl )
+            // InternalEntityMockDSL.g:15159:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl"
+    // InternalEntityMockDSL.g:15165:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15169:1: ( ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) )
+            // InternalEntityMockDSL.g:15170:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            {
+            // InternalEntityMockDSL.g:15170:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:15171:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:15171:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) )
+            // InternalEntityMockDSL.g:15172:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15173:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            // InternalEntityMockDSL.g:15173:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            {
+            pushFollow(FOLLOW_49);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:15176:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            // InternalEntityMockDSL.g:15177:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15178:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            loop134:
+            do {
+                int alt134=2;
+                int LA134_0 = input.LA(1);
+
+                if ( (LA134_0==70) ) {
+                    alt134=1;
+                }
+
+
+                switch (alt134) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:15178:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop134;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0"
+    // InternalEntityMockDSL.g:15188:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15192:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 )
+            // InternalEntityMockDSL.g:15193:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl"
+    // InternalEntityMockDSL.g:15200:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15204:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:15205:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:15205:1: ( ',' )
+            // InternalEntityMockDSL.g:15206:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1"
+    // InternalEntityMockDSL.g:15215:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15219:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl )
+            // InternalEntityMockDSL.g:15220:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl"
+    // InternalEntityMockDSL.g:15226:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15230:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:15231:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:15231:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            // InternalEntityMockDSL.g:15232:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15233:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            // InternalEntityMockDSL.g:15233:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__0"
+    // InternalEntityMockDSL.g:15242:1: rule__XAnnotationElementValue__Group_0__0 : rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 ;
+    public final void rule__XAnnotationElementValue__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15246:1: ( rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 )
+            // InternalEntityMockDSL.g:15247:2: rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1
+            {
+            pushFollow(FOLLOW_108);
+            rule__XAnnotationElementValue__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:15254:1: rule__XAnnotationElementValue__Group_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) ;
+    public final void rule__XAnnotationElementValue__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15258:1: ( ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:15259:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:15259:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:15260:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15261:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            // InternalEntityMockDSL.g:15261:3: rule__XAnnotationElementValue__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__1"
+    // InternalEntityMockDSL.g:15269:1: rule__XAnnotationElementValue__Group_0__1 : rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 ;
+    public final void rule__XAnnotationElementValue__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15273:1: ( rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 )
+            // InternalEntityMockDSL.g:15274:2: rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2
+            {
+            pushFollow(FOLLOW_108);
+            rule__XAnnotationElementValue__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:15281:1: rule__XAnnotationElementValue__Group_0__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) ;
+    public final void rule__XAnnotationElementValue__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15285:1: ( ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) )
+            // InternalEntityMockDSL.g:15286:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:15286:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            // InternalEntityMockDSL.g:15287:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); 
+            }
+            // InternalEntityMockDSL.g:15288:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            int alt135=2;
+            int LA135_0 = input.LA(1);
+
+            if ( ((LA135_0>=RULE_ID && LA135_0<=RULE_STRING)||LA135_0==28||(LA135_0>=35 && LA135_0<=36)||LA135_0==41||(LA135_0>=46 && LA135_0<=51)||LA135_0==57||LA135_0==68||LA135_0==122||(LA135_0>=124 && LA135_0<=125)||LA135_0==127||LA135_0==129||(LA135_0>=133 && LA135_0<=141)||LA135_0==143||LA135_0==156) ) {
+                alt135=1;
+            }
+            switch (alt135) {
+                case 1 :
+                    // InternalEntityMockDSL.g:15288:3: rule__XAnnotationElementValue__Group_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAnnotationElementValue__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__2"
+    // InternalEntityMockDSL.g:15296:1: rule__XAnnotationElementValue__Group_0__2 : rule__XAnnotationElementValue__Group_0__2__Impl ;
+    public final void rule__XAnnotationElementValue__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15300:1: ( rule__XAnnotationElementValue__Group_0__2__Impl )
+            // InternalEntityMockDSL.g:15301:2: rule__XAnnotationElementValue__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__2"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:15307:1: rule__XAnnotationElementValue__Group_0__2__Impl : ( ']' ) ;
+    public final void rule__XAnnotationElementValue__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15311:1: ( ( ']' ) )
+            // InternalEntityMockDSL.g:15312:1: ( ']' )
+            {
+            // InternalEntityMockDSL.g:15312:1: ( ']' )
+            // InternalEntityMockDSL.g:15313:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); 
+            }
+            match(input,123,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0"
+    // InternalEntityMockDSL.g:15323:1: rule__XAnnotationElementValue__Group_0_0__0 : rule__XAnnotationElementValue__Group_0_0__0__Impl ;
+    public final void rule__XAnnotationElementValue__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15327:1: ( rule__XAnnotationElementValue__Group_0_0__0__Impl )
+            // InternalEntityMockDSL.g:15328:2: rule__XAnnotationElementValue__Group_0_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:15334:1: rule__XAnnotationElementValue__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) ;
+    public final void rule__XAnnotationElementValue__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15338:1: ( ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:15339:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:15339:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            // InternalEntityMockDSL.g:15340:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15341:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            // InternalEntityMockDSL.g:15341:3: rule__XAnnotationElementValue__Group_0_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0"
+    // InternalEntityMockDSL.g:15350:1: rule__XAnnotationElementValue__Group_0_0_0__0 : rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15354:1: ( rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 )
+            // InternalEntityMockDSL.g:15355:2: rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1
+            {
+            pushFollow(FOLLOW_109);
+            rule__XAnnotationElementValue__Group_0_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0__Impl"
+    // InternalEntityMockDSL.g:15362:1: rule__XAnnotationElementValue__Group_0_0_0__0__Impl : ( () ) ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15366:1: ( ( () ) )
+            // InternalEntityMockDSL.g:15367:1: ( () )
+            {
+            // InternalEntityMockDSL.g:15367:1: ( () )
+            // InternalEntityMockDSL.g:15368:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15369:2: ()
+            // InternalEntityMockDSL.g:15369:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1"
+    // InternalEntityMockDSL.g:15377:1: rule__XAnnotationElementValue__Group_0_0_0__1 : rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15381:1: ( rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 )
+            // InternalEntityMockDSL.g:15382:2: rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2
+            {
+            pushFollow(FOLLOW_110);
+            rule__XAnnotationElementValue__Group_0_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1__Impl"
+    // InternalEntityMockDSL.g:15389:1: rule__XAnnotationElementValue__Group_0_0_0__1__Impl : ( '#' ) ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15393:1: ( ( '#' ) )
+            // InternalEntityMockDSL.g:15394:1: ( '#' )
+            {
+            // InternalEntityMockDSL.g:15394:1: ( '#' )
+            // InternalEntityMockDSL.g:15395:2: '#'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); 
+            }
+            match(input,124,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2"
+    // InternalEntityMockDSL.g:15404:1: rule__XAnnotationElementValue__Group_0_0_0__2 : rule__XAnnotationElementValue__Group_0_0_0__2__Impl ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15408:1: ( rule__XAnnotationElementValue__Group_0_0_0__2__Impl )
+            // InternalEntityMockDSL.g:15409:2: rule__XAnnotationElementValue__Group_0_0_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__2"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2__Impl"
+    // InternalEntityMockDSL.g:15415:1: rule__XAnnotationElementValue__Group_0_0_0__2__Impl : ( '[' ) ;
+    public final void rule__XAnnotationElementValue__Group_0_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15419:1: ( ( '[' ) )
+            // InternalEntityMockDSL.g:15420:1: ( '[' )
+            {
+            // InternalEntityMockDSL.g:15420:1: ( '[' )
+            // InternalEntityMockDSL.g:15421:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0"
+    // InternalEntityMockDSL.g:15431:1: rule__XAnnotationElementValue__Group_0_1__0 : rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 ;
+    public final void rule__XAnnotationElementValue__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15435:1: ( rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 )
+            // InternalEntityMockDSL.g:15436:2: rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XAnnotationElementValue__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0__Impl"
+    // InternalEntityMockDSL.g:15443:1: rule__XAnnotationElementValue__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) ;
+    public final void rule__XAnnotationElementValue__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15447:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) )
+            // InternalEntityMockDSL.g:15448:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:15448:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            // InternalEntityMockDSL.g:15449:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:15450:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            // InternalEntityMockDSL.g:15450:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__ElementsAssignment_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1"
+    // InternalEntityMockDSL.g:15458:1: rule__XAnnotationElementValue__Group_0_1__1 : rule__XAnnotationElementValue__Group_0_1__1__Impl ;
+    public final void rule__XAnnotationElementValue__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15462:1: ( rule__XAnnotationElementValue__Group_0_1__1__Impl )
+            // InternalEntityMockDSL.g:15463:2: rule__XAnnotationElementValue__Group_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1__Impl"
+    // InternalEntityMockDSL.g:15469:1: rule__XAnnotationElementValue__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) ;
+    public final void rule__XAnnotationElementValue__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15473:1: ( ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:15474:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:15474:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            // InternalEntityMockDSL.g:15475:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15476:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            loop136:
+            do {
+                int alt136=2;
+                int LA136_0 = input.LA(1);
+
+                if ( (LA136_0==70) ) {
+                    alt136=1;
+                }
+
+
+                switch (alt136) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:15476:3: rule__XAnnotationElementValue__Group_0_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XAnnotationElementValue__Group_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop136;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0"
+    // InternalEntityMockDSL.g:15485:1: rule__XAnnotationElementValue__Group_0_1_1__0 : rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 ;
+    public final void rule__XAnnotationElementValue__Group_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15489:1: ( rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 )
+            // InternalEntityMockDSL.g:15490:2: rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAnnotationElementValue__Group_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1_1__0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0__Impl"
+    // InternalEntityMockDSL.g:15497:1: rule__XAnnotationElementValue__Group_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XAnnotationElementValue__Group_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15501:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:15502:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:15502:1: ( ',' )
+            // InternalEntityMockDSL.g:15503:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1"
+    // InternalEntityMockDSL.g:15512:1: rule__XAnnotationElementValue__Group_0_1_1__1 : rule__XAnnotationElementValue__Group_0_1_1__1__Impl ;
+    public final void rule__XAnnotationElementValue__Group_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15516:1: ( rule__XAnnotationElementValue__Group_0_1_1__1__Impl )
+            // InternalEntityMockDSL.g:15517:2: rule__XAnnotationElementValue__Group_0_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__Group_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1_1__1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1__Impl"
+    // InternalEntityMockDSL.g:15523:1: rule__XAnnotationElementValue__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) ;
+    public final void rule__XAnnotationElementValue__Group_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15527:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:15528:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:15528:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            // InternalEntityMockDSL.g:15529:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15530:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            // InternalEntityMockDSL.g:15530:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__Group_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__0"
+    // InternalEntityMockDSL.g:15539:1: rule__XAssignment__Group_0__0 : rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 ;
+    public final void rule__XAssignment__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15543:1: ( rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 )
+            // InternalEntityMockDSL.g:15544:2: rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1
+            {
+            pushFollow(FOLLOW_111);
+            rule__XAssignment__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__0"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:15551:1: rule__XAssignment__Group_0__0__Impl : ( () ) ;
+    public final void rule__XAssignment__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15555:1: ( ( () ) )
+            // InternalEntityMockDSL.g:15556:1: ( () )
+            {
+            // InternalEntityMockDSL.g:15556:1: ( () )
+            // InternalEntityMockDSL.g:15557:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15558:2: ()
+            // InternalEntityMockDSL.g:15558:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__1"
+    // InternalEntityMockDSL.g:15566:1: rule__XAssignment__Group_0__1 : rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 ;
+    public final void rule__XAssignment__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15570:1: ( rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 )
+            // InternalEntityMockDSL.g:15571:2: rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2
+            {
+            pushFollow(FOLLOW_107);
+            rule__XAssignment__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__1"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:15578:1: rule__XAssignment__Group_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) ;
+    public final void rule__XAssignment__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15582:1: ( ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) )
+            // InternalEntityMockDSL.g:15583:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:15583:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            // InternalEntityMockDSL.g:15584:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); 
+            }
+            // InternalEntityMockDSL.g:15585:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            // InternalEntityMockDSL.g:15585:3: rule__XAssignment__FeatureAssignment_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__FeatureAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__2"
+    // InternalEntityMockDSL.g:15593:1: rule__XAssignment__Group_0__2 : rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 ;
+    public final void rule__XAssignment__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15597:1: ( rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 )
+            // InternalEntityMockDSL.g:15598:2: rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAssignment__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__2"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:15605:1: rule__XAssignment__Group_0__2__Impl : ( ruleOpSingleAssign ) ;
+    public final void rule__XAssignment__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15609:1: ( ( ruleOpSingleAssign ) )
+            // InternalEntityMockDSL.g:15610:1: ( ruleOpSingleAssign )
+            {
+            // InternalEntityMockDSL.g:15610:1: ( ruleOpSingleAssign )
+            // InternalEntityMockDSL.g:15611:2: ruleOpSingleAssign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpSingleAssign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__3"
+    // InternalEntityMockDSL.g:15620:1: rule__XAssignment__Group_0__3 : rule__XAssignment__Group_0__3__Impl ;
+    public final void rule__XAssignment__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15624:1: ( rule__XAssignment__Group_0__3__Impl )
+            // InternalEntityMockDSL.g:15625:2: rule__XAssignment__Group_0__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__3"
+
+
+    // $ANTLR start "rule__XAssignment__Group_0__3__Impl"
+    // InternalEntityMockDSL.g:15631:1: rule__XAssignment__Group_0__3__Impl : ( ( rule__XAssignment__ValueAssignment_0_3 ) ) ;
+    public final void rule__XAssignment__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15635:1: ( ( ( rule__XAssignment__ValueAssignment_0_3 ) ) )
+            // InternalEntityMockDSL.g:15636:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            {
+            // InternalEntityMockDSL.g:15636:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            // InternalEntityMockDSL.g:15637:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); 
+            }
+            // InternalEntityMockDSL.g:15638:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            // InternalEntityMockDSL.g:15638:3: rule__XAssignment__ValueAssignment_0_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__ValueAssignment_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1__0"
+    // InternalEntityMockDSL.g:15647:1: rule__XAssignment__Group_1__0 : rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 ;
+    public final void rule__XAssignment__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15651:1: ( rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 )
+            // InternalEntityMockDSL.g:15652:2: rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1
+            {
+            pushFollow(FOLLOW_112);
+            rule__XAssignment__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1__0"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:15659:1: rule__XAssignment__Group_1__0__Impl : ( ruleXOrExpression ) ;
+    public final void rule__XAssignment__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15663:1: ( ( ruleXOrExpression ) )
+            // InternalEntityMockDSL.g:15664:1: ( ruleXOrExpression )
+            {
+            // InternalEntityMockDSL.g:15664:1: ( ruleXOrExpression )
+            // InternalEntityMockDSL.g:15665:2: ruleXOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1__1"
+    // InternalEntityMockDSL.g:15674:1: rule__XAssignment__Group_1__1 : rule__XAssignment__Group_1__1__Impl ;
+    public final void rule__XAssignment__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15678:1: ( rule__XAssignment__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:15679:2: rule__XAssignment__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1__1"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:15685:1: rule__XAssignment__Group_1__1__Impl : ( ( rule__XAssignment__Group_1_1__0 )? ) ;
+    public final void rule__XAssignment__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15689:1: ( ( ( rule__XAssignment__Group_1_1__0 )? ) )
+            // InternalEntityMockDSL.g:15690:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:15690:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            // InternalEntityMockDSL.g:15691:2: ( rule__XAssignment__Group_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15692:2: ( rule__XAssignment__Group_1_1__0 )?
+            int alt137=2;
+            alt137 = dfa137.predict(input);
+            switch (alt137) {
+                case 1 :
+                    // InternalEntityMockDSL.g:15692:3: rule__XAssignment__Group_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XAssignment__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getGroup_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1__0"
+    // InternalEntityMockDSL.g:15701:1: rule__XAssignment__Group_1_1__0 : rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 ;
+    public final void rule__XAssignment__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15705:1: ( rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 )
+            // InternalEntityMockDSL.g:15706:2: rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAssignment__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1__0"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1__0__Impl"
+    // InternalEntityMockDSL.g:15713:1: rule__XAssignment__Group_1_1__0__Impl : ( ( rule__XAssignment__Group_1_1_0__0 ) ) ;
+    public final void rule__XAssignment__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15717:1: ( ( ( rule__XAssignment__Group_1_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:15718:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:15718:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            // InternalEntityMockDSL.g:15719:2: ( rule__XAssignment__Group_1_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:15720:2: ( rule__XAssignment__Group_1_1_0__0 )
+            // InternalEntityMockDSL.g:15720:3: rule__XAssignment__Group_1_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1__1"
+    // InternalEntityMockDSL.g:15728:1: rule__XAssignment__Group_1_1__1 : rule__XAssignment__Group_1_1__1__Impl ;
+    public final void rule__XAssignment__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15732:1: ( rule__XAssignment__Group_1_1__1__Impl )
+            // InternalEntityMockDSL.g:15733:2: rule__XAssignment__Group_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1__1"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1__1__Impl"
+    // InternalEntityMockDSL.g:15739:1: rule__XAssignment__Group_1_1__1__Impl : ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) ;
+    public final void rule__XAssignment__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15743:1: ( ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:15744:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:15744:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            // InternalEntityMockDSL.g:15745:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:15746:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            // InternalEntityMockDSL.g:15746:3: rule__XAssignment__RightOperandAssignment_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__RightOperandAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0__0"
+    // InternalEntityMockDSL.g:15755:1: rule__XAssignment__Group_1_1_0__0 : rule__XAssignment__Group_1_1_0__0__Impl ;
+    public final void rule__XAssignment__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15759:1: ( rule__XAssignment__Group_1_1_0__0__Impl )
+            // InternalEntityMockDSL.g:15760:2: rule__XAssignment__Group_1_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0__0__Impl"
+    // InternalEntityMockDSL.g:15766:1: rule__XAssignment__Group_1_1_0__0__Impl : ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) ;
+    public final void rule__XAssignment__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15770:1: ( ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:15771:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:15771:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:15772:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15773:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            // InternalEntityMockDSL.g:15773:3: rule__XAssignment__Group_1_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0"
+    // InternalEntityMockDSL.g:15782:1: rule__XAssignment__Group_1_1_0_0__0 : rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 ;
+    public final void rule__XAssignment__Group_1_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15786:1: ( rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 )
+            // InternalEntityMockDSL.g:15787:2: rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1
+            {
+            pushFollow(FOLLOW_112);
+            rule__XAssignment__Group_1_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0_0__0"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:15794:1: rule__XAssignment__Group_1_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XAssignment__Group_1_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15798:1: ( ( () ) )
+            // InternalEntityMockDSL.g:15799:1: ( () )
+            {
+            // InternalEntityMockDSL.g:15799:1: ( () )
+            // InternalEntityMockDSL.g:15800:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:15801:2: ()
+            // InternalEntityMockDSL.g:15801:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1"
+    // InternalEntityMockDSL.g:15809:1: rule__XAssignment__Group_1_1_0_0__1 : rule__XAssignment__Group_1_1_0_0__1__Impl ;
+    public final void rule__XAssignment__Group_1_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15813:1: ( rule__XAssignment__Group_1_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:15814:2: rule__XAssignment__Group_1_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__Group_1_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0_0__1"
+
+
+    // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:15820:1: rule__XAssignment__Group_1_1_0_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) ;
+    public final void rule__XAssignment__Group_1_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15824:1: ( ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:15825:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:15825:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:15826:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:15827:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            // InternalEntityMockDSL.g:15827:3: rule__XAssignment__FeatureAssignment_1_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAssignment__FeatureAssignment_1_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__Group_1_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__0"
+    // InternalEntityMockDSL.g:15836:1: rule__OpMultiAssign__Group_5__0 : rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 ;
+    public final void rule__OpMultiAssign__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15840:1: ( rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 )
+            // InternalEntityMockDSL.g:15841:2: rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1
+            {
+            pushFollow(FOLLOW_113);
+            rule__OpMultiAssign__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__0"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__0__Impl"
+    // InternalEntityMockDSL.g:15848:1: rule__OpMultiAssign__Group_5__0__Impl : ( '<' ) ;
+    public final void rule__OpMultiAssign__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15852:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:15853:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:15853:1: ( '<' )
+            // InternalEntityMockDSL.g:15854:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__1"
+    // InternalEntityMockDSL.g:15863:1: rule__OpMultiAssign__Group_5__1 : rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 ;
+    public final void rule__OpMultiAssign__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15867:1: ( rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 )
+            // InternalEntityMockDSL.g:15868:2: rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2
+            {
+            pushFollow(FOLLOW_107);
+            rule__OpMultiAssign__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__1"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__1__Impl"
+    // InternalEntityMockDSL.g:15875:1: rule__OpMultiAssign__Group_5__1__Impl : ( '<' ) ;
+    public final void rule__OpMultiAssign__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15879:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:15880:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:15880:1: ( '<' )
+            // InternalEntityMockDSL.g:15881:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__2"
+    // InternalEntityMockDSL.g:15890:1: rule__OpMultiAssign__Group_5__2 : rule__OpMultiAssign__Group_5__2__Impl ;
+    public final void rule__OpMultiAssign__Group_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15894:1: ( rule__OpMultiAssign__Group_5__2__Impl )
+            // InternalEntityMockDSL.g:15895:2: rule__OpMultiAssign__Group_5__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__2"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_5__2__Impl"
+    // InternalEntityMockDSL.g:15901:1: rule__OpMultiAssign__Group_5__2__Impl : ( '=' ) ;
+    public final void rule__OpMultiAssign__Group_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15905:1: ( ( '=' ) )
+            // InternalEntityMockDSL.g:15906:1: ( '=' )
+            {
+            // InternalEntityMockDSL.g:15906:1: ( '=' )
+            // InternalEntityMockDSL.g:15907:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
+            }
+            match(input,13,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_5__2__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__0"
+    // InternalEntityMockDSL.g:15917:1: rule__OpMultiAssign__Group_6__0 : rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 ;
+    public final void rule__OpMultiAssign__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15921:1: ( rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 )
+            // InternalEntityMockDSL.g:15922:2: rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1
+            {
+            pushFollow(FOLLOW_114);
+            rule__OpMultiAssign__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__0"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:15929:1: rule__OpMultiAssign__Group_6__0__Impl : ( '>' ) ;
+    public final void rule__OpMultiAssign__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15933:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:15934:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:15934:1: ( '>' )
+            // InternalEntityMockDSL.g:15935:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__1"
+    // InternalEntityMockDSL.g:15944:1: rule__OpMultiAssign__Group_6__1 : rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 ;
+    public final void rule__OpMultiAssign__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15948:1: ( rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 )
+            // InternalEntityMockDSL.g:15949:2: rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2
+            {
+            pushFollow(FOLLOW_114);
+            rule__OpMultiAssign__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_6__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__1"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:15956:1: rule__OpMultiAssign__Group_6__1__Impl : ( ( '>' )? ) ;
+    public final void rule__OpMultiAssign__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15960:1: ( ( ( '>' )? ) )
+            // InternalEntityMockDSL.g:15961:1: ( ( '>' )? )
+            {
+            // InternalEntityMockDSL.g:15961:1: ( ( '>' )? )
+            // InternalEntityMockDSL.g:15962:2: ( '>' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
+            }
+            // InternalEntityMockDSL.g:15963:2: ( '>' )?
+            int alt138=2;
+            int LA138_0 = input.LA(1);
+
+            if ( (LA138_0==27) ) {
+                alt138=1;
+            }
+            switch (alt138) {
+                case 1 :
+                    // InternalEntityMockDSL.g:15963:3: '>'
+                    {
+                    match(input,27,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__2"
+    // InternalEntityMockDSL.g:15971:1: rule__OpMultiAssign__Group_6__2 : rule__OpMultiAssign__Group_6__2__Impl ;
+    public final void rule__OpMultiAssign__Group_6__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15975:1: ( rule__OpMultiAssign__Group_6__2__Impl )
+            // InternalEntityMockDSL.g:15976:2: rule__OpMultiAssign__Group_6__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpMultiAssign__Group_6__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__2"
+
+
+    // $ANTLR start "rule__OpMultiAssign__Group_6__2__Impl"
+    // InternalEntityMockDSL.g:15982:1: rule__OpMultiAssign__Group_6__2__Impl : ( '>=' ) ;
+    public final void rule__OpMultiAssign__Group_6__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:15986:1: ( ( '>=' ) )
+            // InternalEntityMockDSL.g:15987:1: ( '>=' )
+            {
+            // InternalEntityMockDSL.g:15987:1: ( '>=' )
+            // InternalEntityMockDSL.g:15988:2: '>='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
+            }
+            match(input,26,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpMultiAssign__Group_6__2__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group__0"
+    // InternalEntityMockDSL.g:15998:1: rule__XOrExpression__Group__0 : rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 ;
+    public final void rule__XOrExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16002:1: ( rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 )
+            // InternalEntityMockDSL.g:16003:2: rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1
+            {
+            pushFollow(FOLLOW_115);
+            rule__XOrExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group__0"
+
+
+    // $ANTLR start "rule__XOrExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:16010:1: rule__XOrExpression__Group__0__Impl : ( ruleXAndExpression ) ;
+    public final void rule__XOrExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16014:1: ( ( ruleXAndExpression ) )
+            // InternalEntityMockDSL.g:16015:1: ( ruleXAndExpression )
+            {
+            // InternalEntityMockDSL.g:16015:1: ( ruleXAndExpression )
+            // InternalEntityMockDSL.g:16016:2: ruleXAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group__1"
+    // InternalEntityMockDSL.g:16025:1: rule__XOrExpression__Group__1 : rule__XOrExpression__Group__1__Impl ;
+    public final void rule__XOrExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16029:1: ( rule__XOrExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:16030:2: rule__XOrExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group__1"
+
+
+    // $ANTLR start "rule__XOrExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:16036:1: rule__XOrExpression__Group__1__Impl : ( ( rule__XOrExpression__Group_1__0 )* ) ;
+    public final void rule__XOrExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16040:1: ( ( ( rule__XOrExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:16041:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:16041:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:16042:2: ( rule__XOrExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:16043:2: ( rule__XOrExpression__Group_1__0 )*
+            loop139:
+            do {
+                int alt139=2;
+                int LA139_0 = input.LA(1);
+
+                if ( (LA139_0==14) ) {
+                    int LA139_2 = input.LA(2);
+
+                    if ( (synpred206_InternalEntityMockDSL()) ) {
+                        alt139=1;
+                    }
+
+
+                }
+
+
+                switch (alt139) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:16043:3: rule__XOrExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_116);
+            	    rule__XOrExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop139;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1__0"
+    // InternalEntityMockDSL.g:16052:1: rule__XOrExpression__Group_1__0 : rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 ;
+    public final void rule__XOrExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16056:1: ( rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:16057:2: rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XOrExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:16064:1: rule__XOrExpression__Group_1__0__Impl : ( ( rule__XOrExpression__Group_1_0__0 ) ) ;
+    public final void rule__XOrExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16068:1: ( ( ( rule__XOrExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:16069:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16069:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:16070:2: ( rule__XOrExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:16071:2: ( rule__XOrExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:16071:3: rule__XOrExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1__1"
+    // InternalEntityMockDSL.g:16079:1: rule__XOrExpression__Group_1__1 : rule__XOrExpression__Group_1__1__Impl ;
+    public final void rule__XOrExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16083:1: ( rule__XOrExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:16084:2: rule__XOrExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:16090:1: rule__XOrExpression__Group_1__1__Impl : ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XOrExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16094:1: ( ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:16095:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:16095:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:16096:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:16097:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:16097:3: rule__XOrExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:16106:1: rule__XOrExpression__Group_1_0__0 : rule__XOrExpression__Group_1_0__0__Impl ;
+    public final void rule__XOrExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16110:1: ( rule__XOrExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:16111:2: rule__XOrExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:16117:1: rule__XOrExpression__Group_1_0__0__Impl : ( ( rule__XOrExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XOrExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16121:1: ( ( ( rule__XOrExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16122:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16122:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:16123:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16124:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:16124:3: rule__XOrExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:16133:1: rule__XOrExpression__Group_1_0_0__0 : rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 ;
+    public final void rule__XOrExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16137:1: ( rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:16138:2: rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_115);
+            rule__XOrExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16145:1: rule__XOrExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XOrExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16149:1: ( ( () ) )
+            // InternalEntityMockDSL.g:16150:1: ( () )
+            {
+            // InternalEntityMockDSL.g:16150:1: ( () )
+            // InternalEntityMockDSL.g:16151:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16152:2: ()
+            // InternalEntityMockDSL.g:16152:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:16160:1: rule__XOrExpression__Group_1_0_0__1 : rule__XOrExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XOrExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16164:1: ( rule__XOrExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:16165:2: rule__XOrExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XOrExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:16171:1: rule__XOrExpression__Group_1_0_0__1__Impl : ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XOrExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16175:1: ( ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:16176:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:16176:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:16177:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:16178:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:16178:3: rule__XOrExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOrExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group__0"
+    // InternalEntityMockDSL.g:16187:1: rule__XAndExpression__Group__0 : rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 ;
+    public final void rule__XAndExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16191:1: ( rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 )
+            // InternalEntityMockDSL.g:16192:2: rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1
+            {
+            pushFollow(FOLLOW_117);
+            rule__XAndExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group__0"
+
+
+    // $ANTLR start "rule__XAndExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:16199:1: rule__XAndExpression__Group__0__Impl : ( ruleXEqualityExpression ) ;
+    public final void rule__XAndExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16203:1: ( ( ruleXEqualityExpression ) )
+            // InternalEntityMockDSL.g:16204:1: ( ruleXEqualityExpression )
+            {
+            // InternalEntityMockDSL.g:16204:1: ( ruleXEqualityExpression )
+            // InternalEntityMockDSL.g:16205:2: ruleXEqualityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group__1"
+    // InternalEntityMockDSL.g:16214:1: rule__XAndExpression__Group__1 : rule__XAndExpression__Group__1__Impl ;
+    public final void rule__XAndExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16218:1: ( rule__XAndExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:16219:2: rule__XAndExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group__1"
+
+
+    // $ANTLR start "rule__XAndExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:16225:1: rule__XAndExpression__Group__1__Impl : ( ( rule__XAndExpression__Group_1__0 )* ) ;
+    public final void rule__XAndExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16229:1: ( ( ( rule__XAndExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:16230:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:16230:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:16231:2: ( rule__XAndExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:16232:2: ( rule__XAndExpression__Group_1__0 )*
+            loop140:
+            do {
+                int alt140=2;
+                int LA140_0 = input.LA(1);
+
+                if ( (LA140_0==15) ) {
+                    int LA140_2 = input.LA(2);
+
+                    if ( (synpred207_InternalEntityMockDSL()) ) {
+                        alt140=1;
+                    }
+
+
+                }
+
+
+                switch (alt140) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:16232:3: rule__XAndExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_118);
+            	    rule__XAndExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop140;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1__0"
+    // InternalEntityMockDSL.g:16241:1: rule__XAndExpression__Group_1__0 : rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 ;
+    public final void rule__XAndExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16245:1: ( rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:16246:2: rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAndExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:16253:1: rule__XAndExpression__Group_1__0__Impl : ( ( rule__XAndExpression__Group_1_0__0 ) ) ;
+    public final void rule__XAndExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16257:1: ( ( ( rule__XAndExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:16258:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16258:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:16259:2: ( rule__XAndExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:16260:2: ( rule__XAndExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:16260:3: rule__XAndExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1__1"
+    // InternalEntityMockDSL.g:16268:1: rule__XAndExpression__Group_1__1 : rule__XAndExpression__Group_1__1__Impl ;
+    public final void rule__XAndExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16272:1: ( rule__XAndExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:16273:2: rule__XAndExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:16279:1: rule__XAndExpression__Group_1__1__Impl : ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XAndExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16283:1: ( ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:16284:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:16284:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:16285:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:16286:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:16286:3: rule__XAndExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:16295:1: rule__XAndExpression__Group_1_0__0 : rule__XAndExpression__Group_1_0__0__Impl ;
+    public final void rule__XAndExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16299:1: ( rule__XAndExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:16300:2: rule__XAndExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:16306:1: rule__XAndExpression__Group_1_0__0__Impl : ( ( rule__XAndExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XAndExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16310:1: ( ( ( rule__XAndExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16311:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16311:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:16312:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16313:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:16313:3: rule__XAndExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:16322:1: rule__XAndExpression__Group_1_0_0__0 : rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 ;
+    public final void rule__XAndExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16326:1: ( rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:16327:2: rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_117);
+            rule__XAndExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16334:1: rule__XAndExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XAndExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16338:1: ( ( () ) )
+            // InternalEntityMockDSL.g:16339:1: ( () )
+            {
+            // InternalEntityMockDSL.g:16339:1: ( () )
+            // InternalEntityMockDSL.g:16340:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16341:2: ()
+            // InternalEntityMockDSL.g:16341:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:16349:1: rule__XAndExpression__Group_1_0_0__1 : rule__XAndExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XAndExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16353:1: ( rule__XAndExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:16354:2: rule__XAndExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XAndExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:16360:1: rule__XAndExpression__Group_1_0_0__1__Impl : ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XAndExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16364:1: ( ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:16365:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:16365:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:16366:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:16367:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:16367:3: rule__XAndExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAndExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group__0"
+    // InternalEntityMockDSL.g:16376:1: rule__XEqualityExpression__Group__0 : rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 ;
+    public final void rule__XEqualityExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16380:1: ( rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 )
+            // InternalEntityMockDSL.g:16381:2: rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1
+            {
+            pushFollow(FOLLOW_119);
+            rule__XEqualityExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group__0"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:16388:1: rule__XEqualityExpression__Group__0__Impl : ( ruleXRelationalExpression ) ;
+    public final void rule__XEqualityExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16392:1: ( ( ruleXRelationalExpression ) )
+            // InternalEntityMockDSL.g:16393:1: ( ruleXRelationalExpression )
+            {
+            // InternalEntityMockDSL.g:16393:1: ( ruleXRelationalExpression )
+            // InternalEntityMockDSL.g:16394:2: ruleXRelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group__1"
+    // InternalEntityMockDSL.g:16403:1: rule__XEqualityExpression__Group__1 : rule__XEqualityExpression__Group__1__Impl ;
+    public final void rule__XEqualityExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16407:1: ( rule__XEqualityExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:16408:2: rule__XEqualityExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group__1"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:16414:1: rule__XEqualityExpression__Group__1__Impl : ( ( rule__XEqualityExpression__Group_1__0 )* ) ;
+    public final void rule__XEqualityExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16418:1: ( ( ( rule__XEqualityExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:16419:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:16419:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:16420:2: ( rule__XEqualityExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:16421:2: ( rule__XEqualityExpression__Group_1__0 )*
+            loop141:
+            do {
+                int alt141=2;
+                switch ( input.LA(1) ) {
+                case 22:
+                    {
+                    int LA141_2 = input.LA(2);
+
+                    if ( (synpred208_InternalEntityMockDSL()) ) {
+                        alt141=1;
+                    }
+
+
+                    }
+                    break;
+                case 23:
+                    {
+                    int LA141_3 = input.LA(2);
+
+                    if ( (synpred208_InternalEntityMockDSL()) ) {
+                        alt141=1;
+                    }
+
+
+                    }
+                    break;
+                case 24:
+                    {
+                    int LA141_4 = input.LA(2);
+
+                    if ( (synpred208_InternalEntityMockDSL()) ) {
+                        alt141=1;
+                    }
+
+
+                    }
+                    break;
+                case 25:
+                    {
+                    int LA141_5 = input.LA(2);
+
+                    if ( (synpred208_InternalEntityMockDSL()) ) {
+                        alt141=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt141) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:16421:3: rule__XEqualityExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_120);
+            	    rule__XEqualityExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop141;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1__0"
+    // InternalEntityMockDSL.g:16430:1: rule__XEqualityExpression__Group_1__0 : rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 ;
+    public final void rule__XEqualityExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16434:1: ( rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:16435:2: rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XEqualityExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:16442:1: rule__XEqualityExpression__Group_1__0__Impl : ( ( rule__XEqualityExpression__Group_1_0__0 ) ) ;
+    public final void rule__XEqualityExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16446:1: ( ( ( rule__XEqualityExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:16447:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16447:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:16448:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:16449:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:16449:3: rule__XEqualityExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1__1"
+    // InternalEntityMockDSL.g:16457:1: rule__XEqualityExpression__Group_1__1 : rule__XEqualityExpression__Group_1__1__Impl ;
+    public final void rule__XEqualityExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16461:1: ( rule__XEqualityExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:16462:2: rule__XEqualityExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:16468:1: rule__XEqualityExpression__Group_1__1__Impl : ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XEqualityExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16472:1: ( ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:16473:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:16473:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:16474:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:16475:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:16475:3: rule__XEqualityExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:16484:1: rule__XEqualityExpression__Group_1_0__0 : rule__XEqualityExpression__Group_1_0__0__Impl ;
+    public final void rule__XEqualityExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16488:1: ( rule__XEqualityExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:16489:2: rule__XEqualityExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:16495:1: rule__XEqualityExpression__Group_1_0__0__Impl : ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XEqualityExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16499:1: ( ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16500:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16500:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:16501:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16502:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:16502:3: rule__XEqualityExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:16511:1: rule__XEqualityExpression__Group_1_0_0__0 : rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 ;
+    public final void rule__XEqualityExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16515:1: ( rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:16516:2: rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_119);
+            rule__XEqualityExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16523:1: rule__XEqualityExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XEqualityExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16527:1: ( ( () ) )
+            // InternalEntityMockDSL.g:16528:1: ( () )
+            {
+            // InternalEntityMockDSL.g:16528:1: ( () )
+            // InternalEntityMockDSL.g:16529:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16530:2: ()
+            // InternalEntityMockDSL.g:16530:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:16538:1: rule__XEqualityExpression__Group_1_0_0__1 : rule__XEqualityExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XEqualityExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16542:1: ( rule__XEqualityExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:16543:2: rule__XEqualityExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:16549:1: rule__XEqualityExpression__Group_1_0_0__1__Impl : ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XEqualityExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16553:1: ( ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:16554:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:16554:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:16555:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:16556:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:16556:3: rule__XEqualityExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XEqualityExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group__0"
+    // InternalEntityMockDSL.g:16565:1: rule__XRelationalExpression__Group__0 : rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 ;
+    public final void rule__XRelationalExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16569:1: ( rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 )
+            // InternalEntityMockDSL.g:16570:2: rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1
+            {
+            pushFollow(FOLLOW_121);
+            rule__XRelationalExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:16577:1: rule__XRelationalExpression__Group__0__Impl : ( ruleXOtherOperatorExpression ) ;
+    public final void rule__XRelationalExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16581:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalEntityMockDSL.g:16582:1: ( ruleXOtherOperatorExpression )
+            {
+            // InternalEntityMockDSL.g:16582:1: ( ruleXOtherOperatorExpression )
+            // InternalEntityMockDSL.g:16583:2: ruleXOtherOperatorExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group__1"
+    // InternalEntityMockDSL.g:16592:1: rule__XRelationalExpression__Group__1 : rule__XRelationalExpression__Group__1__Impl ;
+    public final void rule__XRelationalExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16596:1: ( rule__XRelationalExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:16597:2: rule__XRelationalExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group__1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:16603:1: rule__XRelationalExpression__Group__1__Impl : ( ( rule__XRelationalExpression__Alternatives_1 )* ) ;
+    public final void rule__XRelationalExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16607:1: ( ( ( rule__XRelationalExpression__Alternatives_1 )* ) )
+            // InternalEntityMockDSL.g:16608:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            {
+            // InternalEntityMockDSL.g:16608:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            // InternalEntityMockDSL.g:16609:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalEntityMockDSL.g:16610:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            loop142:
+            do {
+                int alt142=2;
+                switch ( input.LA(1) ) {
+                case 28:
+                    {
+                    int LA142_2 = input.LA(2);
+
+                    if ( (synpred209_InternalEntityMockDSL()) ) {
+                        alt142=1;
+                    }
+
+
+                    }
+                    break;
+                case 27:
+                    {
+                    int LA142_3 = input.LA(2);
+
+                    if ( (synpred209_InternalEntityMockDSL()) ) {
+                        alt142=1;
+                    }
+
+
+                    }
+                    break;
+                case 126:
+                    {
+                    int LA142_4 = input.LA(2);
+
+                    if ( (synpred209_InternalEntityMockDSL()) ) {
+                        alt142=1;
+                    }
+
+
+                    }
+                    break;
+                case 26:
+                    {
+                    int LA142_5 = input.LA(2);
+
+                    if ( (synpred209_InternalEntityMockDSL()) ) {
+                        alt142=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt142) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:16610:3: rule__XRelationalExpression__Alternatives_1
+            	    {
+            	    pushFollow(FOLLOW_122);
+            	    rule__XRelationalExpression__Alternatives_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop142;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:16619:1: rule__XRelationalExpression__Group_1_0__0 : rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 ;
+    public final void rule__XRelationalExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16623:1: ( rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 )
+            // InternalEntityMockDSL.g:16624:2: rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XRelationalExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:16631:1: rule__XRelationalExpression__Group_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16635:1: ( ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16636:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16636:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:16637:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16638:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:16638:3: rule__XRelationalExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0__1"
+    // InternalEntityMockDSL.g:16646:1: rule__XRelationalExpression__Group_1_0__1 : rule__XRelationalExpression__Group_1_0__1__Impl ;
+    public final void rule__XRelationalExpression__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16650:1: ( rule__XRelationalExpression__Group_1_0__1__Impl )
+            // InternalEntityMockDSL.g:16651:2: rule__XRelationalExpression__Group_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0__1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0__1__Impl"
+    // InternalEntityMockDSL.g:16657:1: rule__XRelationalExpression__Group_1_0__1__Impl : ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16661:1: ( ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) )
+            // InternalEntityMockDSL.g:16662:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:16662:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            // InternalEntityMockDSL.g:16663:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:16664:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            // InternalEntityMockDSL.g:16664:3: rule__XRelationalExpression__TypeAssignment_1_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__TypeAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:16673:1: rule__XRelationalExpression__Group_1_0_0__0 : rule__XRelationalExpression__Group_1_0_0__0__Impl ;
+    public final void rule__XRelationalExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16677:1: ( rule__XRelationalExpression__Group_1_0_0__0__Impl )
+            // InternalEntityMockDSL.g:16678:2: rule__XRelationalExpression__Group_1_0_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16684:1: rule__XRelationalExpression__Group_1_0_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16688:1: ( ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16689:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16689:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            // InternalEntityMockDSL.g:16690:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16691:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            // InternalEntityMockDSL.g:16691:3: rule__XRelationalExpression__Group_1_0_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0"
+    // InternalEntityMockDSL.g:16700:1: rule__XRelationalExpression__Group_1_0_0_0__0 : rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 ;
+    public final void rule__XRelationalExpression__Group_1_0_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16704:1: ( rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 )
+            // InternalEntityMockDSL.g:16705:2: rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1
+            {
+            pushFollow(FOLLOW_123);
+            rule__XRelationalExpression__Group_1_0_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0_0__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16712:1: rule__XRelationalExpression__Group_1_0_0_0__0__Impl : ( () ) ;
+    public final void rule__XRelationalExpression__Group_1_0_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16716:1: ( ( () ) )
+            // InternalEntityMockDSL.g:16717:1: ( () )
+            {
+            // InternalEntityMockDSL.g:16717:1: ( () )
+            // InternalEntityMockDSL.g:16718:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16719:2: ()
+            // InternalEntityMockDSL.g:16719:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1"
+    // InternalEntityMockDSL.g:16727:1: rule__XRelationalExpression__Group_1_0_0_0__1 : rule__XRelationalExpression__Group_1_0_0_0__1__Impl ;
+    public final void rule__XRelationalExpression__Group_1_0_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16731:1: ( rule__XRelationalExpression__Group_1_0_0_0__1__Impl )
+            // InternalEntityMockDSL.g:16732:2: rule__XRelationalExpression__Group_1_0_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_0_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0_0__1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1__Impl"
+    // InternalEntityMockDSL.g:16738:1: rule__XRelationalExpression__Group_1_0_0_0__1__Impl : ( 'instanceof' ) ;
+    public final void rule__XRelationalExpression__Group_1_0_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16742:1: ( ( 'instanceof' ) )
+            // InternalEntityMockDSL.g:16743:1: ( 'instanceof' )
+            {
+            // InternalEntityMockDSL.g:16743:1: ( 'instanceof' )
+            // InternalEntityMockDSL.g:16744:2: 'instanceof'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); 
+            }
+            match(input,126,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_0_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1__0"
+    // InternalEntityMockDSL.g:16754:1: rule__XRelationalExpression__Group_1_1__0 : rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 ;
+    public final void rule__XRelationalExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16758:1: ( rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 )
+            // InternalEntityMockDSL.g:16759:2: rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XRelationalExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1__0__Impl"
+    // InternalEntityMockDSL.g:16766:1: rule__XRelationalExpression__Group_1_1__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16770:1: ( ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:16771:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16771:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            // InternalEntityMockDSL.g:16772:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:16773:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            // InternalEntityMockDSL.g:16773:3: rule__XRelationalExpression__Group_1_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1__1"
+    // InternalEntityMockDSL.g:16781:1: rule__XRelationalExpression__Group_1_1__1 : rule__XRelationalExpression__Group_1_1__1__Impl ;
+    public final void rule__XRelationalExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16785:1: ( rule__XRelationalExpression__Group_1_1__1__Impl )
+            // InternalEntityMockDSL.g:16786:2: rule__XRelationalExpression__Group_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1__1__Impl"
+    // InternalEntityMockDSL.g:16792:1: rule__XRelationalExpression__Group_1_1__1__Impl : ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16796:1: ( ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:16797:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:16797:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            // InternalEntityMockDSL.g:16798:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:16799:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            // InternalEntityMockDSL.g:16799:3: rule__XRelationalExpression__RightOperandAssignment_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__RightOperandAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0"
+    // InternalEntityMockDSL.g:16808:1: rule__XRelationalExpression__Group_1_1_0__0 : rule__XRelationalExpression__Group_1_1_0__0__Impl ;
+    public final void rule__XRelationalExpression__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16812:1: ( rule__XRelationalExpression__Group_1_1_0__0__Impl )
+            // InternalEntityMockDSL.g:16813:2: rule__XRelationalExpression__Group_1_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0__Impl"
+    // InternalEntityMockDSL.g:16819:1: rule__XRelationalExpression__Group_1_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16823:1: ( ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:16824:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:16824:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:16825:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16826:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            // InternalEntityMockDSL.g:16826:3: rule__XRelationalExpression__Group_1_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0"
+    // InternalEntityMockDSL.g:16835:1: rule__XRelationalExpression__Group_1_1_0_0__0 : rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 ;
+    public final void rule__XRelationalExpression__Group_1_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16839:1: ( rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 )
+            // InternalEntityMockDSL.g:16840:2: rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1
+            {
+            pushFollow(FOLLOW_121);
+            rule__XRelationalExpression__Group_1_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0_0__0"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:16847:1: rule__XRelationalExpression__Group_1_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XRelationalExpression__Group_1_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16851:1: ( ( () ) )
+            // InternalEntityMockDSL.g:16852:1: ( () )
+            {
+            // InternalEntityMockDSL.g:16852:1: ( () )
+            // InternalEntityMockDSL.g:16853:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:16854:2: ()
+            // InternalEntityMockDSL.g:16854:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1"
+    // InternalEntityMockDSL.g:16862:1: rule__XRelationalExpression__Group_1_1_0_0__1 : rule__XRelationalExpression__Group_1_1_0_0__1__Impl ;
+    public final void rule__XRelationalExpression__Group_1_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16866:1: ( rule__XRelationalExpression__Group_1_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:16867:2: rule__XRelationalExpression__Group_1_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__Group_1_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0_0__1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:16873:1: rule__XRelationalExpression__Group_1_1_0_0__1__Impl : ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) ;
+    public final void rule__XRelationalExpression__Group_1_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16877:1: ( ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:16878:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:16878:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:16879:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:16880:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            // InternalEntityMockDSL.g:16880:3: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__Group_1_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__OpCompare__Group_1__0"
+    // InternalEntityMockDSL.g:16889:1: rule__OpCompare__Group_1__0 : rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 ;
+    public final void rule__OpCompare__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16893:1: ( rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 )
+            // InternalEntityMockDSL.g:16894:2: rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1
+            {
+            pushFollow(FOLLOW_107);
+            rule__OpCompare__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpCompare__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpCompare__Group_1__0"
+
+
+    // $ANTLR start "rule__OpCompare__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:16901:1: rule__OpCompare__Group_1__0__Impl : ( '<' ) ;
+    public final void rule__OpCompare__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16905:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:16906:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:16906:1: ( '<' )
+            // InternalEntityMockDSL.g:16907:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpCompare__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__OpCompare__Group_1__1"
+    // InternalEntityMockDSL.g:16916:1: rule__OpCompare__Group_1__1 : rule__OpCompare__Group_1__1__Impl ;
+    public final void rule__OpCompare__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16920:1: ( rule__OpCompare__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:16921:2: rule__OpCompare__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpCompare__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpCompare__Group_1__1"
+
+
+    // $ANTLR start "rule__OpCompare__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:16927:1: rule__OpCompare__Group_1__1__Impl : ( '=' ) ;
+    public final void rule__OpCompare__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16931:1: ( ( '=' ) )
+            // InternalEntityMockDSL.g:16932:1: ( '=' )
+            {
+            // InternalEntityMockDSL.g:16932:1: ( '=' )
+            // InternalEntityMockDSL.g:16933:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
+            }
+            match(input,13,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpCompare__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group__0"
+    // InternalEntityMockDSL.g:16943:1: rule__XOtherOperatorExpression__Group__0 : rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 ;
+    public final void rule__XOtherOperatorExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16947:1: ( rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 )
+            // InternalEntityMockDSL.g:16948:2: rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1
+            {
+            pushFollow(FOLLOW_124);
+            rule__XOtherOperatorExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group__0"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:16955:1: rule__XOtherOperatorExpression__Group__0__Impl : ( ruleXAdditiveExpression ) ;
+    public final void rule__XOtherOperatorExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16959:1: ( ( ruleXAdditiveExpression ) )
+            // InternalEntityMockDSL.g:16960:1: ( ruleXAdditiveExpression )
+            {
+            // InternalEntityMockDSL.g:16960:1: ( ruleXAdditiveExpression )
+            // InternalEntityMockDSL.g:16961:2: ruleXAdditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group__1"
+    // InternalEntityMockDSL.g:16970:1: rule__XOtherOperatorExpression__Group__1 : rule__XOtherOperatorExpression__Group__1__Impl ;
+    public final void rule__XOtherOperatorExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16974:1: ( rule__XOtherOperatorExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:16975:2: rule__XOtherOperatorExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group__1"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:16981:1: rule__XOtherOperatorExpression__Group__1__Impl : ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) ;
+    public final void rule__XOtherOperatorExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:16985:1: ( ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:16986:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:16986:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:16987:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:16988:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            loop143:
+            do {
+                int alt143=2;
+                alt143 = dfa143.predict(input);
+                switch (alt143) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:16988:3: rule__XOtherOperatorExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_125);
+            	    rule__XOtherOperatorExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop143;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0"
+    // InternalEntityMockDSL.g:16997:1: rule__XOtherOperatorExpression__Group_1__0 : rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 ;
+    public final void rule__XOtherOperatorExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17001:1: ( rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:17002:2: rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XOtherOperatorExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:17009:1: rule__XOtherOperatorExpression__Group_1__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) ;
+    public final void rule__XOtherOperatorExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17013:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:17014:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17014:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:17015:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:17016:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:17016:3: rule__XOtherOperatorExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1"
+    // InternalEntityMockDSL.g:17024:1: rule__XOtherOperatorExpression__Group_1__1 : rule__XOtherOperatorExpression__Group_1__1__Impl ;
+    public final void rule__XOtherOperatorExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17028:1: ( rule__XOtherOperatorExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:17029:2: rule__XOtherOperatorExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:17035:1: rule__XOtherOperatorExpression__Group_1__1__Impl : ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XOtherOperatorExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17039:1: ( ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:17040:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:17040:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:17041:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:17042:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:17042:3: rule__XOtherOperatorExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:17051:1: rule__XOtherOperatorExpression__Group_1_0__0 : rule__XOtherOperatorExpression__Group_1_0__0__Impl ;
+    public final void rule__XOtherOperatorExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17055:1: ( rule__XOtherOperatorExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:17056:2: rule__XOtherOperatorExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:17062:1: rule__XOtherOperatorExpression__Group_1_0__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XOtherOperatorExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17066:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:17067:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17067:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:17068:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17069:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:17069:3: rule__XOtherOperatorExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:17078:1: rule__XOtherOperatorExpression__Group_1_0_0__0 : rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 ;
+    public final void rule__XOtherOperatorExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17082:1: ( rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:17083:2: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_124);
+            rule__XOtherOperatorExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:17090:1: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XOtherOperatorExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17094:1: ( ( () ) )
+            // InternalEntityMockDSL.g:17095:1: ( () )
+            {
+            // InternalEntityMockDSL.g:17095:1: ( () )
+            // InternalEntityMockDSL.g:17096:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17097:2: ()
+            // InternalEntityMockDSL.g:17097:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:17105:1: rule__XOtherOperatorExpression__Group_1_0_0__1 : rule__XOtherOperatorExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XOtherOperatorExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17109:1: ( rule__XOtherOperatorExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:17110:2: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:17116:1: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl : ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XOtherOperatorExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17120:1: ( ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:17121:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:17121:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:17122:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:17123:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:17123:3: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_2__0"
+    // InternalEntityMockDSL.g:17132:1: rule__OpOther__Group_2__0 : rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 ;
+    public final void rule__OpOther__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17136:1: ( rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 )
+            // InternalEntityMockDSL.g:17137:2: rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1
+            {
+            pushFollow(FOLLOW_126);
+            rule__OpOther__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_2__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:17144:1: rule__OpOther__Group_2__0__Impl : ( '>' ) ;
+    public final void rule__OpOther__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17148:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:17149:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:17149:1: ( '>' )
+            // InternalEntityMockDSL.g:17150:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_2__1"
+    // InternalEntityMockDSL.g:17159:1: rule__OpOther__Group_2__1 : rule__OpOther__Group_2__1__Impl ;
+    public final void rule__OpOther__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17163:1: ( rule__OpOther__Group_2__1__Impl )
+            // InternalEntityMockDSL.g:17164:2: rule__OpOther__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_2__1"
+
+
+    // $ANTLR start "rule__OpOther__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:17170:1: rule__OpOther__Group_2__1__Impl : ( '..' ) ;
+    public final void rule__OpOther__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17174:1: ( ( '..' ) )
+            // InternalEntityMockDSL.g:17175:1: ( '..' )
+            {
+            // InternalEntityMockDSL.g:17175:1: ( '..' )
+            // InternalEntityMockDSL.g:17176:2: '..'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
+            }
+            match(input,31,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_5__0"
+    // InternalEntityMockDSL.g:17186:1: rule__OpOther__Group_5__0 : rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 ;
+    public final void rule__OpOther__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17190:1: ( rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 )
+            // InternalEntityMockDSL.g:17191:2: rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1
+            {
+            pushFollow(FOLLOW_127);
+            rule__OpOther__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_5__0__Impl"
+    // InternalEntityMockDSL.g:17198:1: rule__OpOther__Group_5__0__Impl : ( '>' ) ;
+    public final void rule__OpOther__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17202:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:17203:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:17203:1: ( '>' )
+            // InternalEntityMockDSL.g:17204:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_5__1"
+    // InternalEntityMockDSL.g:17213:1: rule__OpOther__Group_5__1 : rule__OpOther__Group_5__1__Impl ;
+    public final void rule__OpOther__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17217:1: ( rule__OpOther__Group_5__1__Impl )
+            // InternalEntityMockDSL.g:17218:2: rule__OpOther__Group_5__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5__1"
+
+
+    // $ANTLR start "rule__OpOther__Group_5__1__Impl"
+    // InternalEntityMockDSL.g:17224:1: rule__OpOther__Group_5__1__Impl : ( ( rule__OpOther__Alternatives_5_1 ) ) ;
+    public final void rule__OpOther__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17228:1: ( ( ( rule__OpOther__Alternatives_5_1 ) ) )
+            // InternalEntityMockDSL.g:17229:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            {
+            // InternalEntityMockDSL.g:17229:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            // InternalEntityMockDSL.g:17230:2: ( rule__OpOther__Alternatives_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); 
+            }
+            // InternalEntityMockDSL.g:17231:2: ( rule__OpOther__Alternatives_5_1 )
+            // InternalEntityMockDSL.g:17231:3: rule__OpOther__Alternatives_5_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Alternatives_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0__0"
+    // InternalEntityMockDSL.g:17240:1: rule__OpOther__Group_5_1_0__0 : rule__OpOther__Group_5_1_0__0__Impl ;
+    public final void rule__OpOther__Group_5_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17244:1: ( rule__OpOther__Group_5_1_0__0__Impl )
+            // InternalEntityMockDSL.g:17245:2: rule__OpOther__Group_5_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0__0__Impl"
+    // InternalEntityMockDSL.g:17251:1: rule__OpOther__Group_5_1_0__0__Impl : ( ( rule__OpOther__Group_5_1_0_0__0 ) ) ;
+    public final void rule__OpOther__Group_5_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17255:1: ( ( ( rule__OpOther__Group_5_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:17256:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17256:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:17257:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17258:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            // InternalEntityMockDSL.g:17258:3: rule__OpOther__Group_5_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0_0__0"
+    // InternalEntityMockDSL.g:17267:1: rule__OpOther__Group_5_1_0_0__0 : rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 ;
+    public final void rule__OpOther__Group_5_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17271:1: ( rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 )
+            // InternalEntityMockDSL.g:17272:2: rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1
+            {
+            pushFollow(FOLLOW_127);
+            rule__OpOther__Group_5_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0_0__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:17279:1: rule__OpOther__Group_5_1_0_0__0__Impl : ( '>' ) ;
+    public final void rule__OpOther__Group_5_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17283:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:17284:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:17284:1: ( '>' )
+            // InternalEntityMockDSL.g:17285:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0_0__1"
+    // InternalEntityMockDSL.g:17294:1: rule__OpOther__Group_5_1_0_0__1 : rule__OpOther__Group_5_1_0_0__1__Impl ;
+    public final void rule__OpOther__Group_5_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17298:1: ( rule__OpOther__Group_5_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:17299:2: rule__OpOther__Group_5_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_5_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0_0__1"
+
+
+    // $ANTLR start "rule__OpOther__Group_5_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:17305:1: rule__OpOther__Group_5_1_0_0__1__Impl : ( '>' ) ;
+    public final void rule__OpOther__Group_5_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17309:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:17310:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:17310:1: ( '>' )
+            // InternalEntityMockDSL.g:17311:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_5_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_6__0"
+    // InternalEntityMockDSL.g:17321:1: rule__OpOther__Group_6__0 : rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 ;
+    public final void rule__OpOther__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17325:1: ( rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 )
+            // InternalEntityMockDSL.g:17326:2: rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1
+            {
+            pushFollow(FOLLOW_128);
+            rule__OpOther__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:17333:1: rule__OpOther__Group_6__0__Impl : ( '<' ) ;
+    public final void rule__OpOther__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17337:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:17338:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:17338:1: ( '<' )
+            // InternalEntityMockDSL.g:17339:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_6__1"
+    // InternalEntityMockDSL.g:17348:1: rule__OpOther__Group_6__1 : rule__OpOther__Group_6__1__Impl ;
+    public final void rule__OpOther__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17352:1: ( rule__OpOther__Group_6__1__Impl )
+            // InternalEntityMockDSL.g:17353:2: rule__OpOther__Group_6__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6__1"
+
+
+    // $ANTLR start "rule__OpOther__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:17359:1: rule__OpOther__Group_6__1__Impl : ( ( rule__OpOther__Alternatives_6_1 ) ) ;
+    public final void rule__OpOther__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17363:1: ( ( ( rule__OpOther__Alternatives_6_1 ) ) )
+            // InternalEntityMockDSL.g:17364:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            {
+            // InternalEntityMockDSL.g:17364:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            // InternalEntityMockDSL.g:17365:2: ( rule__OpOther__Alternatives_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); 
+            }
+            // InternalEntityMockDSL.g:17366:2: ( rule__OpOther__Alternatives_6_1 )
+            // InternalEntityMockDSL.g:17366:3: rule__OpOther__Alternatives_6_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Alternatives_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0__0"
+    // InternalEntityMockDSL.g:17375:1: rule__OpOther__Group_6_1_0__0 : rule__OpOther__Group_6_1_0__0__Impl ;
+    public final void rule__OpOther__Group_6_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17379:1: ( rule__OpOther__Group_6_1_0__0__Impl )
+            // InternalEntityMockDSL.g:17380:2: rule__OpOther__Group_6_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0__0__Impl"
+    // InternalEntityMockDSL.g:17386:1: rule__OpOther__Group_6_1_0__0__Impl : ( ( rule__OpOther__Group_6_1_0_0__0 ) ) ;
+    public final void rule__OpOther__Group_6_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17390:1: ( ( ( rule__OpOther__Group_6_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:17391:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17391:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:17392:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17393:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            // InternalEntityMockDSL.g:17393:3: rule__OpOther__Group_6_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0_0__0"
+    // InternalEntityMockDSL.g:17402:1: rule__OpOther__Group_6_1_0_0__0 : rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 ;
+    public final void rule__OpOther__Group_6_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17406:1: ( rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 )
+            // InternalEntityMockDSL.g:17407:2: rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1
+            {
+            pushFollow(FOLLOW_113);
+            rule__OpOther__Group_6_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0_0__0"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:17414:1: rule__OpOther__Group_6_1_0_0__0__Impl : ( '<' ) ;
+    public final void rule__OpOther__Group_6_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17418:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:17419:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:17419:1: ( '<' )
+            // InternalEntityMockDSL.g:17420:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0_0__1"
+    // InternalEntityMockDSL.g:17429:1: rule__OpOther__Group_6_1_0_0__1 : rule__OpOther__Group_6_1_0_0__1__Impl ;
+    public final void rule__OpOther__Group_6_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17433:1: ( rule__OpOther__Group_6_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:17434:2: rule__OpOther__Group_6_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__OpOther__Group_6_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0_0__1"
+
+
+    // $ANTLR start "rule__OpOther__Group_6_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:17440:1: rule__OpOther__Group_6_1_0_0__1__Impl : ( '<' ) ;
+    public final void rule__OpOther__Group_6_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17444:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:17445:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:17445:1: ( '<' )
+            // InternalEntityMockDSL.g:17446:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OpOther__Group_6_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group__0"
+    // InternalEntityMockDSL.g:17456:1: rule__XAdditiveExpression__Group__0 : rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 ;
+    public final void rule__XAdditiveExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17460:1: ( rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 )
+            // InternalEntityMockDSL.g:17461:2: rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1
+            {
+            pushFollow(FOLLOW_129);
+            rule__XAdditiveExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group__0"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:17468:1: rule__XAdditiveExpression__Group__0__Impl : ( ruleXMultiplicativeExpression ) ;
+    public final void rule__XAdditiveExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17472:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalEntityMockDSL.g:17473:1: ( ruleXMultiplicativeExpression )
+            {
+            // InternalEntityMockDSL.g:17473:1: ( ruleXMultiplicativeExpression )
+            // InternalEntityMockDSL.g:17474:2: ruleXMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group__1"
+    // InternalEntityMockDSL.g:17483:1: rule__XAdditiveExpression__Group__1 : rule__XAdditiveExpression__Group__1__Impl ;
+    public final void rule__XAdditiveExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17487:1: ( rule__XAdditiveExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:17488:2: rule__XAdditiveExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group__1"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:17494:1: rule__XAdditiveExpression__Group__1__Impl : ( ( rule__XAdditiveExpression__Group_1__0 )* ) ;
+    public final void rule__XAdditiveExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17498:1: ( ( ( rule__XAdditiveExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:17499:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:17499:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:17500:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:17501:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            loop144:
+            do {
+                int alt144=2;
+                int LA144_0 = input.LA(1);
+
+                if ( (LA144_0==36) ) {
+                    int LA144_2 = input.LA(2);
+
+                    if ( (synpred211_InternalEntityMockDSL()) ) {
+                        alt144=1;
+                    }
+
+
+                }
+                else if ( (LA144_0==35) ) {
+                    int LA144_3 = input.LA(2);
+
+                    if ( (synpred211_InternalEntityMockDSL()) ) {
+                        alt144=1;
+                    }
+
+
+                }
+
+
+                switch (alt144) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:17501:3: rule__XAdditiveExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_130);
+            	    rule__XAdditiveExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop144;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1__0"
+    // InternalEntityMockDSL.g:17510:1: rule__XAdditiveExpression__Group_1__0 : rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 ;
+    public final void rule__XAdditiveExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17514:1: ( rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:17515:2: rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XAdditiveExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:17522:1: rule__XAdditiveExpression__Group_1__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) ;
+    public final void rule__XAdditiveExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17526:1: ( ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:17527:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17527:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:17528:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:17529:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:17529:3: rule__XAdditiveExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1__1"
+    // InternalEntityMockDSL.g:17537:1: rule__XAdditiveExpression__Group_1__1 : rule__XAdditiveExpression__Group_1__1__Impl ;
+    public final void rule__XAdditiveExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17541:1: ( rule__XAdditiveExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:17542:2: rule__XAdditiveExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:17548:1: rule__XAdditiveExpression__Group_1__1__Impl : ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XAdditiveExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17552:1: ( ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:17553:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:17553:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:17554:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:17555:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:17555:3: rule__XAdditiveExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:17564:1: rule__XAdditiveExpression__Group_1_0__0 : rule__XAdditiveExpression__Group_1_0__0__Impl ;
+    public final void rule__XAdditiveExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17568:1: ( rule__XAdditiveExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:17569:2: rule__XAdditiveExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:17575:1: rule__XAdditiveExpression__Group_1_0__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XAdditiveExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17579:1: ( ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:17580:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17580:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:17581:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17582:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:17582:3: rule__XAdditiveExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:17591:1: rule__XAdditiveExpression__Group_1_0_0__0 : rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 ;
+    public final void rule__XAdditiveExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17595:1: ( rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:17596:2: rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_129);
+            rule__XAdditiveExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:17603:1: rule__XAdditiveExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XAdditiveExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17607:1: ( ( () ) )
+            // InternalEntityMockDSL.g:17608:1: ( () )
+            {
+            // InternalEntityMockDSL.g:17608:1: ( () )
+            // InternalEntityMockDSL.g:17609:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17610:2: ()
+            // InternalEntityMockDSL.g:17610:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:17618:1: rule__XAdditiveExpression__Group_1_0_0__1 : rule__XAdditiveExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XAdditiveExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17622:1: ( rule__XAdditiveExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:17623:2: rule__XAdditiveExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:17629:1: rule__XAdditiveExpression__Group_1_0_0__1__Impl : ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XAdditiveExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17633:1: ( ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:17634:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:17634:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:17635:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:17636:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:17636:3: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XAdditiveExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group__0"
+    // InternalEntityMockDSL.g:17645:1: rule__XMultiplicativeExpression__Group__0 : rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 ;
+    public final void rule__XMultiplicativeExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17649:1: ( rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 )
+            // InternalEntityMockDSL.g:17650:2: rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1
+            {
+            pushFollow(FOLLOW_131);
+            rule__XMultiplicativeExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group__0"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:17657:1: rule__XMultiplicativeExpression__Group__0__Impl : ( ruleXUnaryOperation ) ;
+    public final void rule__XMultiplicativeExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17661:1: ( ( ruleXUnaryOperation ) )
+            // InternalEntityMockDSL.g:17662:1: ( ruleXUnaryOperation )
+            {
+            // InternalEntityMockDSL.g:17662:1: ( ruleXUnaryOperation )
+            // InternalEntityMockDSL.g:17663:2: ruleXUnaryOperation
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group__1"
+    // InternalEntityMockDSL.g:17672:1: rule__XMultiplicativeExpression__Group__1 : rule__XMultiplicativeExpression__Group__1__Impl ;
+    public final void rule__XMultiplicativeExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17676:1: ( rule__XMultiplicativeExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:17677:2: rule__XMultiplicativeExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group__1"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:17683:1: rule__XMultiplicativeExpression__Group__1__Impl : ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) ;
+    public final void rule__XMultiplicativeExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17687:1: ( ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:17688:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:17688:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:17689:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:17690:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            loop145:
+            do {
+                int alt145=2;
+                switch ( input.LA(1) ) {
+                case 37:
+                    {
+                    int LA145_2 = input.LA(2);
+
+                    if ( (synpred212_InternalEntityMockDSL()) ) {
+                        alt145=1;
+                    }
+
+
+                    }
+                    break;
+                case 38:
+                    {
+                    int LA145_3 = input.LA(2);
+
+                    if ( (synpred212_InternalEntityMockDSL()) ) {
+                        alt145=1;
+                    }
+
+
+                    }
+                    break;
+                case 39:
+                    {
+                    int LA145_4 = input.LA(2);
+
+                    if ( (synpred212_InternalEntityMockDSL()) ) {
+                        alt145=1;
+                    }
+
+
+                    }
+                    break;
+                case 40:
+                    {
+                    int LA145_5 = input.LA(2);
+
+                    if ( (synpred212_InternalEntityMockDSL()) ) {
+                        alt145=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt145) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:17690:3: rule__XMultiplicativeExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_132);
+            	    rule__XMultiplicativeExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop145;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0"
+    // InternalEntityMockDSL.g:17699:1: rule__XMultiplicativeExpression__Group_1__0 : rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 ;
+    public final void rule__XMultiplicativeExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17703:1: ( rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:17704:2: rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XMultiplicativeExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:17711:1: rule__XMultiplicativeExpression__Group_1__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) ;
+    public final void rule__XMultiplicativeExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17715:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:17716:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17716:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:17717:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:17718:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:17718:3: rule__XMultiplicativeExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1"
+    // InternalEntityMockDSL.g:17726:1: rule__XMultiplicativeExpression__Group_1__1 : rule__XMultiplicativeExpression__Group_1__1__Impl ;
+    public final void rule__XMultiplicativeExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17730:1: ( rule__XMultiplicativeExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:17731:2: rule__XMultiplicativeExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:17737:1: rule__XMultiplicativeExpression__Group_1__1__Impl : ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) ;
+    public final void rule__XMultiplicativeExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17741:1: ( ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:17742:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:17742:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:17743:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:17744:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            // InternalEntityMockDSL.g:17744:3: rule__XMultiplicativeExpression__RightOperandAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__RightOperandAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:17753:1: rule__XMultiplicativeExpression__Group_1_0__0 : rule__XMultiplicativeExpression__Group_1_0__0__Impl ;
+    public final void rule__XMultiplicativeExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17757:1: ( rule__XMultiplicativeExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:17758:2: rule__XMultiplicativeExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:17764:1: rule__XMultiplicativeExpression__Group_1_0__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XMultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17768:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:17769:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17769:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:17770:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17771:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:17771:3: rule__XMultiplicativeExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:17780:1: rule__XMultiplicativeExpression__Group_1_0_0__0 : rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 ;
+    public final void rule__XMultiplicativeExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17784:1: ( rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:17785:2: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_131);
+            rule__XMultiplicativeExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:17792:1: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XMultiplicativeExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17796:1: ( ( () ) )
+            // InternalEntityMockDSL.g:17797:1: ( () )
+            {
+            // InternalEntityMockDSL.g:17797:1: ( () )
+            // InternalEntityMockDSL.g:17798:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17799:2: ()
+            // InternalEntityMockDSL.g:17799:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:17807:1: rule__XMultiplicativeExpression__Group_1_0_0__1 : rule__XMultiplicativeExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XMultiplicativeExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17811:1: ( rule__XMultiplicativeExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:17812:2: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:17818:1: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl : ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    public final void rule__XMultiplicativeExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17822:1: ( ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:17823:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:17823:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:17824:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:17825:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            // InternalEntityMockDSL.g:17825:3: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__0"
+    // InternalEntityMockDSL.g:17834:1: rule__XUnaryOperation__Group_0__0 : rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 ;
+    public final void rule__XUnaryOperation__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17838:1: ( rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 )
+            // InternalEntityMockDSL.g:17839:2: rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1
+            {
+            pushFollow(FOLLOW_133);
+            rule__XUnaryOperation__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__0"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:17846:1: rule__XUnaryOperation__Group_0__0__Impl : ( () ) ;
+    public final void rule__XUnaryOperation__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17850:1: ( ( () ) )
+            // InternalEntityMockDSL.g:17851:1: ( () )
+            {
+            // InternalEntityMockDSL.g:17851:1: ( () )
+            // InternalEntityMockDSL.g:17852:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); 
+            }
+            // InternalEntityMockDSL.g:17853:2: ()
+            // InternalEntityMockDSL.g:17853:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__1"
+    // InternalEntityMockDSL.g:17861:1: rule__XUnaryOperation__Group_0__1 : rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 ;
+    public final void rule__XUnaryOperation__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17865:1: ( rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 )
+            // InternalEntityMockDSL.g:17866:2: rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XUnaryOperation__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__1"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:17873:1: rule__XUnaryOperation__Group_0__1__Impl : ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) ;
+    public final void rule__XUnaryOperation__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17877:1: ( ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) )
+            // InternalEntityMockDSL.g:17878:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:17878:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            // InternalEntityMockDSL.g:17879:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); 
+            }
+            // InternalEntityMockDSL.g:17880:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            // InternalEntityMockDSL.g:17880:3: rule__XUnaryOperation__FeatureAssignment_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__FeatureAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__2"
+    // InternalEntityMockDSL.g:17888:1: rule__XUnaryOperation__Group_0__2 : rule__XUnaryOperation__Group_0__2__Impl ;
+    public final void rule__XUnaryOperation__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17892:1: ( rule__XUnaryOperation__Group_0__2__Impl )
+            // InternalEntityMockDSL.g:17893:2: rule__XUnaryOperation__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__2"
+
+
+    // $ANTLR start "rule__XUnaryOperation__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:17899:1: rule__XUnaryOperation__Group_0__2__Impl : ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) ;
+    public final void rule__XUnaryOperation__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17903:1: ( ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) )
+            // InternalEntityMockDSL.g:17904:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            {
+            // InternalEntityMockDSL.g:17904:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            // InternalEntityMockDSL.g:17905:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); 
+            }
+            // InternalEntityMockDSL.g:17906:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            // InternalEntityMockDSL.g:17906:3: rule__XUnaryOperation__OperandAssignment_0_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XUnaryOperation__OperandAssignment_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group__0"
+    // InternalEntityMockDSL.g:17915:1: rule__XCastedExpression__Group__0 : rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 ;
+    public final void rule__XCastedExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17919:1: ( rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 )
+            // InternalEntityMockDSL.g:17920:2: rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1
+            {
+            pushFollow(FOLLOW_91);
+            rule__XCastedExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group__0"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:17927:1: rule__XCastedExpression__Group__0__Impl : ( ruleXPostfixOperation ) ;
+    public final void rule__XCastedExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17931:1: ( ( ruleXPostfixOperation ) )
+            // InternalEntityMockDSL.g:17932:1: ( ruleXPostfixOperation )
+            {
+            // InternalEntityMockDSL.g:17932:1: ( ruleXPostfixOperation )
+            // InternalEntityMockDSL.g:17933:2: ruleXPostfixOperation
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXPostfixOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group__1"
+    // InternalEntityMockDSL.g:17942:1: rule__XCastedExpression__Group__1 : rule__XCastedExpression__Group__1__Impl ;
+    public final void rule__XCastedExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17946:1: ( rule__XCastedExpression__Group__1__Impl )
+            // InternalEntityMockDSL.g:17947:2: rule__XCastedExpression__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group__1"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:17953:1: rule__XCastedExpression__Group__1__Impl : ( ( rule__XCastedExpression__Group_1__0 )* ) ;
+    public final void rule__XCastedExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17957:1: ( ( ( rule__XCastedExpression__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:17958:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:17958:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            // InternalEntityMockDSL.g:17959:2: ( rule__XCastedExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:17960:2: ( rule__XCastedExpression__Group_1__0 )*
+            loop146:
+            do {
+                int alt146=2;
+                int LA146_0 = input.LA(1);
+
+                if ( (LA146_0==113) ) {
+                    int LA146_2 = input.LA(2);
+
+                    if ( (synpred213_InternalEntityMockDSL()) ) {
+                        alt146=1;
+                    }
+
+
+                }
+
+
+                switch (alt146) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:17960:3: rule__XCastedExpression__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_134);
+            	    rule__XCastedExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop146;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1__0"
+    // InternalEntityMockDSL.g:17969:1: rule__XCastedExpression__Group_1__0 : rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 ;
+    public final void rule__XCastedExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17973:1: ( rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 )
+            // InternalEntityMockDSL.g:17974:2: rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XCastedExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:17981:1: rule__XCastedExpression__Group_1__0__Impl : ( ( rule__XCastedExpression__Group_1_0__0 ) ) ;
+    public final void rule__XCastedExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:17985:1: ( ( ( rule__XCastedExpression__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:17986:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:17986:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:17987:2: ( rule__XCastedExpression__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:17988:2: ( rule__XCastedExpression__Group_1_0__0 )
+            // InternalEntityMockDSL.g:17988:3: rule__XCastedExpression__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1__1"
+    // InternalEntityMockDSL.g:17996:1: rule__XCastedExpression__Group_1__1 : rule__XCastedExpression__Group_1__1__Impl ;
+    public final void rule__XCastedExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18000:1: ( rule__XCastedExpression__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:18001:2: rule__XCastedExpression__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:18007:1: rule__XCastedExpression__Group_1__1__Impl : ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) ;
+    public final void rule__XCastedExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18011:1: ( ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:18012:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:18012:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:18013:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:18014:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            // InternalEntityMockDSL.g:18014:3: rule__XCastedExpression__TypeAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__TypeAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0__0"
+    // InternalEntityMockDSL.g:18023:1: rule__XCastedExpression__Group_1_0__0 : rule__XCastedExpression__Group_1_0__0__Impl ;
+    public final void rule__XCastedExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18027:1: ( rule__XCastedExpression__Group_1_0__0__Impl )
+            // InternalEntityMockDSL.g:18028:2: rule__XCastedExpression__Group_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:18034:1: rule__XCastedExpression__Group_1_0__0__Impl : ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) ;
+    public final void rule__XCastedExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18038:1: ( ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:18039:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18039:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:18040:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18041:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:18041:3: rule__XCastedExpression__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:18050:1: rule__XCastedExpression__Group_1_0_0__0 : rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 ;
+    public final void rule__XCastedExpression__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18054:1: ( rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:18055:2: rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_91);
+            rule__XCastedExpression__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:18062:1: rule__XCastedExpression__Group_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XCastedExpression__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18066:1: ( ( () ) )
+            // InternalEntityMockDSL.g:18067:1: ( () )
+            {
+            // InternalEntityMockDSL.g:18067:1: ( () )
+            // InternalEntityMockDSL.g:18068:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18069:2: ()
+            // InternalEntityMockDSL.g:18069:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:18077:1: rule__XCastedExpression__Group_1_0_0__1 : rule__XCastedExpression__Group_1_0_0__1__Impl ;
+    public final void rule__XCastedExpression__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18081:1: ( rule__XCastedExpression__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:18082:2: rule__XCastedExpression__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCastedExpression__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:18088:1: rule__XCastedExpression__Group_1_0_0__1__Impl : ( 'as' ) ;
+    public final void rule__XCastedExpression__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18092:1: ( ( 'as' ) )
+            // InternalEntityMockDSL.g:18093:1: ( 'as' )
+            {
+            // InternalEntityMockDSL.g:18093:1: ( 'as' )
+            // InternalEntityMockDSL.g:18094:2: 'as'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); 
+            }
+            match(input,113,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group__0"
+    // InternalEntityMockDSL.g:18104:1: rule__XPostfixOperation__Group__0 : rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 ;
+    public final void rule__XPostfixOperation__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18108:1: ( rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 )
+            // InternalEntityMockDSL.g:18109:2: rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1
+            {
+            pushFollow(FOLLOW_135);
+            rule__XPostfixOperation__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group__0"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group__0__Impl"
+    // InternalEntityMockDSL.g:18116:1: rule__XPostfixOperation__Group__0__Impl : ( ruleXMemberFeatureCall ) ;
+    public final void rule__XPostfixOperation__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18120:1: ( ( ruleXMemberFeatureCall ) )
+            // InternalEntityMockDSL.g:18121:1: ( ruleXMemberFeatureCall )
+            {
+            // InternalEntityMockDSL.g:18121:1: ( ruleXMemberFeatureCall )
+            // InternalEntityMockDSL.g:18122:2: ruleXMemberFeatureCall
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXMemberFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group__1"
+    // InternalEntityMockDSL.g:18131:1: rule__XPostfixOperation__Group__1 : rule__XPostfixOperation__Group__1__Impl ;
+    public final void rule__XPostfixOperation__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18135:1: ( rule__XPostfixOperation__Group__1__Impl )
+            // InternalEntityMockDSL.g:18136:2: rule__XPostfixOperation__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group__1"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group__1__Impl"
+    // InternalEntityMockDSL.g:18142:1: rule__XPostfixOperation__Group__1__Impl : ( ( rule__XPostfixOperation__Group_1__0 )? ) ;
+    public final void rule__XPostfixOperation__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18146:1: ( ( ( rule__XPostfixOperation__Group_1__0 )? ) )
+            // InternalEntityMockDSL.g:18147:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:18147:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            // InternalEntityMockDSL.g:18148:2: ( rule__XPostfixOperation__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:18149:2: ( rule__XPostfixOperation__Group_1__0 )?
+            int alt147=2;
+            int LA147_0 = input.LA(1);
+
+            if ( (LA147_0==42) ) {
+                int LA147_1 = input.LA(2);
+
+                if ( (synpred214_InternalEntityMockDSL()) ) {
+                    alt147=1;
+                }
+            }
+            else if ( (LA147_0==43) ) {
+                int LA147_2 = input.LA(2);
+
+                if ( (synpred214_InternalEntityMockDSL()) ) {
+                    alt147=1;
+                }
+            }
+            switch (alt147) {
+                case 1 :
+                    // InternalEntityMockDSL.g:18149:3: rule__XPostfixOperation__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XPostfixOperation__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1__0"
+    // InternalEntityMockDSL.g:18158:1: rule__XPostfixOperation__Group_1__0 : rule__XPostfixOperation__Group_1__0__Impl ;
+    public final void rule__XPostfixOperation__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18162:1: ( rule__XPostfixOperation__Group_1__0__Impl )
+            // InternalEntityMockDSL.g:18163:2: rule__XPostfixOperation__Group_1__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1__0"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:18169:1: rule__XPostfixOperation__Group_1__0__Impl : ( ( rule__XPostfixOperation__Group_1_0__0 ) ) ;
+    public final void rule__XPostfixOperation__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18173:1: ( ( ( rule__XPostfixOperation__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:18174:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18174:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:18175:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:18176:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            // InternalEntityMockDSL.g:18176:3: rule__XPostfixOperation__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1_0__0"
+    // InternalEntityMockDSL.g:18185:1: rule__XPostfixOperation__Group_1_0__0 : rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 ;
+    public final void rule__XPostfixOperation__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18189:1: ( rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 )
+            // InternalEntityMockDSL.g:18190:2: rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1
+            {
+            pushFollow(FOLLOW_135);
+            rule__XPostfixOperation__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:18197:1: rule__XPostfixOperation__Group_1_0__0__Impl : ( () ) ;
+    public final void rule__XPostfixOperation__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18201:1: ( ( () ) )
+            // InternalEntityMockDSL.g:18202:1: ( () )
+            {
+            // InternalEntityMockDSL.g:18202:1: ( () )
+            // InternalEntityMockDSL.g:18203:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18204:2: ()
+            // InternalEntityMockDSL.g:18204:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1_0__1"
+    // InternalEntityMockDSL.g:18212:1: rule__XPostfixOperation__Group_1_0__1 : rule__XPostfixOperation__Group_1_0__1__Impl ;
+    public final void rule__XPostfixOperation__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18216:1: ( rule__XPostfixOperation__Group_1_0__1__Impl )
+            // InternalEntityMockDSL.g:18217:2: rule__XPostfixOperation__Group_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1_0__1"
+
+
+    // $ANTLR start "rule__XPostfixOperation__Group_1_0__1__Impl"
+    // InternalEntityMockDSL.g:18223:1: rule__XPostfixOperation__Group_1_0__1__Impl : ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) ;
+    public final void rule__XPostfixOperation__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18227:1: ( ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) )
+            // InternalEntityMockDSL.g:18228:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:18228:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            // InternalEntityMockDSL.g:18229:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:18230:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            // InternalEntityMockDSL.g:18230:3: rule__XPostfixOperation__FeatureAssignment_1_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XPostfixOperation__FeatureAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group__0"
+    // InternalEntityMockDSL.g:18239:1: rule__XMemberFeatureCall__Group__0 : rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 ;
+    public final void rule__XMemberFeatureCall__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18243:1: ( rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 )
+            // InternalEntityMockDSL.g:18244:2: rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1
+            {
+            pushFollow(FOLLOW_136);
+            rule__XMemberFeatureCall__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group__0__Impl"
+    // InternalEntityMockDSL.g:18251:1: rule__XMemberFeatureCall__Group__0__Impl : ( ruleXPrimaryExpression ) ;
+    public final void rule__XMemberFeatureCall__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18255:1: ( ( ruleXPrimaryExpression ) )
+            // InternalEntityMockDSL.g:18256:1: ( ruleXPrimaryExpression )
+            {
+            // InternalEntityMockDSL.g:18256:1: ( ruleXPrimaryExpression )
+            // InternalEntityMockDSL.g:18257:2: ruleXPrimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXPrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group__1"
+    // InternalEntityMockDSL.g:18266:1: rule__XMemberFeatureCall__Group__1 : rule__XMemberFeatureCall__Group__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18270:1: ( rule__XMemberFeatureCall__Group__1__Impl )
+            // InternalEntityMockDSL.g:18271:2: rule__XMemberFeatureCall__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group__1__Impl"
+    // InternalEntityMockDSL.g:18277:1: rule__XMemberFeatureCall__Group__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) ;
+    public final void rule__XMemberFeatureCall__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18281:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) )
+            // InternalEntityMockDSL.g:18282:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            {
+            // InternalEntityMockDSL.g:18282:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            // InternalEntityMockDSL.g:18283:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); 
+            }
+            // InternalEntityMockDSL.g:18284:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            loop148:
+            do {
+                int alt148=2;
+                switch ( input.LA(1) ) {
+                case 44:
+                    {
+                    int LA148_2 = input.LA(2);
+
+                    if ( (synpred215_InternalEntityMockDSL()) ) {
+                        alt148=1;
+                    }
+
+
+                    }
+                    break;
+                case 153:
+                    {
+                    int LA148_3 = input.LA(2);
+
+                    if ( (synpred215_InternalEntityMockDSL()) ) {
+                        alt148=1;
+                    }
+
+
+                    }
+                    break;
+                case 154:
+                    {
+                    int LA148_4 = input.LA(2);
+
+                    if ( (synpred215_InternalEntityMockDSL()) ) {
+                        alt148=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt148) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:18284:3: rule__XMemberFeatureCall__Alternatives_1
+            	    {
+            	    pushFollow(FOLLOW_137);
+            	    rule__XMemberFeatureCall__Alternatives_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop148;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0"
+    // InternalEntityMockDSL.g:18293:1: rule__XMemberFeatureCall__Group_1_0__0 : rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18297:1: ( rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 )
+            // InternalEntityMockDSL.g:18298:2: rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XMemberFeatureCall__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:18305:1: rule__XMemberFeatureCall__Group_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18309:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:18310:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18310:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:18311:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18312:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            // InternalEntityMockDSL.g:18312:3: rule__XMemberFeatureCall__Group_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1"
+    // InternalEntityMockDSL.g:18320:1: rule__XMemberFeatureCall__Group_1_0__1 : rule__XMemberFeatureCall__Group_1_0__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18324:1: ( rule__XMemberFeatureCall__Group_1_0__1__Impl )
+            // InternalEntityMockDSL.g:18325:2: rule__XMemberFeatureCall__Group_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1__Impl"
+    // InternalEntityMockDSL.g:18331:1: rule__XMemberFeatureCall__Group_1_0__1__Impl : ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18335:1: ( ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) )
+            // InternalEntityMockDSL.g:18336:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:18336:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            // InternalEntityMockDSL.g:18337:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:18338:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            // InternalEntityMockDSL.g:18338:3: rule__XMemberFeatureCall__ValueAssignment_1_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__ValueAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:18347:1: rule__XMemberFeatureCall__Group_1_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0__0__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18351:1: ( rule__XMemberFeatureCall__Group_1_0_0__0__Impl )
+            // InternalEntityMockDSL.g:18352:2: rule__XMemberFeatureCall__Group_1_0_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:18358:1: rule__XMemberFeatureCall__Group_1_0_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18362:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:18363:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18363:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            // InternalEntityMockDSL.g:18364:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18365:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            // InternalEntityMockDSL.g:18365:3: rule__XMemberFeatureCall__Group_1_0_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0"
+    // InternalEntityMockDSL.g:18374:1: rule__XMemberFeatureCall__Group_1_0_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18378:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 )
+            // InternalEntityMockDSL.g:18379:2: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1
+            {
+            pushFollow(FOLLOW_138);
+            rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl"
+    // InternalEntityMockDSL.g:18386:1: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl : ( () ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18390:1: ( ( () ) )
+            // InternalEntityMockDSL.g:18391:1: ( () )
+            {
+            // InternalEntityMockDSL.g:18391:1: ( () )
+            // InternalEntityMockDSL.g:18392:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18393:2: ()
+            // InternalEntityMockDSL.g:18393:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1"
+    // InternalEntityMockDSL.g:18401:1: rule__XMemberFeatureCall__Group_1_0_0_0__1 : rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18405:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 )
+            // InternalEntityMockDSL.g:18406:2: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2
+            {
+            pushFollow(FOLLOW_111);
+            rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl"
+    // InternalEntityMockDSL.g:18413:1: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18417:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:18418:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:18418:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            // InternalEntityMockDSL.g:18419:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:18420:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            // InternalEntityMockDSL.g:18420:3: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Alternatives_1_0_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2"
+    // InternalEntityMockDSL.g:18428:1: rule__XMemberFeatureCall__Group_1_0_0_0__2 : rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18432:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 )
+            // InternalEntityMockDSL.g:18433:2: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3
+            {
+            pushFollow(FOLLOW_107);
+            rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl"
+    // InternalEntityMockDSL.g:18440:1: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18444:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) )
+            // InternalEntityMockDSL.g:18445:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            {
+            // InternalEntityMockDSL.g:18445:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            // InternalEntityMockDSL.g:18446:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); 
+            }
+            // InternalEntityMockDSL.g:18447:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            // InternalEntityMockDSL.g:18447:3: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3"
+    // InternalEntityMockDSL.g:18455:1: rule__XMemberFeatureCall__Group_1_0_0_0__3 : rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18459:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl )
+            // InternalEntityMockDSL.g:18460:2: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__3"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl"
+    // InternalEntityMockDSL.g:18466:1: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl : ( ruleOpSingleAssign ) ;
+    public final void rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18470:1: ( ( ruleOpSingleAssign ) )
+            // InternalEntityMockDSL.g:18471:1: ( ruleOpSingleAssign )
+            {
+            // InternalEntityMockDSL.g:18471:1: ( ruleOpSingleAssign )
+            // InternalEntityMockDSL.g:18472:2: ruleOpSingleAssign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpSingleAssign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0"
+    // InternalEntityMockDSL.g:18482:1: rule__XMemberFeatureCall__Group_1_1__0 : rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18486:1: ( rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 )
+            // InternalEntityMockDSL.g:18487:2: rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1
+            {
+            pushFollow(FOLLOW_139);
+            rule__XMemberFeatureCall__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0__Impl"
+    // InternalEntityMockDSL.g:18494:1: rule__XMemberFeatureCall__Group_1_1__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18498:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:18499:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18499:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            // InternalEntityMockDSL.g:18500:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:18501:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            // InternalEntityMockDSL.g:18501:3: rule__XMemberFeatureCall__Group_1_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1"
+    // InternalEntityMockDSL.g:18509:1: rule__XMemberFeatureCall__Group_1_1__1 : rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 ;
+    public final void rule__XMemberFeatureCall__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18513:1: ( rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 )
+            // InternalEntityMockDSL.g:18514:2: rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2
+            {
+            pushFollow(FOLLOW_139);
+            rule__XMemberFeatureCall__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1__Impl"
+    // InternalEntityMockDSL.g:18521:1: rule__XMemberFeatureCall__Group_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18525:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) )
+            // InternalEntityMockDSL.g:18526:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:18526:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            // InternalEntityMockDSL.g:18527:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:18528:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            int alt149=2;
+            int LA149_0 = input.LA(1);
+
+            if ( (LA149_0==28) ) {
+                alt149=1;
+            }
+            switch (alt149) {
+                case 1 :
+                    // InternalEntityMockDSL.g:18528:3: rule__XMemberFeatureCall__Group_1_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Group_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2"
+    // InternalEntityMockDSL.g:18536:1: rule__XMemberFeatureCall__Group_1_1__2 : rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 ;
+    public final void rule__XMemberFeatureCall__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18540:1: ( rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 )
+            // InternalEntityMockDSL.g:18541:2: rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3
+            {
+            pushFollow(FOLLOW_140);
+            rule__XMemberFeatureCall__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2__Impl"
+    // InternalEntityMockDSL.g:18548:1: rule__XMemberFeatureCall__Group_1_1__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18552:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) )
+            // InternalEntityMockDSL.g:18553:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            {
+            // InternalEntityMockDSL.g:18553:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            // InternalEntityMockDSL.g:18554:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); 
+            }
+            // InternalEntityMockDSL.g:18555:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            // InternalEntityMockDSL.g:18555:3: rule__XMemberFeatureCall__FeatureAssignment_1_1_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__FeatureAssignment_1_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3"
+    // InternalEntityMockDSL.g:18563:1: rule__XMemberFeatureCall__Group_1_1__3 : rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 ;
+    public final void rule__XMemberFeatureCall__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18567:1: ( rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 )
+            // InternalEntityMockDSL.g:18568:2: rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4
+            {
+            pushFollow(FOLLOW_140);
+            rule__XMemberFeatureCall__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__3"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3__Impl"
+    // InternalEntityMockDSL.g:18575:1: rule__XMemberFeatureCall__Group_1_1__3__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18579:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) )
+            // InternalEntityMockDSL.g:18580:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:18580:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            // InternalEntityMockDSL.g:18581:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); 
+            }
+            // InternalEntityMockDSL.g:18582:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            int alt150=2;
+            alt150 = dfa150.predict(input);
+            switch (alt150) {
+                case 1 :
+                    // InternalEntityMockDSL.g:18582:3: rule__XMemberFeatureCall__Group_1_1_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Group_1_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4"
+    // InternalEntityMockDSL.g:18590:1: rule__XMemberFeatureCall__Group_1_1__4 : rule__XMemberFeatureCall__Group_1_1__4__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18594:1: ( rule__XMemberFeatureCall__Group_1_1__4__Impl )
+            // InternalEntityMockDSL.g:18595:2: rule__XMemberFeatureCall__Group_1_1__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__4"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4__Impl"
+    // InternalEntityMockDSL.g:18601:1: rule__XMemberFeatureCall__Group_1_1__4__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18605:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) )
+            // InternalEntityMockDSL.g:18606:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            {
+            // InternalEntityMockDSL.g:18606:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            // InternalEntityMockDSL.g:18607:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); 
+            }
+            // InternalEntityMockDSL.g:18608:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            int alt151=2;
+            alt151 = dfa151.predict(input);
+            switch (alt151) {
+                case 1 :
+                    // InternalEntityMockDSL.g:18608:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1__4__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0"
+    // InternalEntityMockDSL.g:18617:1: rule__XMemberFeatureCall__Group_1_1_0__0 : rule__XMemberFeatureCall__Group_1_1_0__0__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18621:1: ( rule__XMemberFeatureCall__Group_1_1_0__0__Impl )
+            // InternalEntityMockDSL.g:18622:2: rule__XMemberFeatureCall__Group_1_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0__Impl"
+    // InternalEntityMockDSL.g:18628:1: rule__XMemberFeatureCall__Group_1_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18632:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:18633:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:18633:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:18634:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18635:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            // InternalEntityMockDSL.g:18635:3: rule__XMemberFeatureCall__Group_1_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0"
+    // InternalEntityMockDSL.g:18644:1: rule__XMemberFeatureCall__Group_1_1_0_0__0 : rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18648:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 )
+            // InternalEntityMockDSL.g:18649:2: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1
+            {
+            pushFollow(FOLLOW_136);
+            rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0_0__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:18656:1: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl : ( () ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18660:1: ( ( () ) )
+            // InternalEntityMockDSL.g:18661:1: ( () )
+            {
+            // InternalEntityMockDSL.g:18661:1: ( () )
+            // InternalEntityMockDSL.g:18662:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:18663:2: ()
+            // InternalEntityMockDSL.g:18663:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1"
+    // InternalEntityMockDSL.g:18671:1: rule__XMemberFeatureCall__Group_1_1_0_0__1 : rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18675:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:18676:2: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0_0__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:18682:1: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18686:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:18687:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:18687:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            // InternalEntityMockDSL.g:18688:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:18689:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            // InternalEntityMockDSL.g:18689:3: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Alternatives_1_1_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0"
+    // InternalEntityMockDSL.g:18698:1: rule__XMemberFeatureCall__Group_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18702:1: ( rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 )
+            // InternalEntityMockDSL.g:18703:2: rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XMemberFeatureCall__Group_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0__Impl"
+    // InternalEntityMockDSL.g:18710:1: rule__XMemberFeatureCall__Group_1_1_1__0__Impl : ( '<' ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18714:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:18715:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:18715:1: ( '<' )
+            // InternalEntityMockDSL.g:18716:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1"
+    // InternalEntityMockDSL.g:18725:1: rule__XMemberFeatureCall__Group_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18729:1: ( rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 )
+            // InternalEntityMockDSL.g:18730:2: rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2
+            {
+            pushFollow(FOLLOW_142);
+            rule__XMemberFeatureCall__Group_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1__Impl"
+    // InternalEntityMockDSL.g:18737:1: rule__XMemberFeatureCall__Group_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18741:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:18742:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:18742:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            // InternalEntityMockDSL.g:18743:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:18744:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            // InternalEntityMockDSL.g:18744:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2"
+    // InternalEntityMockDSL.g:18752:1: rule__XMemberFeatureCall__Group_1_1_1__2 : rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18756:1: ( rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 )
+            // InternalEntityMockDSL.g:18757:2: rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3
+            {
+            pushFollow(FOLLOW_142);
+            rule__XMemberFeatureCall__Group_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2__Impl"
+    // InternalEntityMockDSL.g:18764:1: rule__XMemberFeatureCall__Group_1_1_1__2__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18768:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) )
+            // InternalEntityMockDSL.g:18769:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:18769:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            // InternalEntityMockDSL.g:18770:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); 
+            }
+            // InternalEntityMockDSL.g:18771:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            loop152:
+            do {
+                int alt152=2;
+                int LA152_0 = input.LA(1);
+
+                if ( (LA152_0==70) ) {
+                    alt152=1;
+                }
+
+
+                switch (alt152) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:18771:3: rule__XMemberFeatureCall__Group_1_1_1_2__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XMemberFeatureCall__Group_1_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop152;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3"
+    // InternalEntityMockDSL.g:18779:1: rule__XMemberFeatureCall__Group_1_1_1__3 : rule__XMemberFeatureCall__Group_1_1_1__3__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18783:1: ( rule__XMemberFeatureCall__Group_1_1_1__3__Impl )
+            // InternalEntityMockDSL.g:18784:2: rule__XMemberFeatureCall__Group_1_1_1__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__3"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3__Impl"
+    // InternalEntityMockDSL.g:18790:1: rule__XMemberFeatureCall__Group_1_1_1__3__Impl : ( '>' ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18794:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:18795:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:18795:1: ( '>' )
+            // InternalEntityMockDSL.g:18796:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0"
+    // InternalEntityMockDSL.g:18806:1: rule__XMemberFeatureCall__Group_1_1_1_2__0 : rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18810:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 )
+            // InternalEntityMockDSL.g:18811:2: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1_2__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl"
+    // InternalEntityMockDSL.g:18818:1: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18822:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:18823:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:18823:1: ( ',' )
+            // InternalEntityMockDSL.g:18824:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1"
+    // InternalEntityMockDSL.g:18833:1: rule__XMemberFeatureCall__Group_1_1_1_2__1 : rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18837:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl )
+            // InternalEntityMockDSL.g:18838:2: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1_2__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl"
+    // InternalEntityMockDSL.g:18844:1: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18848:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) )
+            // InternalEntityMockDSL.g:18849:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:18849:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            // InternalEntityMockDSL.g:18850:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); 
+            }
+            // InternalEntityMockDSL.g:18851:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            // InternalEntityMockDSL.g:18851:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0"
+    // InternalEntityMockDSL.g:18860:1: rule__XMemberFeatureCall__Group_1_1_3__0 : rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18864:1: ( rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 )
+            // InternalEntityMockDSL.g:18865:2: rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1
+            {
+            pushFollow(FOLLOW_143);
+            rule__XMemberFeatureCall__Group_1_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0__Impl"
+    // InternalEntityMockDSL.g:18872:1: rule__XMemberFeatureCall__Group_1_1_3__0__Impl : ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18876:1: ( ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) )
+            // InternalEntityMockDSL.g:18877:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:18877:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            // InternalEntityMockDSL.g:18878:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); 
+            }
+            // InternalEntityMockDSL.g:18879:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            // InternalEntityMockDSL.g:18879:3: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1"
+    // InternalEntityMockDSL.g:18887:1: rule__XMemberFeatureCall__Group_1_1_3__1 : rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18891:1: ( rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 )
+            // InternalEntityMockDSL.g:18892:2: rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2
+            {
+            pushFollow(FOLLOW_143);
+            rule__XMemberFeatureCall__Group_1_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1__Impl"
+    // InternalEntityMockDSL.g:18899:1: rule__XMemberFeatureCall__Group_1_1_3__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18903:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) )
+            // InternalEntityMockDSL.g:18904:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            {
+            // InternalEntityMockDSL.g:18904:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            // InternalEntityMockDSL.g:18905:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); 
+            }
+            // InternalEntityMockDSL.g:18906:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            int alt153=2;
+            int LA153_0 = input.LA(1);
+
+            if ( ((LA153_0>=RULE_ID && LA153_0<=RULE_STRING)||LA153_0==28||LA153_0==32||(LA153_0>=35 && LA153_0<=36)||LA153_0==41||(LA153_0>=46 && LA153_0<=51)||LA153_0==57||LA153_0==68||(LA153_0>=124 && LA153_0<=125)||LA153_0==127||LA153_0==129||(LA153_0>=133 && LA153_0<=141)||LA153_0==143||(LA153_0>=155 && LA153_0<=156)) ) {
+                alt153=1;
+            }
+            switch (alt153) {
+                case 1 :
+                    // InternalEntityMockDSL.g:18906:3: rule__XMemberFeatureCall__Alternatives_1_1_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XMemberFeatureCall__Alternatives_1_1_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2"
+    // InternalEntityMockDSL.g:18914:1: rule__XMemberFeatureCall__Group_1_1_3__2 : rule__XMemberFeatureCall__Group_1_1_3__2__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18918:1: ( rule__XMemberFeatureCall__Group_1_1_3__2__Impl )
+            // InternalEntityMockDSL.g:18919:2: rule__XMemberFeatureCall__Group_1_1_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2__Impl"
+    // InternalEntityMockDSL.g:18925:1: rule__XMemberFeatureCall__Group_1_1_3__2__Impl : ( ')' ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18929:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:18930:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:18930:1: ( ')' )
+            // InternalEntityMockDSL.g:18931:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3__2__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0"
+    // InternalEntityMockDSL.g:18941:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18945:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 )
+            // InternalEntityMockDSL.g:18946:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl"
+    // InternalEntityMockDSL.g:18953:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18957:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) )
+            // InternalEntityMockDSL.g:18958:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:18958:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            // InternalEntityMockDSL.g:18959:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:18960:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            // InternalEntityMockDSL.g:18960:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1"
+    // InternalEntityMockDSL.g:18968:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18972:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl )
+            // InternalEntityMockDSL.g:18973:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl"
+    // InternalEntityMockDSL.g:18979:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18983:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:18984:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:18984:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            // InternalEntityMockDSL.g:18985:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:18986:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            loop154:
+            do {
+                int alt154=2;
+                int LA154_0 = input.LA(1);
+
+                if ( (LA154_0==70) ) {
+                    alt154=1;
+                }
+
+
+                switch (alt154) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:18986:3: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop154;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0"
+    // InternalEntityMockDSL.g:18995:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:18999:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 )
+            // InternalEntityMockDSL.g:19000:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl"
+    // InternalEntityMockDSL.g:19007:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19011:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:19012:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:19012:1: ( ',' )
+            // InternalEntityMockDSL.g:19013:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1"
+    // InternalEntityMockDSL.g:19022:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19026:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl )
+            // InternalEntityMockDSL.g:19027:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl"
+    // InternalEntityMockDSL.g:19033:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) ;
+    public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19037:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:19038:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:19038:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            // InternalEntityMockDSL.g:19039:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:19040:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            // InternalEntityMockDSL.g:19040:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__0"
+    // InternalEntityMockDSL.g:19049:1: rule__XSetLiteral__Group__0 : rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 ;
+    public final void rule__XSetLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19053:1: ( rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 )
+            // InternalEntityMockDSL.g:19054:2: rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1
+            {
+            pushFollow(FOLLOW_109);
+            rule__XSetLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:19061:1: rule__XSetLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XSetLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19065:1: ( ( () ) )
+            // InternalEntityMockDSL.g:19066:1: ( () )
+            {
+            // InternalEntityMockDSL.g:19066:1: ( () )
+            // InternalEntityMockDSL.g:19067:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:19068:2: ()
+            // InternalEntityMockDSL.g:19068:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__1"
+    // InternalEntityMockDSL.g:19076:1: rule__XSetLiteral__Group__1 : rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 ;
+    public final void rule__XSetLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19080:1: ( rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 )
+            // InternalEntityMockDSL.g:19081:2: rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2
+            {
+            pushFollow(FOLLOW_8);
+            rule__XSetLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:19088:1: rule__XSetLiteral__Group__1__Impl : ( '#' ) ;
+    public final void rule__XSetLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19092:1: ( ( '#' ) )
+            // InternalEntityMockDSL.g:19093:1: ( '#' )
+            {
+            // InternalEntityMockDSL.g:19093:1: ( '#' )
+            // InternalEntityMockDSL.g:19094:2: '#'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); 
+            }
+            match(input,124,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__2"
+    // InternalEntityMockDSL.g:19103:1: rule__XSetLiteral__Group__2 : rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 ;
+    public final void rule__XSetLiteral__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19107:1: ( rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 )
+            // InternalEntityMockDSL.g:19108:2: rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3
+            {
+            pushFollow(FOLLOW_144);
+            rule__XSetLiteral__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__2"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__2__Impl"
+    // InternalEntityMockDSL.g:19115:1: rule__XSetLiteral__Group__2__Impl : ( '{' ) ;
+    public final void rule__XSetLiteral__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19119:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:19120:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:19120:1: ( '{' )
+            // InternalEntityMockDSL.g:19121:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__3"
+    // InternalEntityMockDSL.g:19130:1: rule__XSetLiteral__Group__3 : rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 ;
+    public final void rule__XSetLiteral__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19134:1: ( rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 )
+            // InternalEntityMockDSL.g:19135:2: rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4
+            {
+            pushFollow(FOLLOW_144);
+            rule__XSetLiteral__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__3"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__3__Impl"
+    // InternalEntityMockDSL.g:19142:1: rule__XSetLiteral__Group__3__Impl : ( ( rule__XSetLiteral__Group_3__0 )? ) ;
+    public final void rule__XSetLiteral__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19146:1: ( ( ( rule__XSetLiteral__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:19147:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:19147:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            // InternalEntityMockDSL.g:19148:2: ( rule__XSetLiteral__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:19149:2: ( rule__XSetLiteral__Group_3__0 )?
+            int alt155=2;
+            int LA155_0 = input.LA(1);
+
+            if ( ((LA155_0>=RULE_ID && LA155_0<=RULE_STRING)||LA155_0==28||(LA155_0>=35 && LA155_0<=36)||LA155_0==41||(LA155_0>=46 && LA155_0<=51)||LA155_0==57||LA155_0==68||(LA155_0>=124 && LA155_0<=125)||LA155_0==127||LA155_0==129||(LA155_0>=133 && LA155_0<=141)||LA155_0==143||LA155_0==156) ) {
+                alt155=1;
+            }
+            switch (alt155) {
+                case 1 :
+                    // InternalEntityMockDSL.g:19149:3: rule__XSetLiteral__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XSetLiteral__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__4"
+    // InternalEntityMockDSL.g:19157:1: rule__XSetLiteral__Group__4 : rule__XSetLiteral__Group__4__Impl ;
+    public final void rule__XSetLiteral__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19161:1: ( rule__XSetLiteral__Group__4__Impl )
+            // InternalEntityMockDSL.g:19162:2: rule__XSetLiteral__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__4"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group__4__Impl"
+    // InternalEntityMockDSL.g:19168:1: rule__XSetLiteral__Group__4__Impl : ( '}' ) ;
+    public final void rule__XSetLiteral__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19172:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:19173:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:19173:1: ( '}' )
+            // InternalEntityMockDSL.g:19174:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3__0"
+    // InternalEntityMockDSL.g:19184:1: rule__XSetLiteral__Group_3__0 : rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 ;
+    public final void rule__XSetLiteral__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19188:1: ( rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 )
+            // InternalEntityMockDSL.g:19189:2: rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XSetLiteral__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3__0"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:19196:1: rule__XSetLiteral__Group_3__0__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) ;
+    public final void rule__XSetLiteral__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19200:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:19201:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:19201:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:19202:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:19203:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            // InternalEntityMockDSL.g:19203:3: rule__XSetLiteral__ElementsAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__ElementsAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3__1"
+    // InternalEntityMockDSL.g:19211:1: rule__XSetLiteral__Group_3__1 : rule__XSetLiteral__Group_3__1__Impl ;
+    public final void rule__XSetLiteral__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19215:1: ( rule__XSetLiteral__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:19216:2: rule__XSetLiteral__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3__1"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:19222:1: rule__XSetLiteral__Group_3__1__Impl : ( ( rule__XSetLiteral__Group_3_1__0 )* ) ;
+    public final void rule__XSetLiteral__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19226:1: ( ( ( rule__XSetLiteral__Group_3_1__0 )* ) )
+            // InternalEntityMockDSL.g:19227:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:19227:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            // InternalEntityMockDSL.g:19228:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); 
+            }
+            // InternalEntityMockDSL.g:19229:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            loop156:
+            do {
+                int alt156=2;
+                int LA156_0 = input.LA(1);
+
+                if ( (LA156_0==70) ) {
+                    alt156=1;
+                }
+
+
+                switch (alt156) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:19229:3: rule__XSetLiteral__Group_3_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XSetLiteral__Group_3_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop156;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3_1__0"
+    // InternalEntityMockDSL.g:19238:1: rule__XSetLiteral__Group_3_1__0 : rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 ;
+    public final void rule__XSetLiteral__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19242:1: ( rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 )
+            // InternalEntityMockDSL.g:19243:2: rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XSetLiteral__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3_1__0"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3_1__0__Impl"
+    // InternalEntityMockDSL.g:19250:1: rule__XSetLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    public final void rule__XSetLiteral__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19254:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:19255:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:19255:1: ( ',' )
+            // InternalEntityMockDSL.g:19256:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3_1__1"
+    // InternalEntityMockDSL.g:19265:1: rule__XSetLiteral__Group_3_1__1 : rule__XSetLiteral__Group_3_1__1__Impl ;
+    public final void rule__XSetLiteral__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19269:1: ( rule__XSetLiteral__Group_3_1__1__Impl )
+            // InternalEntityMockDSL.g:19270:2: rule__XSetLiteral__Group_3_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3_1__1"
+
+
+    // $ANTLR start "rule__XSetLiteral__Group_3_1__1__Impl"
+    // InternalEntityMockDSL.g:19276:1: rule__XSetLiteral__Group_3_1__1__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) ;
+    public final void rule__XSetLiteral__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19280:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalEntityMockDSL.g:19281:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:19281:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalEntityMockDSL.g:19282:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); 
+            }
+            // InternalEntityMockDSL.g:19283:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            // InternalEntityMockDSL.g:19283:3: rule__XSetLiteral__ElementsAssignment_3_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSetLiteral__ElementsAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__0"
+    // InternalEntityMockDSL.g:19292:1: rule__XListLiteral__Group__0 : rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 ;
+    public final void rule__XListLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19296:1: ( rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 )
+            // InternalEntityMockDSL.g:19297:2: rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1
+            {
+            pushFollow(FOLLOW_109);
+            rule__XListLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:19304:1: rule__XListLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XListLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19308:1: ( ( () ) )
+            // InternalEntityMockDSL.g:19309:1: ( () )
+            {
+            // InternalEntityMockDSL.g:19309:1: ( () )
+            // InternalEntityMockDSL.g:19310:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:19311:2: ()
+            // InternalEntityMockDSL.g:19311:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__1"
+    // InternalEntityMockDSL.g:19319:1: rule__XListLiteral__Group__1 : rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 ;
+    public final void rule__XListLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19323:1: ( rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 )
+            // InternalEntityMockDSL.g:19324:2: rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2
+            {
+            pushFollow(FOLLOW_110);
+            rule__XListLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:19331:1: rule__XListLiteral__Group__1__Impl : ( '#' ) ;
+    public final void rule__XListLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19335:1: ( ( '#' ) )
+            // InternalEntityMockDSL.g:19336:1: ( '#' )
+            {
+            // InternalEntityMockDSL.g:19336:1: ( '#' )
+            // InternalEntityMockDSL.g:19337:2: '#'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); 
+            }
+            match(input,124,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__2"
+    // InternalEntityMockDSL.g:19346:1: rule__XListLiteral__Group__2 : rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 ;
+    public final void rule__XListLiteral__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19350:1: ( rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 )
+            // InternalEntityMockDSL.g:19351:2: rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3
+            {
+            pushFollow(FOLLOW_108);
+            rule__XListLiteral__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__2"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__2__Impl"
+    // InternalEntityMockDSL.g:19358:1: rule__XListLiteral__Group__2__Impl : ( '[' ) ;
+    public final void rule__XListLiteral__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19362:1: ( ( '[' ) )
+            // InternalEntityMockDSL.g:19363:1: ( '[' )
+            {
+            // InternalEntityMockDSL.g:19363:1: ( '[' )
+            // InternalEntityMockDSL.g:19364:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__3"
+    // InternalEntityMockDSL.g:19373:1: rule__XListLiteral__Group__3 : rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 ;
+    public final void rule__XListLiteral__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19377:1: ( rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 )
+            // InternalEntityMockDSL.g:19378:2: rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4
+            {
+            pushFollow(FOLLOW_108);
+            rule__XListLiteral__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__3"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__3__Impl"
+    // InternalEntityMockDSL.g:19385:1: rule__XListLiteral__Group__3__Impl : ( ( rule__XListLiteral__Group_3__0 )? ) ;
+    public final void rule__XListLiteral__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19389:1: ( ( ( rule__XListLiteral__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:19390:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:19390:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            // InternalEntityMockDSL.g:19391:2: ( rule__XListLiteral__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:19392:2: ( rule__XListLiteral__Group_3__0 )?
+            int alt157=2;
+            int LA157_0 = input.LA(1);
+
+            if ( ((LA157_0>=RULE_ID && LA157_0<=RULE_STRING)||LA157_0==28||(LA157_0>=35 && LA157_0<=36)||LA157_0==41||(LA157_0>=46 && LA157_0<=51)||LA157_0==57||LA157_0==68||(LA157_0>=124 && LA157_0<=125)||LA157_0==127||LA157_0==129||(LA157_0>=133 && LA157_0<=141)||LA157_0==143||LA157_0==156) ) {
+                alt157=1;
+            }
+            switch (alt157) {
+                case 1 :
+                    // InternalEntityMockDSL.g:19392:3: rule__XListLiteral__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XListLiteral__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__4"
+    // InternalEntityMockDSL.g:19400:1: rule__XListLiteral__Group__4 : rule__XListLiteral__Group__4__Impl ;
+    public final void rule__XListLiteral__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19404:1: ( rule__XListLiteral__Group__4__Impl )
+            // InternalEntityMockDSL.g:19405:2: rule__XListLiteral__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__4"
+
+
+    // $ANTLR start "rule__XListLiteral__Group__4__Impl"
+    // InternalEntityMockDSL.g:19411:1: rule__XListLiteral__Group__4__Impl : ( ']' ) ;
+    public final void rule__XListLiteral__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19415:1: ( ( ']' ) )
+            // InternalEntityMockDSL.g:19416:1: ( ']' )
+            {
+            // InternalEntityMockDSL.g:19416:1: ( ']' )
+            // InternalEntityMockDSL.g:19417:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); 
+            }
+            match(input,123,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3__0"
+    // InternalEntityMockDSL.g:19427:1: rule__XListLiteral__Group_3__0 : rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 ;
+    public final void rule__XListLiteral__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19431:1: ( rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 )
+            // InternalEntityMockDSL.g:19432:2: rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XListLiteral__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3__0"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:19439:1: rule__XListLiteral__Group_3__0__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) ;
+    public final void rule__XListLiteral__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19443:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:19444:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:19444:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:19445:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:19446:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            // InternalEntityMockDSL.g:19446:3: rule__XListLiteral__ElementsAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__ElementsAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3__1"
+    // InternalEntityMockDSL.g:19454:1: rule__XListLiteral__Group_3__1 : rule__XListLiteral__Group_3__1__Impl ;
+    public final void rule__XListLiteral__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19458:1: ( rule__XListLiteral__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:19459:2: rule__XListLiteral__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3__1"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:19465:1: rule__XListLiteral__Group_3__1__Impl : ( ( rule__XListLiteral__Group_3_1__0 )* ) ;
+    public final void rule__XListLiteral__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19469:1: ( ( ( rule__XListLiteral__Group_3_1__0 )* ) )
+            // InternalEntityMockDSL.g:19470:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:19470:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            // InternalEntityMockDSL.g:19471:2: ( rule__XListLiteral__Group_3_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getGroup_3_1()); 
+            }
+            // InternalEntityMockDSL.g:19472:2: ( rule__XListLiteral__Group_3_1__0 )*
+            loop158:
+            do {
+                int alt158=2;
+                int LA158_0 = input.LA(1);
+
+                if ( (LA158_0==70) ) {
+                    alt158=1;
+                }
+
+
+                switch (alt158) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:19472:3: rule__XListLiteral__Group_3_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XListLiteral__Group_3_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop158;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getGroup_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3_1__0"
+    // InternalEntityMockDSL.g:19481:1: rule__XListLiteral__Group_3_1__0 : rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 ;
+    public final void rule__XListLiteral__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19485:1: ( rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 )
+            // InternalEntityMockDSL.g:19486:2: rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XListLiteral__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3_1__0"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3_1__0__Impl"
+    // InternalEntityMockDSL.g:19493:1: rule__XListLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    public final void rule__XListLiteral__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19497:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:19498:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:19498:1: ( ',' )
+            // InternalEntityMockDSL.g:19499:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3_1__1"
+    // InternalEntityMockDSL.g:19508:1: rule__XListLiteral__Group_3_1__1 : rule__XListLiteral__Group_3_1__1__Impl ;
+    public final void rule__XListLiteral__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19512:1: ( rule__XListLiteral__Group_3_1__1__Impl )
+            // InternalEntityMockDSL.g:19513:2: rule__XListLiteral__Group_3_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3_1__1"
+
+
+    // $ANTLR start "rule__XListLiteral__Group_3_1__1__Impl"
+    // InternalEntityMockDSL.g:19519:1: rule__XListLiteral__Group_3_1__1__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) ;
+    public final void rule__XListLiteral__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19523:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalEntityMockDSL.g:19524:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:19524:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalEntityMockDSL.g:19525:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); 
+            }
+            // InternalEntityMockDSL.g:19526:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            // InternalEntityMockDSL.g:19526:3: rule__XListLiteral__ElementsAssignment_3_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XListLiteral__ElementsAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group__0"
+    // InternalEntityMockDSL.g:19535:1: rule__XClosure__Group__0 : rule__XClosure__Group__0__Impl rule__XClosure__Group__1 ;
+    public final void rule__XClosure__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19539:1: ( rule__XClosure__Group__0__Impl rule__XClosure__Group__1 )
+            // InternalEntityMockDSL.g:19540:2: rule__XClosure__Group__0__Impl rule__XClosure__Group__1
+            {
+            pushFollow(FOLLOW_145);
+            rule__XClosure__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__0"
+
+
+    // $ANTLR start "rule__XClosure__Group__0__Impl"
+    // InternalEntityMockDSL.g:19547:1: rule__XClosure__Group__0__Impl : ( ( rule__XClosure__Group_0__0 ) ) ;
+    public final void rule__XClosure__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19551:1: ( ( ( rule__XClosure__Group_0__0 ) ) )
+            // InternalEntityMockDSL.g:19552:1: ( ( rule__XClosure__Group_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:19552:1: ( ( rule__XClosure__Group_0__0 ) )
+            // InternalEntityMockDSL.g:19553:2: ( rule__XClosure__Group_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:19554:2: ( rule__XClosure__Group_0__0 )
+            // InternalEntityMockDSL.g:19554:3: rule__XClosure__Group_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group__1"
+    // InternalEntityMockDSL.g:19562:1: rule__XClosure__Group__1 : rule__XClosure__Group__1__Impl rule__XClosure__Group__2 ;
+    public final void rule__XClosure__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19566:1: ( rule__XClosure__Group__1__Impl rule__XClosure__Group__2 )
+            // InternalEntityMockDSL.g:19567:2: rule__XClosure__Group__1__Impl rule__XClosure__Group__2
+            {
+            pushFollow(FOLLOW_145);
+            rule__XClosure__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__1"
+
+
+    // $ANTLR start "rule__XClosure__Group__1__Impl"
+    // InternalEntityMockDSL.g:19574:1: rule__XClosure__Group__1__Impl : ( ( rule__XClosure__Group_1__0 )? ) ;
+    public final void rule__XClosure__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19578:1: ( ( ( rule__XClosure__Group_1__0 )? ) )
+            // InternalEntityMockDSL.g:19579:1: ( ( rule__XClosure__Group_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:19579:1: ( ( rule__XClosure__Group_1__0 )? )
+            // InternalEntityMockDSL.g:19580:2: ( rule__XClosure__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:19581:2: ( rule__XClosure__Group_1__0 )?
+            int alt159=2;
+            alt159 = dfa159.predict(input);
+            switch (alt159) {
+                case 1 :
+                    // InternalEntityMockDSL.g:19581:3: rule__XClosure__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XClosure__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group__2"
+    // InternalEntityMockDSL.g:19589:1: rule__XClosure__Group__2 : rule__XClosure__Group__2__Impl rule__XClosure__Group__3 ;
+    public final void rule__XClosure__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19593:1: ( rule__XClosure__Group__2__Impl rule__XClosure__Group__3 )
+            // InternalEntityMockDSL.g:19594:2: rule__XClosure__Group__2__Impl rule__XClosure__Group__3
+            {
+            pushFollow(FOLLOW_146);
+            rule__XClosure__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__2"
+
+
+    // $ANTLR start "rule__XClosure__Group__2__Impl"
+    // InternalEntityMockDSL.g:19601:1: rule__XClosure__Group__2__Impl : ( ( rule__XClosure__ExpressionAssignment_2 ) ) ;
+    public final void rule__XClosure__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19605:1: ( ( ( rule__XClosure__ExpressionAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:19606:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:19606:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            // InternalEntityMockDSL.g:19607:2: ( rule__XClosure__ExpressionAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:19608:2: ( rule__XClosure__ExpressionAssignment_2 )
+            // InternalEntityMockDSL.g:19608:3: rule__XClosure__ExpressionAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__ExpressionAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group__3"
+    // InternalEntityMockDSL.g:19616:1: rule__XClosure__Group__3 : rule__XClosure__Group__3__Impl ;
+    public final void rule__XClosure__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19620:1: ( rule__XClosure__Group__3__Impl )
+            // InternalEntityMockDSL.g:19621:2: rule__XClosure__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__3"
+
+
+    // $ANTLR start "rule__XClosure__Group__3__Impl"
+    // InternalEntityMockDSL.g:19627:1: rule__XClosure__Group__3__Impl : ( ']' ) ;
+    public final void rule__XClosure__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19631:1: ( ( ']' ) )
+            // InternalEntityMockDSL.g:19632:1: ( ']' )
+            {
+            // InternalEntityMockDSL.g:19632:1: ( ']' )
+            // InternalEntityMockDSL.g:19633:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); 
+            }
+            match(input,123,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_0__0"
+    // InternalEntityMockDSL.g:19643:1: rule__XClosure__Group_0__0 : rule__XClosure__Group_0__0__Impl ;
+    public final void rule__XClosure__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19647:1: ( rule__XClosure__Group_0__0__Impl )
+            // InternalEntityMockDSL.g:19648:2: rule__XClosure__Group_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:19654:1: rule__XClosure__Group_0__0__Impl : ( ( rule__XClosure__Group_0_0__0 ) ) ;
+    public final void rule__XClosure__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19658:1: ( ( ( rule__XClosure__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:19659:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:19659:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:19660:2: ( rule__XClosure__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:19661:2: ( rule__XClosure__Group_0_0__0 )
+            // InternalEntityMockDSL.g:19661:3: rule__XClosure__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_0_0__0"
+    // InternalEntityMockDSL.g:19670:1: rule__XClosure__Group_0_0__0 : rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 ;
+    public final void rule__XClosure__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19674:1: ( rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 )
+            // InternalEntityMockDSL.g:19675:2: rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1
+            {
+            pushFollow(FOLLOW_110);
+            rule__XClosure__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:19682:1: rule__XClosure__Group_0_0__0__Impl : ( () ) ;
+    public final void rule__XClosure__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19686:1: ( ( () ) )
+            // InternalEntityMockDSL.g:19687:1: ( () )
+            {
+            // InternalEntityMockDSL.g:19687:1: ( () )
+            // InternalEntityMockDSL.g:19688:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:19689:2: ()
+            // InternalEntityMockDSL.g:19689:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_0_0__1"
+    // InternalEntityMockDSL.g:19697:1: rule__XClosure__Group_0_0__1 : rule__XClosure__Group_0_0__1__Impl ;
+    public final void rule__XClosure__Group_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19701:1: ( rule__XClosure__Group_0_0__1__Impl )
+            // InternalEntityMockDSL.g:19702:2: rule__XClosure__Group_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0_0__1"
+
+
+    // $ANTLR start "rule__XClosure__Group_0_0__1__Impl"
+    // InternalEntityMockDSL.g:19708:1: rule__XClosure__Group_0_0__1__Impl : ( '[' ) ;
+    public final void rule__XClosure__Group_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19712:1: ( ( '[' ) )
+            // InternalEntityMockDSL.g:19713:1: ( '[' )
+            {
+            // InternalEntityMockDSL.g:19713:1: ( '[' )
+            // InternalEntityMockDSL.g:19714:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1__0"
+    // InternalEntityMockDSL.g:19724:1: rule__XClosure__Group_1__0 : rule__XClosure__Group_1__0__Impl ;
+    public final void rule__XClosure__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19728:1: ( rule__XClosure__Group_1__0__Impl )
+            // InternalEntityMockDSL.g:19729:2: rule__XClosure__Group_1__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:19735:1: rule__XClosure__Group_1__0__Impl : ( ( rule__XClosure__Group_1_0__0 ) ) ;
+    public final void rule__XClosure__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19739:1: ( ( ( rule__XClosure__Group_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:19740:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:19740:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            // InternalEntityMockDSL.g:19741:2: ( rule__XClosure__Group_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_1_0()); 
+            }
+            // InternalEntityMockDSL.g:19742:2: ( rule__XClosure__Group_1_0__0 )
+            // InternalEntityMockDSL.g:19742:3: rule__XClosure__Group_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0__0"
+    // InternalEntityMockDSL.g:19751:1: rule__XClosure__Group_1_0__0 : rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 ;
+    public final void rule__XClosure__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19755:1: ( rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 )
+            // InternalEntityMockDSL.g:19756:2: rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1
+            {
+            pushFollow(FOLLOW_147);
+            rule__XClosure__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0__0__Impl"
+    // InternalEntityMockDSL.g:19763:1: rule__XClosure__Group_1_0__0__Impl : ( ( rule__XClosure__Group_1_0_0__0 )? ) ;
+    public final void rule__XClosure__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19767:1: ( ( ( rule__XClosure__Group_1_0_0__0 )? ) )
+            // InternalEntityMockDSL.g:19768:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            {
+            // InternalEntityMockDSL.g:19768:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            // InternalEntityMockDSL.g:19769:2: ( rule__XClosure__Group_1_0_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:19770:2: ( rule__XClosure__Group_1_0_0__0 )?
+            int alt160=2;
+            int LA160_0 = input.LA(1);
+
+            if ( (LA160_0==RULE_ID||LA160_0==32||LA160_0==68) ) {
+                alt160=1;
+            }
+            switch (alt160) {
+                case 1 :
+                    // InternalEntityMockDSL.g:19770:3: rule__XClosure__Group_1_0_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XClosure__Group_1_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0__1"
+    // InternalEntityMockDSL.g:19778:1: rule__XClosure__Group_1_0__1 : rule__XClosure__Group_1_0__1__Impl ;
+    public final void rule__XClosure__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19782:1: ( rule__XClosure__Group_1_0__1__Impl )
+            // InternalEntityMockDSL.g:19783:2: rule__XClosure__Group_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0__1"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0__1__Impl"
+    // InternalEntityMockDSL.g:19789:1: rule__XClosure__Group_1_0__1__Impl : ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) ;
+    public final void rule__XClosure__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19793:1: ( ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) )
+            // InternalEntityMockDSL.g:19794:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:19794:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            // InternalEntityMockDSL.g:19795:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); 
+            }
+            // InternalEntityMockDSL.g:19796:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            // InternalEntityMockDSL.g:19796:3: rule__XClosure__ExplicitSyntaxAssignment_1_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__ExplicitSyntaxAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0__0"
+    // InternalEntityMockDSL.g:19805:1: rule__XClosure__Group_1_0_0__0 : rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 ;
+    public final void rule__XClosure__Group_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19809:1: ( rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 )
+            // InternalEntityMockDSL.g:19810:2: rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XClosure__Group_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:19817:1: rule__XClosure__Group_1_0_0__0__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) ;
+    public final void rule__XClosure__Group_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19821:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) )
+            // InternalEntityMockDSL.g:19822:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:19822:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            // InternalEntityMockDSL.g:19823:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:19824:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            // InternalEntityMockDSL.g:19824:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0__1"
+    // InternalEntityMockDSL.g:19832:1: rule__XClosure__Group_1_0_0__1 : rule__XClosure__Group_1_0_0__1__Impl ;
+    public final void rule__XClosure__Group_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19836:1: ( rule__XClosure__Group_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:19837:2: rule__XClosure__Group_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0__1"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:19843:1: rule__XClosure__Group_1_0_0__1__Impl : ( ( rule__XClosure__Group_1_0_0_1__0 )* ) ;
+    public final void rule__XClosure__Group_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19847:1: ( ( ( rule__XClosure__Group_1_0_0_1__0 )* ) )
+            // InternalEntityMockDSL.g:19848:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:19848:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            // InternalEntityMockDSL.g:19849:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:19850:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            loop161:
+            do {
+                int alt161=2;
+                int LA161_0 = input.LA(1);
+
+                if ( (LA161_0==70) ) {
+                    alt161=1;
+                }
+
+
+                switch (alt161) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:19850:3: rule__XClosure__Group_1_0_0_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XClosure__Group_1_0_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop161;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0_1__0"
+    // InternalEntityMockDSL.g:19859:1: rule__XClosure__Group_1_0_0_1__0 : rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 ;
+    public final void rule__XClosure__Group_1_0_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19863:1: ( rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 )
+            // InternalEntityMockDSL.g:19864:2: rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XClosure__Group_1_0_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0_1__0"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0_1__0__Impl"
+    // InternalEntityMockDSL.g:19871:1: rule__XClosure__Group_1_0_0_1__0__Impl : ( ',' ) ;
+    public final void rule__XClosure__Group_1_0_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19875:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:19876:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:19876:1: ( ',' )
+            // InternalEntityMockDSL.g:19877:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0_1__1"
+    // InternalEntityMockDSL.g:19886:1: rule__XClosure__Group_1_0_0_1__1 : rule__XClosure__Group_1_0_0_1__1__Impl ;
+    public final void rule__XClosure__Group_1_0_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19890:1: ( rule__XClosure__Group_1_0_0_1__1__Impl )
+            // InternalEntityMockDSL.g:19891:2: rule__XClosure__Group_1_0_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__Group_1_0_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0_1__1"
+
+
+    // $ANTLR start "rule__XClosure__Group_1_0_0_1__1__Impl"
+    // InternalEntityMockDSL.g:19897:1: rule__XClosure__Group_1_0_0_1__1__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) ;
+    public final void rule__XClosure__Group_1_0_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19901:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) )
+            // InternalEntityMockDSL.g:19902:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:19902:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            // InternalEntityMockDSL.g:19903:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:19904:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            // InternalEntityMockDSL.g:19904:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__Group_1_0_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group__0"
+    // InternalEntityMockDSL.g:19913:1: rule__XExpressionInClosure__Group__0 : rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 ;
+    public final void rule__XExpressionInClosure__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19917:1: ( rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 )
+            // InternalEntityMockDSL.g:19918:2: rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1
+            {
+            pushFollow(FOLLOW_145);
+            rule__XExpressionInClosure__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group__0"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group__0__Impl"
+    // InternalEntityMockDSL.g:19925:1: rule__XExpressionInClosure__Group__0__Impl : ( () ) ;
+    public final void rule__XExpressionInClosure__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19929:1: ( ( () ) )
+            // InternalEntityMockDSL.g:19930:1: ( () )
+            {
+            // InternalEntityMockDSL.g:19930:1: ( () )
+            // InternalEntityMockDSL.g:19931:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:19932:2: ()
+            // InternalEntityMockDSL.g:19932:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group__1"
+    // InternalEntityMockDSL.g:19940:1: rule__XExpressionInClosure__Group__1 : rule__XExpressionInClosure__Group__1__Impl ;
+    public final void rule__XExpressionInClosure__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19944:1: ( rule__XExpressionInClosure__Group__1__Impl )
+            // InternalEntityMockDSL.g:19945:2: rule__XExpressionInClosure__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group__1"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group__1__Impl"
+    // InternalEntityMockDSL.g:19951:1: rule__XExpressionInClosure__Group__1__Impl : ( ( rule__XExpressionInClosure__Group_1__0 )* ) ;
+    public final void rule__XExpressionInClosure__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19955:1: ( ( ( rule__XExpressionInClosure__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:19956:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:19956:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            // InternalEntityMockDSL.g:19957:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:19958:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            loop162:
+            do {
+                int alt162=2;
+                int LA162_0 = input.LA(1);
+
+                if ( ((LA162_0>=RULE_ID && LA162_0<=RULE_STRING)||LA162_0==28||(LA162_0>=35 && LA162_0<=36)||LA162_0==41||(LA162_0>=45 && LA162_0<=51)||LA162_0==57||LA162_0==68||LA162_0==73||(LA162_0>=124 && LA162_0<=125)||LA162_0==127||LA162_0==129||(LA162_0>=133 && LA162_0<=141)||LA162_0==143||LA162_0==156) ) {
+                    alt162=1;
+                }
+
+
+                switch (alt162) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:19958:3: rule__XExpressionInClosure__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_148);
+            	    rule__XExpressionInClosure__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop162;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group_1__0"
+    // InternalEntityMockDSL.g:19967:1: rule__XExpressionInClosure__Group_1__0 : rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 ;
+    public final void rule__XExpressionInClosure__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19971:1: ( rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 )
+            // InternalEntityMockDSL.g:19972:2: rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1
+            {
+            pushFollow(FOLLOW_101);
+            rule__XExpressionInClosure__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group_1__0"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:19979:1: rule__XExpressionInClosure__Group_1__0__Impl : ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) ;
+    public final void rule__XExpressionInClosure__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19983:1: ( ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) )
+            // InternalEntityMockDSL.g:19984:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:19984:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            // InternalEntityMockDSL.g:19985:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); 
+            }
+            // InternalEntityMockDSL.g:19986:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            // InternalEntityMockDSL.g:19986:3: rule__XExpressionInClosure__ExpressionsAssignment_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__ExpressionsAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group_1__1"
+    // InternalEntityMockDSL.g:19994:1: rule__XExpressionInClosure__Group_1__1 : rule__XExpressionInClosure__Group_1__1__Impl ;
+    public final void rule__XExpressionInClosure__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:19998:1: ( rule__XExpressionInClosure__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:19999:2: rule__XExpressionInClosure__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XExpressionInClosure__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group_1__1"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:20005:1: rule__XExpressionInClosure__Group_1__1__Impl : ( ( ';' )? ) ;
+    public final void rule__XExpressionInClosure__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20009:1: ( ( ( ';' )? ) )
+            // InternalEntityMockDSL.g:20010:1: ( ( ';' )? )
+            {
+            // InternalEntityMockDSL.g:20010:1: ( ( ';' )? )
+            // InternalEntityMockDSL.g:20011:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); 
+            }
+            // InternalEntityMockDSL.g:20012:2: ( ';' )?
+            int alt163=2;
+            int LA163_0 = input.LA(1);
+
+            if ( (LA163_0==121) ) {
+                alt163=1;
+            }
+            switch (alt163) {
+                case 1 :
+                    // InternalEntityMockDSL.g:20012:3: ';'
+                    {
+                    match(input,121,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group__0"
+    // InternalEntityMockDSL.g:20021:1: rule__XShortClosure__Group__0 : rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 ;
+    public final void rule__XShortClosure__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20025:1: ( rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 )
+            // InternalEntityMockDSL.g:20026:2: rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XShortClosure__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group__0"
+
+
+    // $ANTLR start "rule__XShortClosure__Group__0__Impl"
+    // InternalEntityMockDSL.g:20033:1: rule__XShortClosure__Group__0__Impl : ( ( rule__XShortClosure__Group_0__0 ) ) ;
+    public final void rule__XShortClosure__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20037:1: ( ( ( rule__XShortClosure__Group_0__0 ) ) )
+            // InternalEntityMockDSL.g:20038:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:20038:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            // InternalEntityMockDSL.g:20039:2: ( rule__XShortClosure__Group_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:20040:2: ( rule__XShortClosure__Group_0__0 )
+            // InternalEntityMockDSL.g:20040:3: rule__XShortClosure__Group_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group__1"
+    // InternalEntityMockDSL.g:20048:1: rule__XShortClosure__Group__1 : rule__XShortClosure__Group__1__Impl ;
+    public final void rule__XShortClosure__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20052:1: ( rule__XShortClosure__Group__1__Impl )
+            // InternalEntityMockDSL.g:20053:2: rule__XShortClosure__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group__1"
+
+
+    // $ANTLR start "rule__XShortClosure__Group__1__Impl"
+    // InternalEntityMockDSL.g:20059:1: rule__XShortClosure__Group__1__Impl : ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) ;
+    public final void rule__XShortClosure__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20063:1: ( ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:20064:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:20064:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            // InternalEntityMockDSL.g:20065:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:20066:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            // InternalEntityMockDSL.g:20066:3: rule__XShortClosure__ExpressionAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__ExpressionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0__0"
+    // InternalEntityMockDSL.g:20075:1: rule__XShortClosure__Group_0__0 : rule__XShortClosure__Group_0__0__Impl ;
+    public final void rule__XShortClosure__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20079:1: ( rule__XShortClosure__Group_0__0__Impl )
+            // InternalEntityMockDSL.g:20080:2: rule__XShortClosure__Group_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0__0"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:20086:1: rule__XShortClosure__Group_0__0__Impl : ( ( rule__XShortClosure__Group_0_0__0 ) ) ;
+    public final void rule__XShortClosure__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20090:1: ( ( ( rule__XShortClosure__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:20091:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:20091:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:20092:2: ( rule__XShortClosure__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:20093:2: ( rule__XShortClosure__Group_0_0__0 )
+            // InternalEntityMockDSL.g:20093:3: rule__XShortClosure__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__0"
+    // InternalEntityMockDSL.g:20102:1: rule__XShortClosure__Group_0_0__0 : rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 ;
+    public final void rule__XShortClosure__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20106:1: ( rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 )
+            // InternalEntityMockDSL.g:20107:2: rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1
+            {
+            pushFollow(FOLLOW_147);
+            rule__XShortClosure__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:20114:1: rule__XShortClosure__Group_0_0__0__Impl : ( () ) ;
+    public final void rule__XShortClosure__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20118:1: ( ( () ) )
+            // InternalEntityMockDSL.g:20119:1: ( () )
+            {
+            // InternalEntityMockDSL.g:20119:1: ( () )
+            // InternalEntityMockDSL.g:20120:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:20121:2: ()
+            // InternalEntityMockDSL.g:20121:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__1"
+    // InternalEntityMockDSL.g:20129:1: rule__XShortClosure__Group_0_0__1 : rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 ;
+    public final void rule__XShortClosure__Group_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20133:1: ( rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 )
+            // InternalEntityMockDSL.g:20134:2: rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2
+            {
+            pushFollow(FOLLOW_147);
+            rule__XShortClosure__Group_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__1"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__1__Impl"
+    // InternalEntityMockDSL.g:20141:1: rule__XShortClosure__Group_0_0__1__Impl : ( ( rule__XShortClosure__Group_0_0_1__0 )? ) ;
+    public final void rule__XShortClosure__Group_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20145:1: ( ( ( rule__XShortClosure__Group_0_0_1__0 )? ) )
+            // InternalEntityMockDSL.g:20146:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:20146:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            // InternalEntityMockDSL.g:20147:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:20148:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            int alt164=2;
+            int LA164_0 = input.LA(1);
+
+            if ( (LA164_0==RULE_ID||LA164_0==32||LA164_0==68) ) {
+                alt164=1;
+            }
+            switch (alt164) {
+                case 1 :
+                    // InternalEntityMockDSL.g:20148:3: rule__XShortClosure__Group_0_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XShortClosure__Group_0_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__2"
+    // InternalEntityMockDSL.g:20156:1: rule__XShortClosure__Group_0_0__2 : rule__XShortClosure__Group_0_0__2__Impl ;
+    public final void rule__XShortClosure__Group_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20160:1: ( rule__XShortClosure__Group_0_0__2__Impl )
+            // InternalEntityMockDSL.g:20161:2: rule__XShortClosure__Group_0_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__2"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0__2__Impl"
+    // InternalEntityMockDSL.g:20167:1: rule__XShortClosure__Group_0_0__2__Impl : ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) ;
+    public final void rule__XShortClosure__Group_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20171:1: ( ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) )
+            // InternalEntityMockDSL.g:20172:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            {
+            // InternalEntityMockDSL.g:20172:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            // InternalEntityMockDSL.g:20173:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); 
+            }
+            // InternalEntityMockDSL.g:20174:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            // InternalEntityMockDSL.g:20174:3: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1__0"
+    // InternalEntityMockDSL.g:20183:1: rule__XShortClosure__Group_0_0_1__0 : rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 ;
+    public final void rule__XShortClosure__Group_0_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20187:1: ( rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 )
+            // InternalEntityMockDSL.g:20188:2: rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XShortClosure__Group_0_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1__0"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1__0__Impl"
+    // InternalEntityMockDSL.g:20195:1: rule__XShortClosure__Group_0_0_1__0__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) ;
+    public final void rule__XShortClosure__Group_0_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20199:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) )
+            // InternalEntityMockDSL.g:20200:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:20200:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            // InternalEntityMockDSL.g:20201:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:20202:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            // InternalEntityMockDSL.g:20202:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1__1"
+    // InternalEntityMockDSL.g:20210:1: rule__XShortClosure__Group_0_0_1__1 : rule__XShortClosure__Group_0_0_1__1__Impl ;
+    public final void rule__XShortClosure__Group_0_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20214:1: ( rule__XShortClosure__Group_0_0_1__1__Impl )
+            // InternalEntityMockDSL.g:20215:2: rule__XShortClosure__Group_0_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1__1"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1__1__Impl"
+    // InternalEntityMockDSL.g:20221:1: rule__XShortClosure__Group_0_0_1__1__Impl : ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) ;
+    public final void rule__XShortClosure__Group_0_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20225:1: ( ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:20226:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:20226:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            // InternalEntityMockDSL.g:20227:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:20228:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            loop165:
+            do {
+                int alt165=2;
+                int LA165_0 = input.LA(1);
+
+                if ( (LA165_0==70) ) {
+                    alt165=1;
+                }
+
+
+                switch (alt165) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:20228:3: rule__XShortClosure__Group_0_0_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XShortClosure__Group_0_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop165;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0"
+    // InternalEntityMockDSL.g:20237:1: rule__XShortClosure__Group_0_0_1_1__0 : rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 ;
+    public final void rule__XShortClosure__Group_0_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20241:1: ( rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 )
+            // InternalEntityMockDSL.g:20242:2: rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XShortClosure__Group_0_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1_1__0"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0__Impl"
+    // InternalEntityMockDSL.g:20249:1: rule__XShortClosure__Group_0_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XShortClosure__Group_0_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20253:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:20254:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:20254:1: ( ',' )
+            // InternalEntityMockDSL.g:20255:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1"
+    // InternalEntityMockDSL.g:20264:1: rule__XShortClosure__Group_0_0_1_1__1 : rule__XShortClosure__Group_0_0_1_1__1__Impl ;
+    public final void rule__XShortClosure__Group_0_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20268:1: ( rule__XShortClosure__Group_0_0_1_1__1__Impl )
+            // InternalEntityMockDSL.g:20269:2: rule__XShortClosure__Group_0_0_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__Group_0_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1_1__1"
+
+
+    // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1__Impl"
+    // InternalEntityMockDSL.g:20275:1: rule__XShortClosure__Group_0_0_1_1__1__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) ;
+    public final void rule__XShortClosure__Group_0_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20279:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:20280:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:20280:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            // InternalEntityMockDSL.g:20281:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:20282:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            // InternalEntityMockDSL.g:20282:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__Group_0_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__0"
+    // InternalEntityMockDSL.g:20291:1: rule__XParenthesizedExpression__Group__0 : rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 ;
+    public final void rule__XParenthesizedExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20295:1: ( rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 )
+            // InternalEntityMockDSL.g:20296:2: rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XParenthesizedExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XParenthesizedExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__0"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:20303:1: rule__XParenthesizedExpression__Group__0__Impl : ( '(' ) ;
+    public final void rule__XParenthesizedExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20307:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:20308:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:20308:1: ( '(' )
+            // InternalEntityMockDSL.g:20309:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__1"
+    // InternalEntityMockDSL.g:20318:1: rule__XParenthesizedExpression__Group__1 : rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 ;
+    public final void rule__XParenthesizedExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20322:1: ( rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 )
+            // InternalEntityMockDSL.g:20323:2: rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2
+            {
+            pushFollow(FOLLOW_63);
+            rule__XParenthesizedExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XParenthesizedExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__1"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:20330:1: rule__XParenthesizedExpression__Group__1__Impl : ( ruleXExpression ) ;
+    public final void rule__XParenthesizedExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20334:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:20335:1: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:20335:1: ( ruleXExpression )
+            // InternalEntityMockDSL.g:20336:2: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__2"
+    // InternalEntityMockDSL.g:20345:1: rule__XParenthesizedExpression__Group__2 : rule__XParenthesizedExpression__Group__2__Impl ;
+    public final void rule__XParenthesizedExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20349:1: ( rule__XParenthesizedExpression__Group__2__Impl )
+            // InternalEntityMockDSL.g:20350:2: rule__XParenthesizedExpression__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XParenthesizedExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__2"
+
+
+    // $ANTLR start "rule__XParenthesizedExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:20356:1: rule__XParenthesizedExpression__Group__2__Impl : ( ')' ) ;
+    public final void rule__XParenthesizedExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20360:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:20361:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:20361:1: ( ')' )
+            // InternalEntityMockDSL.g:20362:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XParenthesizedExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__0"
+    // InternalEntityMockDSL.g:20372:1: rule__XIfExpression__Group__0 : rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 ;
+    public final void rule__XIfExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20376:1: ( rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 )
+            // InternalEntityMockDSL.g:20377:2: rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1
+            {
+            pushFollow(FOLLOW_149);
+            rule__XIfExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__0"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:20384:1: rule__XIfExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XIfExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20388:1: ( ( () ) )
+            // InternalEntityMockDSL.g:20389:1: ( () )
+            {
+            // InternalEntityMockDSL.g:20389:1: ( () )
+            // InternalEntityMockDSL.g:20390:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:20391:2: ()
+            // InternalEntityMockDSL.g:20391:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__1"
+    // InternalEntityMockDSL.g:20399:1: rule__XIfExpression__Group__1 : rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 ;
+    public final void rule__XIfExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20403:1: ( rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 )
+            // InternalEntityMockDSL.g:20404:2: rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XIfExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__1"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:20411:1: rule__XIfExpression__Group__1__Impl : ( 'if' ) ;
+    public final void rule__XIfExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20415:1: ( ( 'if' ) )
+            // InternalEntityMockDSL.g:20416:1: ( 'if' )
+            {
+            // InternalEntityMockDSL.g:20416:1: ( 'if' )
+            // InternalEntityMockDSL.g:20417:2: 'if'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); 
+            }
+            match(input,127,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__2"
+    // InternalEntityMockDSL.g:20426:1: rule__XIfExpression__Group__2 : rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 ;
+    public final void rule__XIfExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20430:1: ( rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 )
+            // InternalEntityMockDSL.g:20431:2: rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3
+            {
+            pushFollow(FOLLOW_106);
+            rule__XIfExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__2"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:20438:1: rule__XIfExpression__Group__2__Impl : ( '(' ) ;
+    public final void rule__XIfExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20442:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:20443:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:20443:1: ( '(' )
+            // InternalEntityMockDSL.g:20444:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__3"
+    // InternalEntityMockDSL.g:20453:1: rule__XIfExpression__Group__3 : rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 ;
+    public final void rule__XIfExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20457:1: ( rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 )
+            // InternalEntityMockDSL.g:20458:2: rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4
+            {
+            pushFollow(FOLLOW_63);
+            rule__XIfExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__3"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:20465:1: rule__XIfExpression__Group__3__Impl : ( ( rule__XIfExpression__IfAssignment_3 ) ) ;
+    public final void rule__XIfExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20469:1: ( ( ( rule__XIfExpression__IfAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:20470:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:20470:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            // InternalEntityMockDSL.g:20471:2: ( rule__XIfExpression__IfAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:20472:2: ( rule__XIfExpression__IfAssignment_3 )
+            // InternalEntityMockDSL.g:20472:3: rule__XIfExpression__IfAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__IfAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__4"
+    // InternalEntityMockDSL.g:20480:1: rule__XIfExpression__Group__4 : rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 ;
+    public final void rule__XIfExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20484:1: ( rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 )
+            // InternalEntityMockDSL.g:20485:2: rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5
+            {
+            pushFollow(FOLLOW_106);
+            rule__XIfExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__4"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__4__Impl"
+    // InternalEntityMockDSL.g:20492:1: rule__XIfExpression__Group__4__Impl : ( ')' ) ;
+    public final void rule__XIfExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20496:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:20497:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:20497:1: ( ')' )
+            // InternalEntityMockDSL.g:20498:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__5"
+    // InternalEntityMockDSL.g:20507:1: rule__XIfExpression__Group__5 : rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 ;
+    public final void rule__XIfExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20511:1: ( rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 )
+            // InternalEntityMockDSL.g:20512:2: rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6
+            {
+            pushFollow(FOLLOW_150);
+            rule__XIfExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__5"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__5__Impl"
+    // InternalEntityMockDSL.g:20519:1: rule__XIfExpression__Group__5__Impl : ( ( rule__XIfExpression__ThenAssignment_5 ) ) ;
+    public final void rule__XIfExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20523:1: ( ( ( rule__XIfExpression__ThenAssignment_5 ) ) )
+            // InternalEntityMockDSL.g:20524:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            {
+            // InternalEntityMockDSL.g:20524:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            // InternalEntityMockDSL.g:20525:2: ( rule__XIfExpression__ThenAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:20526:2: ( rule__XIfExpression__ThenAssignment_5 )
+            // InternalEntityMockDSL.g:20526:3: rule__XIfExpression__ThenAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__ThenAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__6"
+    // InternalEntityMockDSL.g:20534:1: rule__XIfExpression__Group__6 : rule__XIfExpression__Group__6__Impl ;
+    public final void rule__XIfExpression__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20538:1: ( rule__XIfExpression__Group__6__Impl )
+            // InternalEntityMockDSL.g:20539:2: rule__XIfExpression__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__6"
+
+
+    // $ANTLR start "rule__XIfExpression__Group__6__Impl"
+    // InternalEntityMockDSL.g:20545:1: rule__XIfExpression__Group__6__Impl : ( ( rule__XIfExpression__Group_6__0 )? ) ;
+    public final void rule__XIfExpression__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20549:1: ( ( ( rule__XIfExpression__Group_6__0 )? ) )
+            // InternalEntityMockDSL.g:20550:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            {
+            // InternalEntityMockDSL.g:20550:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            // InternalEntityMockDSL.g:20551:2: ( rule__XIfExpression__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getGroup_6()); 
+            }
+            // InternalEntityMockDSL.g:20552:2: ( rule__XIfExpression__Group_6__0 )?
+            int alt166=2;
+            int LA166_0 = input.LA(1);
+
+            if ( (LA166_0==128) ) {
+                int LA166_1 = input.LA(2);
+
+                if ( (synpred233_InternalEntityMockDSL()) ) {
+                    alt166=1;
+                }
+            }
+            switch (alt166) {
+                case 1 :
+                    // InternalEntityMockDSL.g:20552:3: rule__XIfExpression__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XIfExpression__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group__6__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group_6__0"
+    // InternalEntityMockDSL.g:20561:1: rule__XIfExpression__Group_6__0 : rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 ;
+    public final void rule__XIfExpression__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20565:1: ( rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 )
+            // InternalEntityMockDSL.g:20566:2: rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XIfExpression__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group_6__0"
+
+
+    // $ANTLR start "rule__XIfExpression__Group_6__0__Impl"
+    // InternalEntityMockDSL.g:20573:1: rule__XIfExpression__Group_6__0__Impl : ( ( 'else' ) ) ;
+    public final void rule__XIfExpression__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20577:1: ( ( ( 'else' ) ) )
+            // InternalEntityMockDSL.g:20578:1: ( ( 'else' ) )
+            {
+            // InternalEntityMockDSL.g:20578:1: ( ( 'else' ) )
+            // InternalEntityMockDSL.g:20579:2: ( 'else' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); 
+            }
+            // InternalEntityMockDSL.g:20580:2: ( 'else' )
+            // InternalEntityMockDSL.g:20580:3: 'else'
+            {
+            match(input,128,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__XIfExpression__Group_6__1"
+    // InternalEntityMockDSL.g:20588:1: rule__XIfExpression__Group_6__1 : rule__XIfExpression__Group_6__1__Impl ;
+    public final void rule__XIfExpression__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20592:1: ( rule__XIfExpression__Group_6__1__Impl )
+            // InternalEntityMockDSL.g:20593:2: rule__XIfExpression__Group_6__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group_6__1"
+
+
+    // $ANTLR start "rule__XIfExpression__Group_6__1__Impl"
+    // InternalEntityMockDSL.g:20599:1: rule__XIfExpression__Group_6__1__Impl : ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) ;
+    public final void rule__XIfExpression__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20603:1: ( ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) )
+            // InternalEntityMockDSL.g:20604:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            {
+            // InternalEntityMockDSL.g:20604:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            // InternalEntityMockDSL.g:20605:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); 
+            }
+            // InternalEntityMockDSL.g:20606:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            // InternalEntityMockDSL.g:20606:3: rule__XIfExpression__ElseAssignment_6_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XIfExpression__ElseAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__0"
+    // InternalEntityMockDSL.g:20615:1: rule__XSwitchExpression__Group__0 : rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 ;
+    public final void rule__XSwitchExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20619:1: ( rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 )
+            // InternalEntityMockDSL.g:20620:2: rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1
+            {
+            pushFollow(FOLLOW_151);
+            rule__XSwitchExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:20627:1: rule__XSwitchExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XSwitchExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20631:1: ( ( () ) )
+            // InternalEntityMockDSL.g:20632:1: ( () )
+            {
+            // InternalEntityMockDSL.g:20632:1: ( () )
+            // InternalEntityMockDSL.g:20633:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:20634:2: ()
+            // InternalEntityMockDSL.g:20634:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__1"
+    // InternalEntityMockDSL.g:20642:1: rule__XSwitchExpression__Group__1 : rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 ;
+    public final void rule__XSwitchExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20646:1: ( rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 )
+            // InternalEntityMockDSL.g:20647:2: rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2
+            {
+            pushFollow(FOLLOW_152);
+            rule__XSwitchExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:20654:1: rule__XSwitchExpression__Group__1__Impl : ( 'switch' ) ;
+    public final void rule__XSwitchExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20658:1: ( ( 'switch' ) )
+            // InternalEntityMockDSL.g:20659:1: ( 'switch' )
+            {
+            // InternalEntityMockDSL.g:20659:1: ( 'switch' )
+            // InternalEntityMockDSL.g:20660:2: 'switch'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); 
+            }
+            match(input,129,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__2"
+    // InternalEntityMockDSL.g:20669:1: rule__XSwitchExpression__Group__2 : rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 ;
+    public final void rule__XSwitchExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20673:1: ( rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 )
+            // InternalEntityMockDSL.g:20674:2: rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3
+            {
+            pushFollow(FOLLOW_8);
+            rule__XSwitchExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__2"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:20681:1: rule__XSwitchExpression__Group__2__Impl : ( ( rule__XSwitchExpression__Alternatives_2 ) ) ;
+    public final void rule__XSwitchExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20685:1: ( ( ( rule__XSwitchExpression__Alternatives_2 ) ) )
+            // InternalEntityMockDSL.g:20686:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            {
+            // InternalEntityMockDSL.g:20686:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            // InternalEntityMockDSL.g:20687:2: ( rule__XSwitchExpression__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); 
+            }
+            // InternalEntityMockDSL.g:20688:2: ( rule__XSwitchExpression__Alternatives_2 )
+            // InternalEntityMockDSL.g:20688:3: rule__XSwitchExpression__Alternatives_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__3"
+    // InternalEntityMockDSL.g:20696:1: rule__XSwitchExpression__Group__3 : rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 ;
+    public final void rule__XSwitchExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20700:1: ( rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 )
+            // InternalEntityMockDSL.g:20701:2: rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4
+            {
+            pushFollow(FOLLOW_153);
+            rule__XSwitchExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__3"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:20708:1: rule__XSwitchExpression__Group__3__Impl : ( '{' ) ;
+    public final void rule__XSwitchExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20712:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:20713:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:20713:1: ( '{' )
+            // InternalEntityMockDSL.g:20714:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__4"
+    // InternalEntityMockDSL.g:20723:1: rule__XSwitchExpression__Group__4 : rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 ;
+    public final void rule__XSwitchExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20727:1: ( rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 )
+            // InternalEntityMockDSL.g:20728:2: rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5
+            {
+            pushFollow(FOLLOW_153);
+            rule__XSwitchExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__4"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__4__Impl"
+    // InternalEntityMockDSL.g:20735:1: rule__XSwitchExpression__Group__4__Impl : ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) ;
+    public final void rule__XSwitchExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20739:1: ( ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) )
+            // InternalEntityMockDSL.g:20740:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            {
+            // InternalEntityMockDSL.g:20740:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            // InternalEntityMockDSL.g:20741:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:20742:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            loop167:
+            do {
+                int alt167=2;
+                int LA167_0 = input.LA(1);
+
+                if ( (LA167_0==RULE_ID||LA167_0==32||LA167_0==68||LA167_0==70||LA167_0==130||LA167_0==132) ) {
+                    alt167=1;
+                }
+
+
+                switch (alt167) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:20742:3: rule__XSwitchExpression__CasesAssignment_4
+            	    {
+            	    pushFollow(FOLLOW_154);
+            	    rule__XSwitchExpression__CasesAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop167;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__5"
+    // InternalEntityMockDSL.g:20750:1: rule__XSwitchExpression__Group__5 : rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 ;
+    public final void rule__XSwitchExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20754:1: ( rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 )
+            // InternalEntityMockDSL.g:20755:2: rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6
+            {
+            pushFollow(FOLLOW_153);
+            rule__XSwitchExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__5"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__5__Impl"
+    // InternalEntityMockDSL.g:20762:1: rule__XSwitchExpression__Group__5__Impl : ( ( rule__XSwitchExpression__Group_5__0 )? ) ;
+    public final void rule__XSwitchExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20766:1: ( ( ( rule__XSwitchExpression__Group_5__0 )? ) )
+            // InternalEntityMockDSL.g:20767:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            {
+            // InternalEntityMockDSL.g:20767:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            // InternalEntityMockDSL.g:20768:2: ( rule__XSwitchExpression__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); 
+            }
+            // InternalEntityMockDSL.g:20769:2: ( rule__XSwitchExpression__Group_5__0 )?
+            int alt168=2;
+            int LA168_0 = input.LA(1);
+
+            if ( (LA168_0==131) ) {
+                alt168=1;
+            }
+            switch (alt168) {
+                case 1 :
+                    // InternalEntityMockDSL.g:20769:3: rule__XSwitchExpression__Group_5__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XSwitchExpression__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__6"
+    // InternalEntityMockDSL.g:20777:1: rule__XSwitchExpression__Group__6 : rule__XSwitchExpression__Group__6__Impl ;
+    public final void rule__XSwitchExpression__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20781:1: ( rule__XSwitchExpression__Group__6__Impl )
+            // InternalEntityMockDSL.g:20782:2: rule__XSwitchExpression__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__6"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group__6__Impl"
+    // InternalEntityMockDSL.g:20788:1: rule__XSwitchExpression__Group__6__Impl : ( '}' ) ;
+    public final void rule__XSwitchExpression__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20792:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:20793:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:20793:1: ( '}' )
+            // InternalEntityMockDSL.g:20794:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group__6__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__0"
+    // InternalEntityMockDSL.g:20804:1: rule__XSwitchExpression__Group_2_0__0 : rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 ;
+    public final void rule__XSwitchExpression__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20808:1: ( rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 )
+            // InternalEntityMockDSL.g:20809:2: rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XSwitchExpression__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__0__Impl"
+    // InternalEntityMockDSL.g:20816:1: rule__XSwitchExpression__Group_2_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20820:1: ( ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:20821:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:20821:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            // InternalEntityMockDSL.g:20822:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); 
+            }
+            // InternalEntityMockDSL.g:20823:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            // InternalEntityMockDSL.g:20823:3: rule__XSwitchExpression__Group_2_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__1"
+    // InternalEntityMockDSL.g:20831:1: rule__XSwitchExpression__Group_2_0__1 : rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 ;
+    public final void rule__XSwitchExpression__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20835:1: ( rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 )
+            // InternalEntityMockDSL.g:20836:2: rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2
+            {
+            pushFollow(FOLLOW_63);
+            rule__XSwitchExpression__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__1__Impl"
+    // InternalEntityMockDSL.g:20843:1: rule__XSwitchExpression__Group_2_0__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20847:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) )
+            // InternalEntityMockDSL.g:20848:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:20848:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            // InternalEntityMockDSL.g:20849:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); 
+            }
+            // InternalEntityMockDSL.g:20850:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            // InternalEntityMockDSL.g:20850:3: rule__XSwitchExpression__SwitchAssignment_2_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__SwitchAssignment_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__2"
+    // InternalEntityMockDSL.g:20858:1: rule__XSwitchExpression__Group_2_0__2 : rule__XSwitchExpression__Group_2_0__2__Impl ;
+    public final void rule__XSwitchExpression__Group_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20862:1: ( rule__XSwitchExpression__Group_2_0__2__Impl )
+            // InternalEntityMockDSL.g:20863:2: rule__XSwitchExpression__Group_2_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__2"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0__2__Impl"
+    // InternalEntityMockDSL.g:20869:1: rule__XSwitchExpression__Group_2_0__2__Impl : ( ')' ) ;
+    public final void rule__XSwitchExpression__Group_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20873:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:20874:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:20874:1: ( ')' )
+            // InternalEntityMockDSL.g:20875:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0"
+    // InternalEntityMockDSL.g:20885:1: rule__XSwitchExpression__Group_2_0_0__0 : rule__XSwitchExpression__Group_2_0_0__0__Impl ;
+    public final void rule__XSwitchExpression__Group_2_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20889:1: ( rule__XSwitchExpression__Group_2_0_0__0__Impl )
+            // InternalEntityMockDSL.g:20890:2: rule__XSwitchExpression__Group_2_0_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0__Impl"
+    // InternalEntityMockDSL.g:20896:1: rule__XSwitchExpression__Group_2_0_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20900:1: ( ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:20901:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:20901:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            // InternalEntityMockDSL.g:20902:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:20903:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            // InternalEntityMockDSL.g:20903:3: rule__XSwitchExpression__Group_2_0_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0"
+    // InternalEntityMockDSL.g:20912:1: rule__XSwitchExpression__Group_2_0_0_0__0 : rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20916:1: ( rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 )
+            // InternalEntityMockDSL.g:20917:2: rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XSwitchExpression__Group_2_0_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0__Impl"
+    // InternalEntityMockDSL.g:20924:1: rule__XSwitchExpression__Group_2_0_0_0__0__Impl : ( '(' ) ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20928:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:20929:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:20929:1: ( '(' )
+            // InternalEntityMockDSL.g:20930:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1"
+    // InternalEntityMockDSL.g:20939:1: rule__XSwitchExpression__Group_2_0_0_0__1 : rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20943:1: ( rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 )
+            // InternalEntityMockDSL.g:20944:2: rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2
+            {
+            pushFollow(FOLLOW_155);
+            rule__XSwitchExpression__Group_2_0_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1__Impl"
+    // InternalEntityMockDSL.g:20951:1: rule__XSwitchExpression__Group_2_0_0_0__1__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20955:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:20956:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:20956:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            // InternalEntityMockDSL.g:20957:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:20958:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            // InternalEntityMockDSL.g:20958:3: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2"
+    // InternalEntityMockDSL.g:20966:1: rule__XSwitchExpression__Group_2_0_0_0__2 : rule__XSwitchExpression__Group_2_0_0_0__2__Impl ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20970:1: ( rule__XSwitchExpression__Group_2_0_0_0__2__Impl )
+            // InternalEntityMockDSL.g:20971:2: rule__XSwitchExpression__Group_2_0_0_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_0_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__2"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2__Impl"
+    // InternalEntityMockDSL.g:20977:1: rule__XSwitchExpression__Group_2_0_0_0__2__Impl : ( ':' ) ;
+    public final void rule__XSwitchExpression__Group_2_0_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20981:1: ( ( ':' ) )
+            // InternalEntityMockDSL.g:20982:1: ( ':' )
+            {
+            // InternalEntityMockDSL.g:20982:1: ( ':' )
+            // InternalEntityMockDSL.g:20983:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); 
+            }
+            match(input,130,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_0_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1__0"
+    // InternalEntityMockDSL.g:20993:1: rule__XSwitchExpression__Group_2_1__0 : rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 ;
+    public final void rule__XSwitchExpression__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:20997:1: ( rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 )
+            // InternalEntityMockDSL.g:20998:2: rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1
+            {
+            pushFollow(FOLLOW_152);
+            rule__XSwitchExpression__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1__0__Impl"
+    // InternalEntityMockDSL.g:21005:1: rule__XSwitchExpression__Group_2_1__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) ;
+    public final void rule__XSwitchExpression__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21009:1: ( ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) )
+            // InternalEntityMockDSL.g:21010:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            {
+            // InternalEntityMockDSL.g:21010:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            // InternalEntityMockDSL.g:21011:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:21012:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            int alt169=2;
+            alt169 = dfa169.predict(input);
+            switch (alt169) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21012:3: rule__XSwitchExpression__Group_2_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XSwitchExpression__Group_2_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1__1"
+    // InternalEntityMockDSL.g:21020:1: rule__XSwitchExpression__Group_2_1__1 : rule__XSwitchExpression__Group_2_1__1__Impl ;
+    public final void rule__XSwitchExpression__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21024:1: ( rule__XSwitchExpression__Group_2_1__1__Impl )
+            // InternalEntityMockDSL.g:21025:2: rule__XSwitchExpression__Group_2_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1__1__Impl"
+    // InternalEntityMockDSL.g:21031:1: rule__XSwitchExpression__Group_2_1__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21035:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) )
+            // InternalEntityMockDSL.g:21036:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:21036:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            // InternalEntityMockDSL.g:21037:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); 
+            }
+            // InternalEntityMockDSL.g:21038:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            // InternalEntityMockDSL.g:21038:3: rule__XSwitchExpression__SwitchAssignment_2_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__SwitchAssignment_2_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0"
+    // InternalEntityMockDSL.g:21047:1: rule__XSwitchExpression__Group_2_1_0__0 : rule__XSwitchExpression__Group_2_1_0__0__Impl ;
+    public final void rule__XSwitchExpression__Group_2_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21051:1: ( rule__XSwitchExpression__Group_2_1_0__0__Impl )
+            // InternalEntityMockDSL.g:21052:2: rule__XSwitchExpression__Group_2_1_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0__Impl"
+    // InternalEntityMockDSL.g:21058:1: rule__XSwitchExpression__Group_2_1_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21062:1: ( ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:21063:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:21063:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            // InternalEntityMockDSL.g:21064:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:21065:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            // InternalEntityMockDSL.g:21065:3: rule__XSwitchExpression__Group_2_1_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0"
+    // InternalEntityMockDSL.g:21074:1: rule__XSwitchExpression__Group_2_1_0_0__0 : rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 ;
+    public final void rule__XSwitchExpression__Group_2_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21078:1: ( rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 )
+            // InternalEntityMockDSL.g:21079:2: rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1
+            {
+            pushFollow(FOLLOW_155);
+            rule__XSwitchExpression__Group_2_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0_0__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0__Impl"
+    // InternalEntityMockDSL.g:21086:1: rule__XSwitchExpression__Group_2_1_0_0__0__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) ;
+    public final void rule__XSwitchExpression__Group_2_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21090:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) )
+            // InternalEntityMockDSL.g:21091:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:21091:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            // InternalEntityMockDSL.g:21092:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:21093:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            // InternalEntityMockDSL.g:21093:3: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1"
+    // InternalEntityMockDSL.g:21101:1: rule__XSwitchExpression__Group_2_1_0_0__1 : rule__XSwitchExpression__Group_2_1_0_0__1__Impl ;
+    public final void rule__XSwitchExpression__Group_2_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21105:1: ( rule__XSwitchExpression__Group_2_1_0_0__1__Impl )
+            // InternalEntityMockDSL.g:21106:2: rule__XSwitchExpression__Group_2_1_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_2_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0_0__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1__Impl"
+    // InternalEntityMockDSL.g:21112:1: rule__XSwitchExpression__Group_2_1_0_0__1__Impl : ( ':' ) ;
+    public final void rule__XSwitchExpression__Group_2_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21116:1: ( ( ':' ) )
+            // InternalEntityMockDSL.g:21117:1: ( ':' )
+            {
+            // InternalEntityMockDSL.g:21117:1: ( ':' )
+            // InternalEntityMockDSL.g:21118:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); 
+            }
+            match(input,130,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_2_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__0"
+    // InternalEntityMockDSL.g:21128:1: rule__XSwitchExpression__Group_5__0 : rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 ;
+    public final void rule__XSwitchExpression__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21132:1: ( rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 )
+            // InternalEntityMockDSL.g:21133:2: rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1
+            {
+            pushFollow(FOLLOW_155);
+            rule__XSwitchExpression__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__0__Impl"
+    // InternalEntityMockDSL.g:21140:1: rule__XSwitchExpression__Group_5__0__Impl : ( 'default' ) ;
+    public final void rule__XSwitchExpression__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21144:1: ( ( 'default' ) )
+            // InternalEntityMockDSL.g:21145:1: ( 'default' )
+            {
+            // InternalEntityMockDSL.g:21145:1: ( 'default' )
+            // InternalEntityMockDSL.g:21146:2: 'default'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); 
+            }
+            match(input,131,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__1"
+    // InternalEntityMockDSL.g:21155:1: rule__XSwitchExpression__Group_5__1 : rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 ;
+    public final void rule__XSwitchExpression__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21159:1: ( rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 )
+            // InternalEntityMockDSL.g:21160:2: rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XSwitchExpression__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__1__Impl"
+    // InternalEntityMockDSL.g:21167:1: rule__XSwitchExpression__Group_5__1__Impl : ( ':' ) ;
+    public final void rule__XSwitchExpression__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21171:1: ( ( ':' ) )
+            // InternalEntityMockDSL.g:21172:1: ( ':' )
+            {
+            // InternalEntityMockDSL.g:21172:1: ( ':' )
+            // InternalEntityMockDSL.g:21173:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); 
+            }
+            match(input,130,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__2"
+    // InternalEntityMockDSL.g:21182:1: rule__XSwitchExpression__Group_5__2 : rule__XSwitchExpression__Group_5__2__Impl ;
+    public final void rule__XSwitchExpression__Group_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21186:1: ( rule__XSwitchExpression__Group_5__2__Impl )
+            // InternalEntityMockDSL.g:21187:2: rule__XSwitchExpression__Group_5__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__Group_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__2"
+
+
+    // $ANTLR start "rule__XSwitchExpression__Group_5__2__Impl"
+    // InternalEntityMockDSL.g:21193:1: rule__XSwitchExpression__Group_5__2__Impl : ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) ;
+    public final void rule__XSwitchExpression__Group_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21197:1: ( ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) )
+            // InternalEntityMockDSL.g:21198:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            {
+            // InternalEntityMockDSL.g:21198:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            // InternalEntityMockDSL.g:21199:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); 
+            }
+            // InternalEntityMockDSL.g:21200:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            // InternalEntityMockDSL.g:21200:3: rule__XSwitchExpression__DefaultAssignment_5_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSwitchExpression__DefaultAssignment_5_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__Group_5__2__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group__0"
+    // InternalEntityMockDSL.g:21209:1: rule__XCasePart__Group__0 : rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 ;
+    public final void rule__XCasePart__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21213:1: ( rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 )
+            // InternalEntityMockDSL.g:21214:2: rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1
+            {
+            pushFollow(FOLLOW_156);
+            rule__XCasePart__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__0"
+
+
+    // $ANTLR start "rule__XCasePart__Group__0__Impl"
+    // InternalEntityMockDSL.g:21221:1: rule__XCasePart__Group__0__Impl : ( () ) ;
+    public final void rule__XCasePart__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21225:1: ( ( () ) )
+            // InternalEntityMockDSL.g:21226:1: ( () )
+            {
+            // InternalEntityMockDSL.g:21226:1: ( () )
+            // InternalEntityMockDSL.g:21227:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); 
+            }
+            // InternalEntityMockDSL.g:21228:2: ()
+            // InternalEntityMockDSL.g:21228:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group__1"
+    // InternalEntityMockDSL.g:21236:1: rule__XCasePart__Group__1 : rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 ;
+    public final void rule__XCasePart__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21240:1: ( rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 )
+            // InternalEntityMockDSL.g:21241:2: rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2
+            {
+            pushFollow(FOLLOW_156);
+            rule__XCasePart__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__1"
+
+
+    // $ANTLR start "rule__XCasePart__Group__1__Impl"
+    // InternalEntityMockDSL.g:21248:1: rule__XCasePart__Group__1__Impl : ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) ;
+    public final void rule__XCasePart__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21252:1: ( ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) )
+            // InternalEntityMockDSL.g:21253:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            {
+            // InternalEntityMockDSL.g:21253:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            // InternalEntityMockDSL.g:21254:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:21255:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            int alt170=2;
+            int LA170_0 = input.LA(1);
+
+            if ( (LA170_0==RULE_ID||LA170_0==32||LA170_0==68) ) {
+                alt170=1;
+            }
+            switch (alt170) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21255:3: rule__XCasePart__TypeGuardAssignment_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XCasePart__TypeGuardAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group__2"
+    // InternalEntityMockDSL.g:21263:1: rule__XCasePart__Group__2 : rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 ;
+    public final void rule__XCasePart__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21267:1: ( rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 )
+            // InternalEntityMockDSL.g:21268:2: rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3
+            {
+            pushFollow(FOLLOW_156);
+            rule__XCasePart__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__2"
+
+
+    // $ANTLR start "rule__XCasePart__Group__2__Impl"
+    // InternalEntityMockDSL.g:21275:1: rule__XCasePart__Group__2__Impl : ( ( rule__XCasePart__Group_2__0 )? ) ;
+    public final void rule__XCasePart__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21279:1: ( ( ( rule__XCasePart__Group_2__0 )? ) )
+            // InternalEntityMockDSL.g:21280:1: ( ( rule__XCasePart__Group_2__0 )? )
+            {
+            // InternalEntityMockDSL.g:21280:1: ( ( rule__XCasePart__Group_2__0 )? )
+            // InternalEntityMockDSL.g:21281:2: ( rule__XCasePart__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:21282:2: ( rule__XCasePart__Group_2__0 )?
+            int alt171=2;
+            int LA171_0 = input.LA(1);
+
+            if ( (LA171_0==132) ) {
+                alt171=1;
+            }
+            switch (alt171) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21282:3: rule__XCasePart__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XCasePart__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group__3"
+    // InternalEntityMockDSL.g:21290:1: rule__XCasePart__Group__3 : rule__XCasePart__Group__3__Impl ;
+    public final void rule__XCasePart__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21294:1: ( rule__XCasePart__Group__3__Impl )
+            // InternalEntityMockDSL.g:21295:2: rule__XCasePart__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__3"
+
+
+    // $ANTLR start "rule__XCasePart__Group__3__Impl"
+    // InternalEntityMockDSL.g:21301:1: rule__XCasePart__Group__3__Impl : ( ( rule__XCasePart__Alternatives_3 ) ) ;
+    public final void rule__XCasePart__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21305:1: ( ( ( rule__XCasePart__Alternatives_3 ) ) )
+            // InternalEntityMockDSL.g:21306:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            {
+            // InternalEntityMockDSL.g:21306:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            // InternalEntityMockDSL.g:21307:2: ( rule__XCasePart__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getAlternatives_3()); 
+            }
+            // InternalEntityMockDSL.g:21308:2: ( rule__XCasePart__Alternatives_3 )
+            // InternalEntityMockDSL.g:21308:3: rule__XCasePart__Alternatives_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group_2__0"
+    // InternalEntityMockDSL.g:21317:1: rule__XCasePart__Group_2__0 : rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 ;
+    public final void rule__XCasePart__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21321:1: ( rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 )
+            // InternalEntityMockDSL.g:21322:2: rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XCasePart__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_2__0"
+
+
+    // $ANTLR start "rule__XCasePart__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:21329:1: rule__XCasePart__Group_2__0__Impl : ( 'case' ) ;
+    public final void rule__XCasePart__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21333:1: ( ( 'case' ) )
+            // InternalEntityMockDSL.g:21334:1: ( 'case' )
+            {
+            // InternalEntityMockDSL.g:21334:1: ( 'case' )
+            // InternalEntityMockDSL.g:21335:2: 'case'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); 
+            }
+            match(input,132,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group_2__1"
+    // InternalEntityMockDSL.g:21344:1: rule__XCasePart__Group_2__1 : rule__XCasePart__Group_2__1__Impl ;
+    public final void rule__XCasePart__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21348:1: ( rule__XCasePart__Group_2__1__Impl )
+            // InternalEntityMockDSL.g:21349:2: rule__XCasePart__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_2__1"
+
+
+    // $ANTLR start "rule__XCasePart__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:21355:1: rule__XCasePart__Group_2__1__Impl : ( ( rule__XCasePart__CaseAssignment_2_1 ) ) ;
+    public final void rule__XCasePart__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21359:1: ( ( ( rule__XCasePart__CaseAssignment_2_1 ) ) )
+            // InternalEntityMockDSL.g:21360:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:21360:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            // InternalEntityMockDSL.g:21361:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); 
+            }
+            // InternalEntityMockDSL.g:21362:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            // InternalEntityMockDSL.g:21362:3: rule__XCasePart__CaseAssignment_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__CaseAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group_3_0__0"
+    // InternalEntityMockDSL.g:21371:1: rule__XCasePart__Group_3_0__0 : rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 ;
+    public final void rule__XCasePart__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21375:1: ( rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 )
+            // InternalEntityMockDSL.g:21376:2: rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XCasePart__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_3_0__0"
+
+
+    // $ANTLR start "rule__XCasePart__Group_3_0__0__Impl"
+    // InternalEntityMockDSL.g:21383:1: rule__XCasePart__Group_3_0__0__Impl : ( ':' ) ;
+    public final void rule__XCasePart__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21387:1: ( ( ':' ) )
+            // InternalEntityMockDSL.g:21388:1: ( ':' )
+            {
+            // InternalEntityMockDSL.g:21388:1: ( ':' )
+            // InternalEntityMockDSL.g:21389:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); 
+            }
+            match(input,130,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__XCasePart__Group_3_0__1"
+    // InternalEntityMockDSL.g:21398:1: rule__XCasePart__Group_3_0__1 : rule__XCasePart__Group_3_0__1__Impl ;
+    public final void rule__XCasePart__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21402:1: ( rule__XCasePart__Group_3_0__1__Impl )
+            // InternalEntityMockDSL.g:21403:2: rule__XCasePart__Group_3_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_3_0__1"
+
+
+    // $ANTLR start "rule__XCasePart__Group_3_0__1__Impl"
+    // InternalEntityMockDSL.g:21409:1: rule__XCasePart__Group_3_0__1__Impl : ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) ;
+    public final void rule__XCasePart__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21413:1: ( ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) )
+            // InternalEntityMockDSL.g:21414:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:21414:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            // InternalEntityMockDSL.g:21415:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); 
+            }
+            // InternalEntityMockDSL.g:21416:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            // InternalEntityMockDSL.g:21416:3: rule__XCasePart__ThenAssignment_3_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCasePart__ThenAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__0"
+    // InternalEntityMockDSL.g:21425:1: rule__XForLoopExpression__Group__0 : rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 ;
+    public final void rule__XForLoopExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21429:1: ( rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 )
+            // InternalEntityMockDSL.g:21430:2: rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XForLoopExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__0"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:21437:1: rule__XForLoopExpression__Group__0__Impl : ( ( rule__XForLoopExpression__Group_0__0 ) ) ;
+    public final void rule__XForLoopExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21441:1: ( ( ( rule__XForLoopExpression__Group_0__0 ) ) )
+            // InternalEntityMockDSL.g:21442:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:21442:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            // InternalEntityMockDSL.g:21443:2: ( rule__XForLoopExpression__Group_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:21444:2: ( rule__XForLoopExpression__Group_0__0 )
+            // InternalEntityMockDSL.g:21444:3: rule__XForLoopExpression__Group_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__1"
+    // InternalEntityMockDSL.g:21452:1: rule__XForLoopExpression__Group__1 : rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 ;
+    public final void rule__XForLoopExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21456:1: ( rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 )
+            // InternalEntityMockDSL.g:21457:2: rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2
+            {
+            pushFollow(FOLLOW_63);
+            rule__XForLoopExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__1"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:21464:1: rule__XForLoopExpression__Group__1__Impl : ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) ;
+    public final void rule__XForLoopExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21468:1: ( ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:21469:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:21469:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            // InternalEntityMockDSL.g:21470:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:21471:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            // InternalEntityMockDSL.g:21471:3: rule__XForLoopExpression__ForExpressionAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__ForExpressionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__2"
+    // InternalEntityMockDSL.g:21479:1: rule__XForLoopExpression__Group__2 : rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 ;
+    public final void rule__XForLoopExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21483:1: ( rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 )
+            // InternalEntityMockDSL.g:21484:2: rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3
+            {
+            pushFollow(FOLLOW_106);
+            rule__XForLoopExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__2"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:21491:1: rule__XForLoopExpression__Group__2__Impl : ( ')' ) ;
+    public final void rule__XForLoopExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21495:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:21496:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:21496:1: ( ')' )
+            // InternalEntityMockDSL.g:21497:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__3"
+    // InternalEntityMockDSL.g:21506:1: rule__XForLoopExpression__Group__3 : rule__XForLoopExpression__Group__3__Impl ;
+    public final void rule__XForLoopExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21510:1: ( rule__XForLoopExpression__Group__3__Impl )
+            // InternalEntityMockDSL.g:21511:2: rule__XForLoopExpression__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__3"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:21517:1: rule__XForLoopExpression__Group__3__Impl : ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) ;
+    public final void rule__XForLoopExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21521:1: ( ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:21522:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:21522:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            // InternalEntityMockDSL.g:21523:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:21524:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            // InternalEntityMockDSL.g:21524:3: rule__XForLoopExpression__EachExpressionAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__EachExpressionAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0__0"
+    // InternalEntityMockDSL.g:21533:1: rule__XForLoopExpression__Group_0__0 : rule__XForLoopExpression__Group_0__0__Impl ;
+    public final void rule__XForLoopExpression__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21537:1: ( rule__XForLoopExpression__Group_0__0__Impl )
+            // InternalEntityMockDSL.g:21538:2: rule__XForLoopExpression__Group_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0__0"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:21544:1: rule__XForLoopExpression__Group_0__0__Impl : ( ( rule__XForLoopExpression__Group_0_0__0 ) ) ;
+    public final void rule__XForLoopExpression__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21548:1: ( ( ( rule__XForLoopExpression__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:21549:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:21549:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:21550:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:21551:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            // InternalEntityMockDSL.g:21551:3: rule__XForLoopExpression__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__0"
+    // InternalEntityMockDSL.g:21560:1: rule__XForLoopExpression__Group_0_0__0 : rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 ;
+    public final void rule__XForLoopExpression__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21564:1: ( rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 )
+            // InternalEntityMockDSL.g:21565:2: rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1
+            {
+            pushFollow(FOLLOW_157);
+            rule__XForLoopExpression__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:21572:1: rule__XForLoopExpression__Group_0_0__0__Impl : ( () ) ;
+    public final void rule__XForLoopExpression__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21576:1: ( ( () ) )
+            // InternalEntityMockDSL.g:21577:1: ( () )
+            {
+            // InternalEntityMockDSL.g:21577:1: ( () )
+            // InternalEntityMockDSL.g:21578:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:21579:2: ()
+            // InternalEntityMockDSL.g:21579:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__1"
+    // InternalEntityMockDSL.g:21587:1: rule__XForLoopExpression__Group_0_0__1 : rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 ;
+    public final void rule__XForLoopExpression__Group_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21591:1: ( rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 )
+            // InternalEntityMockDSL.g:21592:2: rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XForLoopExpression__Group_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__1"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__1__Impl"
+    // InternalEntityMockDSL.g:21599:1: rule__XForLoopExpression__Group_0_0__1__Impl : ( 'for' ) ;
+    public final void rule__XForLoopExpression__Group_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21603:1: ( ( 'for' ) )
+            // InternalEntityMockDSL.g:21604:1: ( 'for' )
+            {
+            // InternalEntityMockDSL.g:21604:1: ( 'for' )
+            // InternalEntityMockDSL.g:21605:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); 
+            }
+            match(input,133,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__2"
+    // InternalEntityMockDSL.g:21614:1: rule__XForLoopExpression__Group_0_0__2 : rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 ;
+    public final void rule__XForLoopExpression__Group_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21618:1: ( rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 )
+            // InternalEntityMockDSL.g:21619:2: rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3
+            {
+            pushFollow(FOLLOW_50);
+            rule__XForLoopExpression__Group_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__2"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__2__Impl"
+    // InternalEntityMockDSL.g:21626:1: rule__XForLoopExpression__Group_0_0__2__Impl : ( '(' ) ;
+    public final void rule__XForLoopExpression__Group_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21630:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:21631:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:21631:1: ( '(' )
+            // InternalEntityMockDSL.g:21632:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__3"
+    // InternalEntityMockDSL.g:21641:1: rule__XForLoopExpression__Group_0_0__3 : rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 ;
+    public final void rule__XForLoopExpression__Group_0_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21645:1: ( rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 )
+            // InternalEntityMockDSL.g:21646:2: rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4
+            {
+            pushFollow(FOLLOW_155);
+            rule__XForLoopExpression__Group_0_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__3"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__3__Impl"
+    // InternalEntityMockDSL.g:21653:1: rule__XForLoopExpression__Group_0_0__3__Impl : ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) ;
+    public final void rule__XForLoopExpression__Group_0_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21657:1: ( ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) )
+            // InternalEntityMockDSL.g:21658:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            {
+            // InternalEntityMockDSL.g:21658:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            // InternalEntityMockDSL.g:21659:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); 
+            }
+            // InternalEntityMockDSL.g:21660:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            // InternalEntityMockDSL.g:21660:3: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__DeclaredParamAssignment_0_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__3__Impl"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__4"
+    // InternalEntityMockDSL.g:21668:1: rule__XForLoopExpression__Group_0_0__4 : rule__XForLoopExpression__Group_0_0__4__Impl ;
+    public final void rule__XForLoopExpression__Group_0_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21672:1: ( rule__XForLoopExpression__Group_0_0__4__Impl )
+            // InternalEntityMockDSL.g:21673:2: rule__XForLoopExpression__Group_0_0__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XForLoopExpression__Group_0_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__4"
+
+
+    // $ANTLR start "rule__XForLoopExpression__Group_0_0__4__Impl"
+    // InternalEntityMockDSL.g:21679:1: rule__XForLoopExpression__Group_0_0__4__Impl : ( ':' ) ;
+    public final void rule__XForLoopExpression__Group_0_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21683:1: ( ( ':' ) )
+            // InternalEntityMockDSL.g:21684:1: ( ':' )
+            {
+            // InternalEntityMockDSL.g:21684:1: ( ':' )
+            // InternalEntityMockDSL.g:21685:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); 
+            }
+            match(input,130,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__Group_0_0__4__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__0"
+    // InternalEntityMockDSL.g:21695:1: rule__XBasicForLoopExpression__Group__0 : rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 ;
+    public final void rule__XBasicForLoopExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21699:1: ( rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 )
+            // InternalEntityMockDSL.g:21700:2: rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1
+            {
+            pushFollow(FOLLOW_157);
+            rule__XBasicForLoopExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:21707:1: rule__XBasicForLoopExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XBasicForLoopExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21711:1: ( ( () ) )
+            // InternalEntityMockDSL.g:21712:1: ( () )
+            {
+            // InternalEntityMockDSL.g:21712:1: ( () )
+            // InternalEntityMockDSL.g:21713:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:21714:2: ()
+            // InternalEntityMockDSL.g:21714:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__1"
+    // InternalEntityMockDSL.g:21722:1: rule__XBasicForLoopExpression__Group__1 : rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 ;
+    public final void rule__XBasicForLoopExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21726:1: ( rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 )
+            // InternalEntityMockDSL.g:21727:2: rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XBasicForLoopExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:21734:1: rule__XBasicForLoopExpression__Group__1__Impl : ( 'for' ) ;
+    public final void rule__XBasicForLoopExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21738:1: ( ( 'for' ) )
+            // InternalEntityMockDSL.g:21739:1: ( 'for' )
+            {
+            // InternalEntityMockDSL.g:21739:1: ( 'for' )
+            // InternalEntityMockDSL.g:21740:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); 
+            }
+            match(input,133,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__2"
+    // InternalEntityMockDSL.g:21749:1: rule__XBasicForLoopExpression__Group__2 : rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 ;
+    public final void rule__XBasicForLoopExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21753:1: ( rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 )
+            // InternalEntityMockDSL.g:21754:2: rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3
+            {
+            pushFollow(FOLLOW_158);
+            rule__XBasicForLoopExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__2"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:21761:1: rule__XBasicForLoopExpression__Group__2__Impl : ( '(' ) ;
+    public final void rule__XBasicForLoopExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21765:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:21766:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:21766:1: ( '(' )
+            // InternalEntityMockDSL.g:21767:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__3"
+    // InternalEntityMockDSL.g:21776:1: rule__XBasicForLoopExpression__Group__3 : rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 ;
+    public final void rule__XBasicForLoopExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21780:1: ( rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 )
+            // InternalEntityMockDSL.g:21781:2: rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4
+            {
+            pushFollow(FOLLOW_158);
+            rule__XBasicForLoopExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__3"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:21788:1: rule__XBasicForLoopExpression__Group__3__Impl : ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) ;
+    public final void rule__XBasicForLoopExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21792:1: ( ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:21793:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:21793:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            // InternalEntityMockDSL.g:21794:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:21795:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            int alt172=2;
+            int LA172_0 = input.LA(1);
+
+            if ( ((LA172_0>=RULE_ID && LA172_0<=RULE_STRING)||LA172_0==28||(LA172_0>=35 && LA172_0<=36)||LA172_0==41||(LA172_0>=45 && LA172_0<=51)||LA172_0==57||LA172_0==68||LA172_0==73||(LA172_0>=124 && LA172_0<=125)||LA172_0==127||LA172_0==129||(LA172_0>=133 && LA172_0<=141)||LA172_0==143||LA172_0==156) ) {
+                alt172=1;
+            }
+            switch (alt172) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21795:3: rule__XBasicForLoopExpression__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XBasicForLoopExpression__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__4"
+    // InternalEntityMockDSL.g:21803:1: rule__XBasicForLoopExpression__Group__4 : rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 ;
+    public final void rule__XBasicForLoopExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21807:1: ( rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 )
+            // InternalEntityMockDSL.g:21808:2: rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5
+            {
+            pushFollow(FOLLOW_159);
+            rule__XBasicForLoopExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__4"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__4__Impl"
+    // InternalEntityMockDSL.g:21815:1: rule__XBasicForLoopExpression__Group__4__Impl : ( ';' ) ;
+    public final void rule__XBasicForLoopExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21819:1: ( ( ';' ) )
+            // InternalEntityMockDSL.g:21820:1: ( ';' )
+            {
+            // InternalEntityMockDSL.g:21820:1: ( ';' )
+            // InternalEntityMockDSL.g:21821:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); 
+            }
+            match(input,121,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__5"
+    // InternalEntityMockDSL.g:21830:1: rule__XBasicForLoopExpression__Group__5 : rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 ;
+    public final void rule__XBasicForLoopExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21834:1: ( rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 )
+            // InternalEntityMockDSL.g:21835:2: rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6
+            {
+            pushFollow(FOLLOW_159);
+            rule__XBasicForLoopExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__5"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__5__Impl"
+    // InternalEntityMockDSL.g:21842:1: rule__XBasicForLoopExpression__Group__5__Impl : ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) ;
+    public final void rule__XBasicForLoopExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21846:1: ( ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) )
+            // InternalEntityMockDSL.g:21847:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            {
+            // InternalEntityMockDSL.g:21847:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            // InternalEntityMockDSL.g:21848:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:21849:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            int alt173=2;
+            int LA173_0 = input.LA(1);
+
+            if ( ((LA173_0>=RULE_ID && LA173_0<=RULE_STRING)||LA173_0==28||(LA173_0>=35 && LA173_0<=36)||LA173_0==41||(LA173_0>=46 && LA173_0<=51)||LA173_0==57||LA173_0==68||(LA173_0>=124 && LA173_0<=125)||LA173_0==127||LA173_0==129||(LA173_0>=133 && LA173_0<=141)||LA173_0==143||LA173_0==156) ) {
+                alt173=1;
+            }
+            switch (alt173) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21849:3: rule__XBasicForLoopExpression__ExpressionAssignment_5
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XBasicForLoopExpression__ExpressionAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__6"
+    // InternalEntityMockDSL.g:21857:1: rule__XBasicForLoopExpression__Group__6 : rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 ;
+    public final void rule__XBasicForLoopExpression__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21861:1: ( rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 )
+            // InternalEntityMockDSL.g:21862:2: rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7
+            {
+            pushFollow(FOLLOW_105);
+            rule__XBasicForLoopExpression__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__6"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__6__Impl"
+    // InternalEntityMockDSL.g:21869:1: rule__XBasicForLoopExpression__Group__6__Impl : ( ';' ) ;
+    public final void rule__XBasicForLoopExpression__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21873:1: ( ( ';' ) )
+            // InternalEntityMockDSL.g:21874:1: ( ';' )
+            {
+            // InternalEntityMockDSL.g:21874:1: ( ';' )
+            // InternalEntityMockDSL.g:21875:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); 
+            }
+            match(input,121,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__6__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__7"
+    // InternalEntityMockDSL.g:21884:1: rule__XBasicForLoopExpression__Group__7 : rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 ;
+    public final void rule__XBasicForLoopExpression__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21888:1: ( rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 )
+            // InternalEntityMockDSL.g:21889:2: rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8
+            {
+            pushFollow(FOLLOW_105);
+            rule__XBasicForLoopExpression__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__7"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__7__Impl"
+    // InternalEntityMockDSL.g:21896:1: rule__XBasicForLoopExpression__Group__7__Impl : ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) ;
+    public final void rule__XBasicForLoopExpression__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21900:1: ( ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) )
+            // InternalEntityMockDSL.g:21901:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            {
+            // InternalEntityMockDSL.g:21901:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            // InternalEntityMockDSL.g:21902:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); 
+            }
+            // InternalEntityMockDSL.g:21903:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            int alt174=2;
+            int LA174_0 = input.LA(1);
+
+            if ( ((LA174_0>=RULE_ID && LA174_0<=RULE_STRING)||LA174_0==28||(LA174_0>=35 && LA174_0<=36)||LA174_0==41||(LA174_0>=46 && LA174_0<=51)||LA174_0==57||LA174_0==68||(LA174_0>=124 && LA174_0<=125)||LA174_0==127||LA174_0==129||(LA174_0>=133 && LA174_0<=141)||LA174_0==143||LA174_0==156) ) {
+                alt174=1;
+            }
+            switch (alt174) {
+                case 1 :
+                    // InternalEntityMockDSL.g:21903:3: rule__XBasicForLoopExpression__Group_7__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XBasicForLoopExpression__Group_7__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__7__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__8"
+    // InternalEntityMockDSL.g:21911:1: rule__XBasicForLoopExpression__Group__8 : rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 ;
+    public final void rule__XBasicForLoopExpression__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21915:1: ( rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 )
+            // InternalEntityMockDSL.g:21916:2: rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9
+            {
+            pushFollow(FOLLOW_106);
+            rule__XBasicForLoopExpression__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__8"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__8__Impl"
+    // InternalEntityMockDSL.g:21923:1: rule__XBasicForLoopExpression__Group__8__Impl : ( ')' ) ;
+    public final void rule__XBasicForLoopExpression__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21927:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:21928:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:21928:1: ( ')' )
+            // InternalEntityMockDSL.g:21929:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__8__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__9"
+    // InternalEntityMockDSL.g:21938:1: rule__XBasicForLoopExpression__Group__9 : rule__XBasicForLoopExpression__Group__9__Impl ;
+    public final void rule__XBasicForLoopExpression__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21942:1: ( rule__XBasicForLoopExpression__Group__9__Impl )
+            // InternalEntityMockDSL.g:21943:2: rule__XBasicForLoopExpression__Group__9__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__9"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group__9__Impl"
+    // InternalEntityMockDSL.g:21949:1: rule__XBasicForLoopExpression__Group__9__Impl : ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) ;
+    public final void rule__XBasicForLoopExpression__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21953:1: ( ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) )
+            // InternalEntityMockDSL.g:21954:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            {
+            // InternalEntityMockDSL.g:21954:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            // InternalEntityMockDSL.g:21955:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); 
+            }
+            // InternalEntityMockDSL.g:21956:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            // InternalEntityMockDSL.g:21956:3: rule__XBasicForLoopExpression__EachExpressionAssignment_9
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__EachExpressionAssignment_9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group__9__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0"
+    // InternalEntityMockDSL.g:21965:1: rule__XBasicForLoopExpression__Group_3__0 : rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 ;
+    public final void rule__XBasicForLoopExpression__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21969:1: ( rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 )
+            // InternalEntityMockDSL.g:21970:2: rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XBasicForLoopExpression__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3__0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:21977:1: rule__XBasicForLoopExpression__Group_3__0__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) ;
+    public final void rule__XBasicForLoopExpression__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21981:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:21982:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:21982:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:21983:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:21984:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            // InternalEntityMockDSL.g:21984:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1"
+    // InternalEntityMockDSL.g:21992:1: rule__XBasicForLoopExpression__Group_3__1 : rule__XBasicForLoopExpression__Group_3__1__Impl ;
+    public final void rule__XBasicForLoopExpression__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:21996:1: ( rule__XBasicForLoopExpression__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:21997:2: rule__XBasicForLoopExpression__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3__1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:22003:1: rule__XBasicForLoopExpression__Group_3__1__Impl : ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) ;
+    public final void rule__XBasicForLoopExpression__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22007:1: ( ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) )
+            // InternalEntityMockDSL.g:22008:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:22008:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            // InternalEntityMockDSL.g:22009:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); 
+            }
+            // InternalEntityMockDSL.g:22010:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            loop175:
+            do {
+                int alt175=2;
+                int LA175_0 = input.LA(1);
+
+                if ( (LA175_0==70) ) {
+                    alt175=1;
+                }
+
+
+                switch (alt175) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:22010:3: rule__XBasicForLoopExpression__Group_3_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XBasicForLoopExpression__Group_3_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop175;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0"
+    // InternalEntityMockDSL.g:22019:1: rule__XBasicForLoopExpression__Group_3_1__0 : rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 ;
+    public final void rule__XBasicForLoopExpression__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22023:1: ( rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 )
+            // InternalEntityMockDSL.g:22024:2: rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1
+            {
+            pushFollow(FOLLOW_160);
+            rule__XBasicForLoopExpression__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3_1__0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0__Impl"
+    // InternalEntityMockDSL.g:22031:1: rule__XBasicForLoopExpression__Group_3_1__0__Impl : ( ',' ) ;
+    public final void rule__XBasicForLoopExpression__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22035:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:22036:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:22036:1: ( ',' )
+            // InternalEntityMockDSL.g:22037:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1"
+    // InternalEntityMockDSL.g:22046:1: rule__XBasicForLoopExpression__Group_3_1__1 : rule__XBasicForLoopExpression__Group_3_1__1__Impl ;
+    public final void rule__XBasicForLoopExpression__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22050:1: ( rule__XBasicForLoopExpression__Group_3_1__1__Impl )
+            // InternalEntityMockDSL.g:22051:2: rule__XBasicForLoopExpression__Group_3_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3_1__1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1__Impl"
+    // InternalEntityMockDSL.g:22057:1: rule__XBasicForLoopExpression__Group_3_1__1__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) ;
+    public final void rule__XBasicForLoopExpression__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22061:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) )
+            // InternalEntityMockDSL.g:22062:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:22062:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            // InternalEntityMockDSL.g:22063:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); 
+            }
+            // InternalEntityMockDSL.g:22064:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            // InternalEntityMockDSL.g:22064:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0"
+    // InternalEntityMockDSL.g:22073:1: rule__XBasicForLoopExpression__Group_7__0 : rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 ;
+    public final void rule__XBasicForLoopExpression__Group_7__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22077:1: ( rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 )
+            // InternalEntityMockDSL.g:22078:2: rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XBasicForLoopExpression__Group_7__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_7__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7__0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0__Impl"
+    // InternalEntityMockDSL.g:22085:1: rule__XBasicForLoopExpression__Group_7__0__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) ;
+    public final void rule__XBasicForLoopExpression__Group_7__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22089:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) )
+            // InternalEntityMockDSL.g:22090:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            {
+            // InternalEntityMockDSL.g:22090:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            // InternalEntityMockDSL.g:22091:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); 
+            }
+            // InternalEntityMockDSL.g:22092:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            // InternalEntityMockDSL.g:22092:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7__0__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1"
+    // InternalEntityMockDSL.g:22100:1: rule__XBasicForLoopExpression__Group_7__1 : rule__XBasicForLoopExpression__Group_7__1__Impl ;
+    public final void rule__XBasicForLoopExpression__Group_7__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22104:1: ( rule__XBasicForLoopExpression__Group_7__1__Impl )
+            // InternalEntityMockDSL.g:22105:2: rule__XBasicForLoopExpression__Group_7__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_7__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7__1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1__Impl"
+    // InternalEntityMockDSL.g:22111:1: rule__XBasicForLoopExpression__Group_7__1__Impl : ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) ;
+    public final void rule__XBasicForLoopExpression__Group_7__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22115:1: ( ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) )
+            // InternalEntityMockDSL.g:22116:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:22116:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            // InternalEntityMockDSL.g:22117:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); 
+            }
+            // InternalEntityMockDSL.g:22118:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            loop176:
+            do {
+                int alt176=2;
+                int LA176_0 = input.LA(1);
+
+                if ( (LA176_0==70) ) {
+                    alt176=1;
+                }
+
+
+                switch (alt176) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:22118:3: rule__XBasicForLoopExpression__Group_7_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XBasicForLoopExpression__Group_7_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop176;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7__1__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0"
+    // InternalEntityMockDSL.g:22127:1: rule__XBasicForLoopExpression__Group_7_1__0 : rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 ;
+    public final void rule__XBasicForLoopExpression__Group_7_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22131:1: ( rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 )
+            // InternalEntityMockDSL.g:22132:2: rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XBasicForLoopExpression__Group_7_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_7_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7_1__0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0__Impl"
+    // InternalEntityMockDSL.g:22139:1: rule__XBasicForLoopExpression__Group_7_1__0__Impl : ( ',' ) ;
+    public final void rule__XBasicForLoopExpression__Group_7_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22143:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:22144:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:22144:1: ( ',' )
+            // InternalEntityMockDSL.g:22145:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7_1__0__Impl"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1"
+    // InternalEntityMockDSL.g:22154:1: rule__XBasicForLoopExpression__Group_7_1__1 : rule__XBasicForLoopExpression__Group_7_1__1__Impl ;
+    public final void rule__XBasicForLoopExpression__Group_7_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22158:1: ( rule__XBasicForLoopExpression__Group_7_1__1__Impl )
+            // InternalEntityMockDSL.g:22159:2: rule__XBasicForLoopExpression__Group_7_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__Group_7_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7_1__1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1__Impl"
+    // InternalEntityMockDSL.g:22165:1: rule__XBasicForLoopExpression__Group_7_1__1__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) ;
+    public final void rule__XBasicForLoopExpression__Group_7_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22169:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) )
+            // InternalEntityMockDSL.g:22170:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:22170:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            // InternalEntityMockDSL.g:22171:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); 
+            }
+            // InternalEntityMockDSL.g:22172:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            // InternalEntityMockDSL.g:22172:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__Group_7_1__1__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__0"
+    // InternalEntityMockDSL.g:22181:1: rule__XWhileExpression__Group__0 : rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 ;
+    public final void rule__XWhileExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22185:1: ( rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 )
+            // InternalEntityMockDSL.g:22186:2: rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1
+            {
+            pushFollow(FOLLOW_161);
+            rule__XWhileExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__0"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:22193:1: rule__XWhileExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XWhileExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22197:1: ( ( () ) )
+            // InternalEntityMockDSL.g:22198:1: ( () )
+            {
+            // InternalEntityMockDSL.g:22198:1: ( () )
+            // InternalEntityMockDSL.g:22199:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:22200:2: ()
+            // InternalEntityMockDSL.g:22200:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__1"
+    // InternalEntityMockDSL.g:22208:1: rule__XWhileExpression__Group__1 : rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 ;
+    public final void rule__XWhileExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22212:1: ( rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 )
+            // InternalEntityMockDSL.g:22213:2: rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XWhileExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__1"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:22220:1: rule__XWhileExpression__Group__1__Impl : ( 'while' ) ;
+    public final void rule__XWhileExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22224:1: ( ( 'while' ) )
+            // InternalEntityMockDSL.g:22225:1: ( 'while' )
+            {
+            // InternalEntityMockDSL.g:22225:1: ( 'while' )
+            // InternalEntityMockDSL.g:22226:2: 'while'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); 
+            }
+            match(input,134,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__2"
+    // InternalEntityMockDSL.g:22235:1: rule__XWhileExpression__Group__2 : rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 ;
+    public final void rule__XWhileExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22239:1: ( rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 )
+            // InternalEntityMockDSL.g:22240:2: rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3
+            {
+            pushFollow(FOLLOW_106);
+            rule__XWhileExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__2"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:22247:1: rule__XWhileExpression__Group__2__Impl : ( '(' ) ;
+    public final void rule__XWhileExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22251:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:22252:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:22252:1: ( '(' )
+            // InternalEntityMockDSL.g:22253:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__3"
+    // InternalEntityMockDSL.g:22262:1: rule__XWhileExpression__Group__3 : rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 ;
+    public final void rule__XWhileExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22266:1: ( rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 )
+            // InternalEntityMockDSL.g:22267:2: rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4
+            {
+            pushFollow(FOLLOW_63);
+            rule__XWhileExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__3"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:22274:1: rule__XWhileExpression__Group__3__Impl : ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) ;
+    public final void rule__XWhileExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22278:1: ( ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:22279:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:22279:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            // InternalEntityMockDSL.g:22280:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:22281:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            // InternalEntityMockDSL.g:22281:3: rule__XWhileExpression__PredicateAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__PredicateAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__4"
+    // InternalEntityMockDSL.g:22289:1: rule__XWhileExpression__Group__4 : rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 ;
+    public final void rule__XWhileExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22293:1: ( rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 )
+            // InternalEntityMockDSL.g:22294:2: rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5
+            {
+            pushFollow(FOLLOW_106);
+            rule__XWhileExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__4"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__4__Impl"
+    // InternalEntityMockDSL.g:22301:1: rule__XWhileExpression__Group__4__Impl : ( ')' ) ;
+    public final void rule__XWhileExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22305:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:22306:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:22306:1: ( ')' )
+            // InternalEntityMockDSL.g:22307:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__5"
+    // InternalEntityMockDSL.g:22316:1: rule__XWhileExpression__Group__5 : rule__XWhileExpression__Group__5__Impl ;
+    public final void rule__XWhileExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22320:1: ( rule__XWhileExpression__Group__5__Impl )
+            // InternalEntityMockDSL.g:22321:2: rule__XWhileExpression__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__5"
+
+
+    // $ANTLR start "rule__XWhileExpression__Group__5__Impl"
+    // InternalEntityMockDSL.g:22327:1: rule__XWhileExpression__Group__5__Impl : ( ( rule__XWhileExpression__BodyAssignment_5 ) ) ;
+    public final void rule__XWhileExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22331:1: ( ( ( rule__XWhileExpression__BodyAssignment_5 ) ) )
+            // InternalEntityMockDSL.g:22332:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            {
+            // InternalEntityMockDSL.g:22332:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            // InternalEntityMockDSL.g:22333:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:22334:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            // InternalEntityMockDSL.g:22334:3: rule__XWhileExpression__BodyAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__XWhileExpression__BodyAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__0"
+    // InternalEntityMockDSL.g:22343:1: rule__XDoWhileExpression__Group__0 : rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 ;
+    public final void rule__XDoWhileExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22347:1: ( rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 )
+            // InternalEntityMockDSL.g:22348:2: rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1
+            {
+            pushFollow(FOLLOW_162);
+            rule__XDoWhileExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__0"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:22355:1: rule__XDoWhileExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XDoWhileExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22359:1: ( ( () ) )
+            // InternalEntityMockDSL.g:22360:1: ( () )
+            {
+            // InternalEntityMockDSL.g:22360:1: ( () )
+            // InternalEntityMockDSL.g:22361:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:22362:2: ()
+            // InternalEntityMockDSL.g:22362:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__1"
+    // InternalEntityMockDSL.g:22370:1: rule__XDoWhileExpression__Group__1 : rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 ;
+    public final void rule__XDoWhileExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22374:1: ( rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 )
+            // InternalEntityMockDSL.g:22375:2: rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XDoWhileExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__1"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:22382:1: rule__XDoWhileExpression__Group__1__Impl : ( 'do' ) ;
+    public final void rule__XDoWhileExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22386:1: ( ( 'do' ) )
+            // InternalEntityMockDSL.g:22387:1: ( 'do' )
+            {
+            // InternalEntityMockDSL.g:22387:1: ( 'do' )
+            // InternalEntityMockDSL.g:22388:2: 'do'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); 
+            }
+            match(input,135,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__2"
+    // InternalEntityMockDSL.g:22397:1: rule__XDoWhileExpression__Group__2 : rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 ;
+    public final void rule__XDoWhileExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22401:1: ( rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 )
+            // InternalEntityMockDSL.g:22402:2: rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3
+            {
+            pushFollow(FOLLOW_161);
+            rule__XDoWhileExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__2"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:22409:1: rule__XDoWhileExpression__Group__2__Impl : ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) ;
+    public final void rule__XDoWhileExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22413:1: ( ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:22414:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:22414:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            // InternalEntityMockDSL.g:22415:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:22416:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            // InternalEntityMockDSL.g:22416:3: rule__XDoWhileExpression__BodyAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__BodyAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__3"
+    // InternalEntityMockDSL.g:22424:1: rule__XDoWhileExpression__Group__3 : rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 ;
+    public final void rule__XDoWhileExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22428:1: ( rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 )
+            // InternalEntityMockDSL.g:22429:2: rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4
+            {
+            pushFollow(FOLLOW_27);
+            rule__XDoWhileExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__3"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:22436:1: rule__XDoWhileExpression__Group__3__Impl : ( 'while' ) ;
+    public final void rule__XDoWhileExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22440:1: ( ( 'while' ) )
+            // InternalEntityMockDSL.g:22441:1: ( 'while' )
+            {
+            // InternalEntityMockDSL.g:22441:1: ( 'while' )
+            // InternalEntityMockDSL.g:22442:2: 'while'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); 
+            }
+            match(input,134,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__4"
+    // InternalEntityMockDSL.g:22451:1: rule__XDoWhileExpression__Group__4 : rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 ;
+    public final void rule__XDoWhileExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22455:1: ( rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 )
+            // InternalEntityMockDSL.g:22456:2: rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5
+            {
+            pushFollow(FOLLOW_106);
+            rule__XDoWhileExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__4"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__4__Impl"
+    // InternalEntityMockDSL.g:22463:1: rule__XDoWhileExpression__Group__4__Impl : ( '(' ) ;
+    public final void rule__XDoWhileExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22467:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:22468:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:22468:1: ( '(' )
+            // InternalEntityMockDSL.g:22469:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__5"
+    // InternalEntityMockDSL.g:22478:1: rule__XDoWhileExpression__Group__5 : rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 ;
+    public final void rule__XDoWhileExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22482:1: ( rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 )
+            // InternalEntityMockDSL.g:22483:2: rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6
+            {
+            pushFollow(FOLLOW_63);
+            rule__XDoWhileExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__5"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__5__Impl"
+    // InternalEntityMockDSL.g:22490:1: rule__XDoWhileExpression__Group__5__Impl : ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) ;
+    public final void rule__XDoWhileExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22494:1: ( ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) )
+            // InternalEntityMockDSL.g:22495:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            {
+            // InternalEntityMockDSL.g:22495:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            // InternalEntityMockDSL.g:22496:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:22497:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            // InternalEntityMockDSL.g:22497:3: rule__XDoWhileExpression__PredicateAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__PredicateAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__6"
+    // InternalEntityMockDSL.g:22505:1: rule__XDoWhileExpression__Group__6 : rule__XDoWhileExpression__Group__6__Impl ;
+    public final void rule__XDoWhileExpression__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22509:1: ( rule__XDoWhileExpression__Group__6__Impl )
+            // InternalEntityMockDSL.g:22510:2: rule__XDoWhileExpression__Group__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XDoWhileExpression__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__6"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__Group__6__Impl"
+    // InternalEntityMockDSL.g:22516:1: rule__XDoWhileExpression__Group__6__Impl : ( ')' ) ;
+    public final void rule__XDoWhileExpression__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22520:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:22521:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:22521:1: ( ')' )
+            // InternalEntityMockDSL.g:22522:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__Group__6__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__0"
+    // InternalEntityMockDSL.g:22532:1: rule__XBlockExpression__Group__0 : rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 ;
+    public final void rule__XBlockExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22536:1: ( rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 )
+            // InternalEntityMockDSL.g:22537:2: rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__XBlockExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__0"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:22544:1: rule__XBlockExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XBlockExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22548:1: ( ( () ) )
+            // InternalEntityMockDSL.g:22549:1: ( () )
+            {
+            // InternalEntityMockDSL.g:22549:1: ( () )
+            // InternalEntityMockDSL.g:22550:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:22551:2: ()
+            // InternalEntityMockDSL.g:22551:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__1"
+    // InternalEntityMockDSL.g:22559:1: rule__XBlockExpression__Group__1 : rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 ;
+    public final void rule__XBlockExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22563:1: ( rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 )
+            // InternalEntityMockDSL.g:22564:2: rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2
+            {
+            pushFollow(FOLLOW_163);
+            rule__XBlockExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__1"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:22571:1: rule__XBlockExpression__Group__1__Impl : ( '{' ) ;
+    public final void rule__XBlockExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22575:1: ( ( '{' ) )
+            // InternalEntityMockDSL.g:22576:1: ( '{' )
+            {
+            // InternalEntityMockDSL.g:22576:1: ( '{' )
+            // InternalEntityMockDSL.g:22577:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__2"
+    // InternalEntityMockDSL.g:22586:1: rule__XBlockExpression__Group__2 : rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 ;
+    public final void rule__XBlockExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22590:1: ( rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 )
+            // InternalEntityMockDSL.g:22591:2: rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3
+            {
+            pushFollow(FOLLOW_163);
+            rule__XBlockExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__2"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:22598:1: rule__XBlockExpression__Group__2__Impl : ( ( rule__XBlockExpression__Group_2__0 )* ) ;
+    public final void rule__XBlockExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22602:1: ( ( ( rule__XBlockExpression__Group_2__0 )* ) )
+            // InternalEntityMockDSL.g:22603:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:22603:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            // InternalEntityMockDSL.g:22604:2: ( rule__XBlockExpression__Group_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getGroup_2()); 
+            }
+            // InternalEntityMockDSL.g:22605:2: ( rule__XBlockExpression__Group_2__0 )*
+            loop177:
+            do {
+                int alt177=2;
+                int LA177_0 = input.LA(1);
+
+                if ( ((LA177_0>=RULE_ID && LA177_0<=RULE_STRING)||LA177_0==28||(LA177_0>=35 && LA177_0<=36)||LA177_0==41||(LA177_0>=45 && LA177_0<=51)||LA177_0==57||LA177_0==68||LA177_0==73||(LA177_0>=124 && LA177_0<=125)||LA177_0==127||LA177_0==129||(LA177_0>=133 && LA177_0<=141)||LA177_0==143||LA177_0==156) ) {
+                    alt177=1;
+                }
+
+
+                switch (alt177) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:22605:3: rule__XBlockExpression__Group_2__0
+            	    {
+            	    pushFollow(FOLLOW_148);
+            	    rule__XBlockExpression__Group_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop177;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__3"
+    // InternalEntityMockDSL.g:22613:1: rule__XBlockExpression__Group__3 : rule__XBlockExpression__Group__3__Impl ;
+    public final void rule__XBlockExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22617:1: ( rule__XBlockExpression__Group__3__Impl )
+            // InternalEntityMockDSL.g:22618:2: rule__XBlockExpression__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__3"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:22624:1: rule__XBlockExpression__Group__3__Impl : ( '}' ) ;
+    public final void rule__XBlockExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22628:1: ( ( '}' ) )
+            // InternalEntityMockDSL.g:22629:1: ( '}' )
+            {
+            // InternalEntityMockDSL.g:22629:1: ( '}' )
+            // InternalEntityMockDSL.g:22630:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group_2__0"
+    // InternalEntityMockDSL.g:22640:1: rule__XBlockExpression__Group_2__0 : rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 ;
+    public final void rule__XBlockExpression__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22644:1: ( rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 )
+            // InternalEntityMockDSL.g:22645:2: rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1
+            {
+            pushFollow(FOLLOW_101);
+            rule__XBlockExpression__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group_2__0"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group_2__0__Impl"
+    // InternalEntityMockDSL.g:22652:1: rule__XBlockExpression__Group_2__0__Impl : ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) ;
+    public final void rule__XBlockExpression__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22656:1: ( ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) )
+            // InternalEntityMockDSL.g:22657:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            {
+            // InternalEntityMockDSL.g:22657:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            // InternalEntityMockDSL.g:22658:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); 
+            }
+            // InternalEntityMockDSL.g:22659:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            // InternalEntityMockDSL.g:22659:3: rule__XBlockExpression__ExpressionsAssignment_2_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__ExpressionsAssignment_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group_2__1"
+    // InternalEntityMockDSL.g:22667:1: rule__XBlockExpression__Group_2__1 : rule__XBlockExpression__Group_2__1__Impl ;
+    public final void rule__XBlockExpression__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22671:1: ( rule__XBlockExpression__Group_2__1__Impl )
+            // InternalEntityMockDSL.g:22672:2: rule__XBlockExpression__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBlockExpression__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group_2__1"
+
+
+    // $ANTLR start "rule__XBlockExpression__Group_2__1__Impl"
+    // InternalEntityMockDSL.g:22678:1: rule__XBlockExpression__Group_2__1__Impl : ( ( ';' )? ) ;
+    public final void rule__XBlockExpression__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22682:1: ( ( ( ';' )? ) )
+            // InternalEntityMockDSL.g:22683:1: ( ( ';' )? )
+            {
+            // InternalEntityMockDSL.g:22683:1: ( ( ';' )? )
+            // InternalEntityMockDSL.g:22684:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); 
+            }
+            // InternalEntityMockDSL.g:22685:2: ( ';' )?
+            int alt178=2;
+            int LA178_0 = input.LA(1);
+
+            if ( (LA178_0==121) ) {
+                alt178=1;
+            }
+            switch (alt178) {
+                case 1 :
+                    // InternalEntityMockDSL.g:22685:3: ';'
+                    {
+                    match(input,121,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__0"
+    // InternalEntityMockDSL.g:22694:1: rule__XVariableDeclaration__Group__0 : rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 ;
+    public final void rule__XVariableDeclaration__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22698:1: ( rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 )
+            // InternalEntityMockDSL.g:22699:2: rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1
+            {
+            pushFollow(FOLLOW_164);
+            rule__XVariableDeclaration__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__0__Impl"
+    // InternalEntityMockDSL.g:22706:1: rule__XVariableDeclaration__Group__0__Impl : ( () ) ;
+    public final void rule__XVariableDeclaration__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22710:1: ( ( () ) )
+            // InternalEntityMockDSL.g:22711:1: ( () )
+            {
+            // InternalEntityMockDSL.g:22711:1: ( () )
+            // InternalEntityMockDSL.g:22712:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); 
+            }
+            // InternalEntityMockDSL.g:22713:2: ()
+            // InternalEntityMockDSL.g:22713:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__1"
+    // InternalEntityMockDSL.g:22721:1: rule__XVariableDeclaration__Group__1 : rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 ;
+    public final void rule__XVariableDeclaration__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22725:1: ( rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 )
+            // InternalEntityMockDSL.g:22726:2: rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2
+            {
+            pushFollow(FOLLOW_50);
+            rule__XVariableDeclaration__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__1__Impl"
+    // InternalEntityMockDSL.g:22733:1: rule__XVariableDeclaration__Group__1__Impl : ( ( rule__XVariableDeclaration__Alternatives_1 ) ) ;
+    public final void rule__XVariableDeclaration__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22737:1: ( ( ( rule__XVariableDeclaration__Alternatives_1 ) ) )
+            // InternalEntityMockDSL.g:22738:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            {
+            // InternalEntityMockDSL.g:22738:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            // InternalEntityMockDSL.g:22739:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); 
+            }
+            // InternalEntityMockDSL.g:22740:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            // InternalEntityMockDSL.g:22740:3: rule__XVariableDeclaration__Alternatives_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__2"
+    // InternalEntityMockDSL.g:22748:1: rule__XVariableDeclaration__Group__2 : rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 ;
+    public final void rule__XVariableDeclaration__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22752:1: ( rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 )
+            // InternalEntityMockDSL.g:22753:2: rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3
+            {
+            pushFollow(FOLLOW_107);
+            rule__XVariableDeclaration__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__2"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__2__Impl"
+    // InternalEntityMockDSL.g:22760:1: rule__XVariableDeclaration__Group__2__Impl : ( ( rule__XVariableDeclaration__Alternatives_2 ) ) ;
+    public final void rule__XVariableDeclaration__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22764:1: ( ( ( rule__XVariableDeclaration__Alternatives_2 ) ) )
+            // InternalEntityMockDSL.g:22765:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            {
+            // InternalEntityMockDSL.g:22765:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            // InternalEntityMockDSL.g:22766:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); 
+            }
+            // InternalEntityMockDSL.g:22767:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            // InternalEntityMockDSL.g:22767:3: rule__XVariableDeclaration__Alternatives_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__3"
+    // InternalEntityMockDSL.g:22775:1: rule__XVariableDeclaration__Group__3 : rule__XVariableDeclaration__Group__3__Impl ;
+    public final void rule__XVariableDeclaration__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22779:1: ( rule__XVariableDeclaration__Group__3__Impl )
+            // InternalEntityMockDSL.g:22780:2: rule__XVariableDeclaration__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__3"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group__3__Impl"
+    // InternalEntityMockDSL.g:22786:1: rule__XVariableDeclaration__Group__3__Impl : ( ( rule__XVariableDeclaration__Group_3__0 )? ) ;
+    public final void rule__XVariableDeclaration__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22790:1: ( ( ( rule__XVariableDeclaration__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:22791:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:22791:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            // InternalEntityMockDSL.g:22792:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:22793:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            int alt179=2;
+            int LA179_0 = input.LA(1);
+
+            if ( (LA179_0==13) ) {
+                alt179=1;
+            }
+            switch (alt179) {
+                case 1 :
+                    // InternalEntityMockDSL.g:22793:3: rule__XVariableDeclaration__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XVariableDeclaration__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0"
+    // InternalEntityMockDSL.g:22802:1: rule__XVariableDeclaration__Group_2_0__0 : rule__XVariableDeclaration__Group_2_0__0__Impl ;
+    public final void rule__XVariableDeclaration__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22806:1: ( rule__XVariableDeclaration__Group_2_0__0__Impl )
+            // InternalEntityMockDSL.g:22807:2: rule__XVariableDeclaration__Group_2_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0__0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0__Impl"
+    // InternalEntityMockDSL.g:22813:1: rule__XVariableDeclaration__Group_2_0__0__Impl : ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) ;
+    public final void rule__XVariableDeclaration__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22817:1: ( ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:22818:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:22818:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            // InternalEntityMockDSL.g:22819:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); 
+            }
+            // InternalEntityMockDSL.g:22820:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            // InternalEntityMockDSL.g:22820:3: rule__XVariableDeclaration__Group_2_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_2_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0"
+    // InternalEntityMockDSL.g:22829:1: rule__XVariableDeclaration__Group_2_0_0__0 : rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 ;
+    public final void rule__XVariableDeclaration__Group_2_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22833:1: ( rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 )
+            // InternalEntityMockDSL.g:22834:2: rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__XVariableDeclaration__Group_2_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_2_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0_0__0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0__Impl"
+    // InternalEntityMockDSL.g:22841:1: rule__XVariableDeclaration__Group_2_0_0__0__Impl : ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) ;
+    public final void rule__XVariableDeclaration__Group_2_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22845:1: ( ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) )
+            // InternalEntityMockDSL.g:22846:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:22846:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            // InternalEntityMockDSL.g:22847:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:22848:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            // InternalEntityMockDSL.g:22848:3: rule__XVariableDeclaration__TypeAssignment_2_0_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__TypeAssignment_2_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1"
+    // InternalEntityMockDSL.g:22856:1: rule__XVariableDeclaration__Group_2_0_0__1 : rule__XVariableDeclaration__Group_2_0_0__1__Impl ;
+    public final void rule__XVariableDeclaration__Group_2_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22860:1: ( rule__XVariableDeclaration__Group_2_0_0__1__Impl )
+            // InternalEntityMockDSL.g:22861:2: rule__XVariableDeclaration__Group_2_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_2_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0_0__1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1__Impl"
+    // InternalEntityMockDSL.g:22867:1: rule__XVariableDeclaration__Group_2_0_0__1__Impl : ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) ;
+    public final void rule__XVariableDeclaration__Group_2_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22871:1: ( ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) )
+            // InternalEntityMockDSL.g:22872:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            {
+            // InternalEntityMockDSL.g:22872:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            // InternalEntityMockDSL.g:22873:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); 
+            }
+            // InternalEntityMockDSL.g:22874:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            // InternalEntityMockDSL.g:22874:3: rule__XVariableDeclaration__NameAssignment_2_0_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__NameAssignment_2_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_2_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_3__0"
+    // InternalEntityMockDSL.g:22883:1: rule__XVariableDeclaration__Group_3__0 : rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 ;
+    public final void rule__XVariableDeclaration__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22887:1: ( rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 )
+            // InternalEntityMockDSL.g:22888:2: rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XVariableDeclaration__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_3__0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:22895:1: rule__XVariableDeclaration__Group_3__0__Impl : ( '=' ) ;
+    public final void rule__XVariableDeclaration__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22899:1: ( ( '=' ) )
+            // InternalEntityMockDSL.g:22900:1: ( '=' )
+            {
+            // InternalEntityMockDSL.g:22900:1: ( '=' )
+            // InternalEntityMockDSL.g:22901:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); 
+            }
+            match(input,13,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_3__1"
+    // InternalEntityMockDSL.g:22910:1: rule__XVariableDeclaration__Group_3__1 : rule__XVariableDeclaration__Group_3__1__Impl ;
+    public final void rule__XVariableDeclaration__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22914:1: ( rule__XVariableDeclaration__Group_3__1__Impl )
+            // InternalEntityMockDSL.g:22915:2: rule__XVariableDeclaration__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_3__1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:22921:1: rule__XVariableDeclaration__Group_3__1__Impl : ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) ;
+    public final void rule__XVariableDeclaration__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22925:1: ( ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) )
+            // InternalEntityMockDSL.g:22926:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            {
+            // InternalEntityMockDSL.g:22926:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            // InternalEntityMockDSL.g:22927:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); 
+            }
+            // InternalEntityMockDSL.g:22928:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            // InternalEntityMockDSL.g:22928:3: rule__XVariableDeclaration__RightAssignment_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XVariableDeclaration__RightAssignment_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__Group__0"
+    // InternalEntityMockDSL.g:22937:1: rule__JvmFormalParameter__Group__0 : rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 ;
+    public final void rule__JvmFormalParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22941:1: ( rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 )
+            // InternalEntityMockDSL.g:22942:2: rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__JvmFormalParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmFormalParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__Group__0"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__Group__0__Impl"
+    // InternalEntityMockDSL.g:22949:1: rule__JvmFormalParameter__Group__0__Impl : ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) ;
+    public final void rule__JvmFormalParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22953:1: ( ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) )
+            // InternalEntityMockDSL.g:22954:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            {
+            // InternalEntityMockDSL.g:22954:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            // InternalEntityMockDSL.g:22955:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:22956:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            int alt180=2;
+            int LA180_0 = input.LA(1);
+
+            if ( (LA180_0==RULE_ID) ) {
+                int LA180_1 = input.LA(2);
+
+                if ( (LA180_1==RULE_ID||LA180_1==28||LA180_1==44||LA180_1==125) ) {
+                    alt180=1;
+                }
+            }
+            else if ( (LA180_0==32||LA180_0==68) ) {
+                alt180=1;
+            }
+            switch (alt180) {
+                case 1 :
+                    // InternalEntityMockDSL.g:22956:3: rule__JvmFormalParameter__ParameterTypeAssignment_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmFormalParameter__ParameterTypeAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__Group__1"
+    // InternalEntityMockDSL.g:22964:1: rule__JvmFormalParameter__Group__1 : rule__JvmFormalParameter__Group__1__Impl ;
+    public final void rule__JvmFormalParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22968:1: ( rule__JvmFormalParameter__Group__1__Impl )
+            // InternalEntityMockDSL.g:22969:2: rule__JvmFormalParameter__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmFormalParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__Group__1"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__Group__1__Impl"
+    // InternalEntityMockDSL.g:22975:1: rule__JvmFormalParameter__Group__1__Impl : ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) ;
+    public final void rule__JvmFormalParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22979:1: ( ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:22980:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:22980:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:22981:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:22982:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            // InternalEntityMockDSL.g:22982:3: rule__JvmFormalParameter__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmFormalParameter__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__Group__0"
+    // InternalEntityMockDSL.g:22991:1: rule__FullJvmFormalParameter__Group__0 : rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 ;
+    public final void rule__FullJvmFormalParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:22995:1: ( rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 )
+            // InternalEntityMockDSL.g:22996:2: rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__FullJvmFormalParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__FullJvmFormalParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__Group__0"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__Group__0__Impl"
+    // InternalEntityMockDSL.g:23003:1: rule__FullJvmFormalParameter__Group__0__Impl : ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) ;
+    public final void rule__FullJvmFormalParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23007:1: ( ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) )
+            // InternalEntityMockDSL.g:23008:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            {
+            // InternalEntityMockDSL.g:23008:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            // InternalEntityMockDSL.g:23009:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:23010:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            // InternalEntityMockDSL.g:23010:3: rule__FullJvmFormalParameter__ParameterTypeAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__FullJvmFormalParameter__ParameterTypeAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__Group__1"
+    // InternalEntityMockDSL.g:23018:1: rule__FullJvmFormalParameter__Group__1 : rule__FullJvmFormalParameter__Group__1__Impl ;
+    public final void rule__FullJvmFormalParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23022:1: ( rule__FullJvmFormalParameter__Group__1__Impl )
+            // InternalEntityMockDSL.g:23023:2: rule__FullJvmFormalParameter__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__FullJvmFormalParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__Group__1"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__Group__1__Impl"
+    // InternalEntityMockDSL.g:23029:1: rule__FullJvmFormalParameter__Group__1__Impl : ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) ;
+    public final void rule__FullJvmFormalParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23033:1: ( ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:23034:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:23034:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            // InternalEntityMockDSL.g:23035:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:23036:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            // InternalEntityMockDSL.g:23036:3: rule__FullJvmFormalParameter__NameAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__FullJvmFormalParameter__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__0"
+    // InternalEntityMockDSL.g:23045:1: rule__XFeatureCall__Group__0 : rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 ;
+    public final void rule__XFeatureCall__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23049:1: ( rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 )
+            // InternalEntityMockDSL.g:23050:2: rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1
+            {
+            pushFollow(FOLLOW_139);
+            rule__XFeatureCall__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__0__Impl"
+    // InternalEntityMockDSL.g:23057:1: rule__XFeatureCall__Group__0__Impl : ( () ) ;
+    public final void rule__XFeatureCall__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23061:1: ( ( () ) )
+            // InternalEntityMockDSL.g:23062:1: ( () )
+            {
+            // InternalEntityMockDSL.g:23062:1: ( () )
+            // InternalEntityMockDSL.g:23063:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); 
+            }
+            // InternalEntityMockDSL.g:23064:2: ()
+            // InternalEntityMockDSL.g:23064:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__1"
+    // InternalEntityMockDSL.g:23072:1: rule__XFeatureCall__Group__1 : rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 ;
+    public final void rule__XFeatureCall__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23076:1: ( rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 )
+            // InternalEntityMockDSL.g:23077:2: rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2
+            {
+            pushFollow(FOLLOW_139);
+            rule__XFeatureCall__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__1__Impl"
+    // InternalEntityMockDSL.g:23084:1: rule__XFeatureCall__Group__1__Impl : ( ( rule__XFeatureCall__Group_1__0 )? ) ;
+    public final void rule__XFeatureCall__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23088:1: ( ( ( rule__XFeatureCall__Group_1__0 )? ) )
+            // InternalEntityMockDSL.g:23089:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:23089:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            // InternalEntityMockDSL.g:23090:2: ( rule__XFeatureCall__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:23091:2: ( rule__XFeatureCall__Group_1__0 )?
+            int alt181=2;
+            int LA181_0 = input.LA(1);
+
+            if ( (LA181_0==28) ) {
+                alt181=1;
+            }
+            switch (alt181) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23091:3: rule__XFeatureCall__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__2"
+    // InternalEntityMockDSL.g:23099:1: rule__XFeatureCall__Group__2 : rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 ;
+    public final void rule__XFeatureCall__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23103:1: ( rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 )
+            // InternalEntityMockDSL.g:23104:2: rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3
+            {
+            pushFollow(FOLLOW_140);
+            rule__XFeatureCall__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__2"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__2__Impl"
+    // InternalEntityMockDSL.g:23111:1: rule__XFeatureCall__Group__2__Impl : ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) ;
+    public final void rule__XFeatureCall__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23115:1: ( ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:23116:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:23116:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            // InternalEntityMockDSL.g:23117:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:23118:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            // InternalEntityMockDSL.g:23118:3: rule__XFeatureCall__FeatureAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__FeatureAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__3"
+    // InternalEntityMockDSL.g:23126:1: rule__XFeatureCall__Group__3 : rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 ;
+    public final void rule__XFeatureCall__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23130:1: ( rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 )
+            // InternalEntityMockDSL.g:23131:2: rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4
+            {
+            pushFollow(FOLLOW_140);
+            rule__XFeatureCall__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__3"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__3__Impl"
+    // InternalEntityMockDSL.g:23138:1: rule__XFeatureCall__Group__3__Impl : ( ( rule__XFeatureCall__Group_3__0 )? ) ;
+    public final void rule__XFeatureCall__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23142:1: ( ( ( rule__XFeatureCall__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:23143:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:23143:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            // InternalEntityMockDSL.g:23144:2: ( rule__XFeatureCall__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:23145:2: ( rule__XFeatureCall__Group_3__0 )?
+            int alt182=2;
+            alt182 = dfa182.predict(input);
+            switch (alt182) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23145:3: rule__XFeatureCall__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__4"
+    // InternalEntityMockDSL.g:23153:1: rule__XFeatureCall__Group__4 : rule__XFeatureCall__Group__4__Impl ;
+    public final void rule__XFeatureCall__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23157:1: ( rule__XFeatureCall__Group__4__Impl )
+            // InternalEntityMockDSL.g:23158:2: rule__XFeatureCall__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__4"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group__4__Impl"
+    // InternalEntityMockDSL.g:23164:1: rule__XFeatureCall__Group__4__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) ;
+    public final void rule__XFeatureCall__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23168:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) )
+            // InternalEntityMockDSL.g:23169:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            {
+            // InternalEntityMockDSL.g:23169:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            // InternalEntityMockDSL.g:23170:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:23171:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            int alt183=2;
+            alt183 = dfa183.predict(input);
+            switch (alt183) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23171:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__0"
+    // InternalEntityMockDSL.g:23180:1: rule__XFeatureCall__Group_1__0 : rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 ;
+    public final void rule__XFeatureCall__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23184:1: ( rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 )
+            // InternalEntityMockDSL.g:23185:2: rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XFeatureCall__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:23192:1: rule__XFeatureCall__Group_1__0__Impl : ( '<' ) ;
+    public final void rule__XFeatureCall__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23196:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:23197:1: ( '<' )
+            {
+            // InternalEntityMockDSL.g:23197:1: ( '<' )
+            // InternalEntityMockDSL.g:23198:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__1"
+    // InternalEntityMockDSL.g:23207:1: rule__XFeatureCall__Group_1__1 : rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 ;
+    public final void rule__XFeatureCall__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23211:1: ( rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 )
+            // InternalEntityMockDSL.g:23212:2: rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2
+            {
+            pushFollow(FOLLOW_142);
+            rule__XFeatureCall__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:23219:1: rule__XFeatureCall__Group_1__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) ;
+    public final void rule__XFeatureCall__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23223:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:23224:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:23224:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:23225:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:23226:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            // InternalEntityMockDSL.g:23226:3: rule__XFeatureCall__TypeArgumentsAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__TypeArgumentsAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__2"
+    // InternalEntityMockDSL.g:23234:1: rule__XFeatureCall__Group_1__2 : rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 ;
+    public final void rule__XFeatureCall__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23238:1: ( rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 )
+            // InternalEntityMockDSL.g:23239:2: rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3
+            {
+            pushFollow(FOLLOW_142);
+            rule__XFeatureCall__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__2"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__2__Impl"
+    // InternalEntityMockDSL.g:23246:1: rule__XFeatureCall__Group_1__2__Impl : ( ( rule__XFeatureCall__Group_1_2__0 )* ) ;
+    public final void rule__XFeatureCall__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23250:1: ( ( ( rule__XFeatureCall__Group_1_2__0 )* ) )
+            // InternalEntityMockDSL.g:23251:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:23251:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            // InternalEntityMockDSL.g:23252:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); 
+            }
+            // InternalEntityMockDSL.g:23253:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            loop184:
+            do {
+                int alt184=2;
+                int LA184_0 = input.LA(1);
+
+                if ( (LA184_0==70) ) {
+                    alt184=1;
+                }
+
+
+                switch (alt184) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:23253:3: rule__XFeatureCall__Group_1_2__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XFeatureCall__Group_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop184;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__3"
+    // InternalEntityMockDSL.g:23261:1: rule__XFeatureCall__Group_1__3 : rule__XFeatureCall__Group_1__3__Impl ;
+    public final void rule__XFeatureCall__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23265:1: ( rule__XFeatureCall__Group_1__3__Impl )
+            // InternalEntityMockDSL.g:23266:2: rule__XFeatureCall__Group_1__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__3"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1__3__Impl"
+    // InternalEntityMockDSL.g:23272:1: rule__XFeatureCall__Group_1__3__Impl : ( '>' ) ;
+    public final void rule__XFeatureCall__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23276:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:23277:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:23277:1: ( '>' )
+            // InternalEntityMockDSL.g:23278:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1_2__0"
+    // InternalEntityMockDSL.g:23288:1: rule__XFeatureCall__Group_1_2__0 : rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 ;
+    public final void rule__XFeatureCall__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23292:1: ( rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 )
+            // InternalEntityMockDSL.g:23293:2: rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XFeatureCall__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1_2__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1_2__0__Impl"
+    // InternalEntityMockDSL.g:23300:1: rule__XFeatureCall__Group_1_2__0__Impl : ( ',' ) ;
+    public final void rule__XFeatureCall__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23304:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:23305:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:23305:1: ( ',' )
+            // InternalEntityMockDSL.g:23306:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1_2__1"
+    // InternalEntityMockDSL.g:23315:1: rule__XFeatureCall__Group_1_2__1 : rule__XFeatureCall__Group_1_2__1__Impl ;
+    public final void rule__XFeatureCall__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23319:1: ( rule__XFeatureCall__Group_1_2__1__Impl )
+            // InternalEntityMockDSL.g:23320:2: rule__XFeatureCall__Group_1_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1_2__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_1_2__1__Impl"
+    // InternalEntityMockDSL.g:23326:1: rule__XFeatureCall__Group_1_2__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) ;
+    public final void rule__XFeatureCall__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23330:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) )
+            // InternalEntityMockDSL.g:23331:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:23331:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            // InternalEntityMockDSL.g:23332:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); 
+            }
+            // InternalEntityMockDSL.g:23333:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            // InternalEntityMockDSL.g:23333:3: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__TypeArgumentsAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__0"
+    // InternalEntityMockDSL.g:23342:1: rule__XFeatureCall__Group_3__0 : rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 ;
+    public final void rule__XFeatureCall__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23346:1: ( rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 )
+            // InternalEntityMockDSL.g:23347:2: rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1
+            {
+            pushFollow(FOLLOW_143);
+            rule__XFeatureCall__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:23354:1: rule__XFeatureCall__Group_3__0__Impl : ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) ;
+    public final void rule__XFeatureCall__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23358:1: ( ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) )
+            // InternalEntityMockDSL.g:23359:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            {
+            // InternalEntityMockDSL.g:23359:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            // InternalEntityMockDSL.g:23360:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); 
+            }
+            // InternalEntityMockDSL.g:23361:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            // InternalEntityMockDSL.g:23361:3: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__ExplicitOperationCallAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__1"
+    // InternalEntityMockDSL.g:23369:1: rule__XFeatureCall__Group_3__1 : rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 ;
+    public final void rule__XFeatureCall__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23373:1: ( rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 )
+            // InternalEntityMockDSL.g:23374:2: rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2
+            {
+            pushFollow(FOLLOW_143);
+            rule__XFeatureCall__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:23381:1: rule__XFeatureCall__Group_3__1__Impl : ( ( rule__XFeatureCall__Alternatives_3_1 )? ) ;
+    public final void rule__XFeatureCall__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23385:1: ( ( ( rule__XFeatureCall__Alternatives_3_1 )? ) )
+            // InternalEntityMockDSL.g:23386:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            {
+            // InternalEntityMockDSL.g:23386:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            // InternalEntityMockDSL.g:23387:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); 
+            }
+            // InternalEntityMockDSL.g:23388:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            int alt185=2;
+            int LA185_0 = input.LA(1);
+
+            if ( ((LA185_0>=RULE_ID && LA185_0<=RULE_STRING)||LA185_0==28||LA185_0==32||(LA185_0>=35 && LA185_0<=36)||LA185_0==41||(LA185_0>=46 && LA185_0<=51)||LA185_0==57||LA185_0==68||(LA185_0>=124 && LA185_0<=125)||LA185_0==127||LA185_0==129||(LA185_0>=133 && LA185_0<=141)||LA185_0==143||(LA185_0>=155 && LA185_0<=156)) ) {
+                alt185=1;
+            }
+            switch (alt185) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23388:3: rule__XFeatureCall__Alternatives_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFeatureCall__Alternatives_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__2"
+    // InternalEntityMockDSL.g:23396:1: rule__XFeatureCall__Group_3__2 : rule__XFeatureCall__Group_3__2__Impl ;
+    public final void rule__XFeatureCall__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23400:1: ( rule__XFeatureCall__Group_3__2__Impl )
+            // InternalEntityMockDSL.g:23401:2: rule__XFeatureCall__Group_3__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__2"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:23407:1: rule__XFeatureCall__Group_3__2__Impl : ( ')' ) ;
+    public final void rule__XFeatureCall__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23411:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:23412:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:23412:1: ( ')' )
+            // InternalEntityMockDSL.g:23413:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0"
+    // InternalEntityMockDSL.g:23423:1: rule__XFeatureCall__Group_3_1_1__0 : rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 ;
+    public final void rule__XFeatureCall__Group_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23427:1: ( rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 )
+            // InternalEntityMockDSL.g:23428:2: rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XFeatureCall__Group_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0__Impl"
+    // InternalEntityMockDSL.g:23435:1: rule__XFeatureCall__Group_3_1_1__0__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) ;
+    public final void rule__XFeatureCall__Group_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23439:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) )
+            // InternalEntityMockDSL.g:23440:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:23440:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            // InternalEntityMockDSL.g:23441:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:23442:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            // InternalEntityMockDSL.g:23442:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1"
+    // InternalEntityMockDSL.g:23450:1: rule__XFeatureCall__Group_3_1_1__1 : rule__XFeatureCall__Group_3_1_1__1__Impl ;
+    public final void rule__XFeatureCall__Group_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23454:1: ( rule__XFeatureCall__Group_3_1_1__1__Impl )
+            // InternalEntityMockDSL.g:23455:2: rule__XFeatureCall__Group_3_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1__Impl"
+    // InternalEntityMockDSL.g:23461:1: rule__XFeatureCall__Group_3_1_1__1__Impl : ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) ;
+    public final void rule__XFeatureCall__Group_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23465:1: ( ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:23466:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:23466:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            // InternalEntityMockDSL.g:23467:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:23468:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            loop186:
+            do {
+                int alt186=2;
+                int LA186_0 = input.LA(1);
+
+                if ( (LA186_0==70) ) {
+                    alt186=1;
+                }
+
+
+                switch (alt186) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:23468:3: rule__XFeatureCall__Group_3_1_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XFeatureCall__Group_3_1_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop186;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0"
+    // InternalEntityMockDSL.g:23477:1: rule__XFeatureCall__Group_3_1_1_1__0 : rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 ;
+    public final void rule__XFeatureCall__Group_3_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23481:1: ( rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 )
+            // InternalEntityMockDSL.g:23482:2: rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XFeatureCall__Group_3_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1_1__0"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0__Impl"
+    // InternalEntityMockDSL.g:23489:1: rule__XFeatureCall__Group_3_1_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XFeatureCall__Group_3_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23493:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:23494:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:23494:1: ( ',' )
+            // InternalEntityMockDSL.g:23495:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1"
+    // InternalEntityMockDSL.g:23504:1: rule__XFeatureCall__Group_3_1_1_1__1 : rule__XFeatureCall__Group_3_1_1_1__1__Impl ;
+    public final void rule__XFeatureCall__Group_3_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23508:1: ( rule__XFeatureCall__Group_3_1_1_1__1__Impl )
+            // InternalEntityMockDSL.g:23509:2: rule__XFeatureCall__Group_3_1_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__Group_3_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1_1__1"
+
+
+    // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1__Impl"
+    // InternalEntityMockDSL.g:23515:1: rule__XFeatureCall__Group_3_1_1_1__1__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) ;
+    public final void rule__XFeatureCall__Group_3_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23519:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:23520:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:23520:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            // InternalEntityMockDSL.g:23521:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:23522:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            // InternalEntityMockDSL.g:23522:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__Group_3_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__0"
+    // InternalEntityMockDSL.g:23531:1: rule__XConstructorCall__Group__0 : rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 ;
+    public final void rule__XConstructorCall__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23535:1: ( rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 )
+            // InternalEntityMockDSL.g:23536:2: rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1
+            {
+            pushFollow(FOLLOW_165);
+            rule__XConstructorCall__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__0__Impl"
+    // InternalEntityMockDSL.g:23543:1: rule__XConstructorCall__Group__0__Impl : ( () ) ;
+    public final void rule__XConstructorCall__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23547:1: ( ( () ) )
+            // InternalEntityMockDSL.g:23548:1: ( () )
+            {
+            // InternalEntityMockDSL.g:23548:1: ( () )
+            // InternalEntityMockDSL.g:23549:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); 
+            }
+            // InternalEntityMockDSL.g:23550:2: ()
+            // InternalEntityMockDSL.g:23550:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__1"
+    // InternalEntityMockDSL.g:23558:1: rule__XConstructorCall__Group__1 : rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 ;
+    public final void rule__XConstructorCall__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23562:1: ( rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 )
+            // InternalEntityMockDSL.g:23563:2: rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__XConstructorCall__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__1__Impl"
+    // InternalEntityMockDSL.g:23570:1: rule__XConstructorCall__Group__1__Impl : ( 'new' ) ;
+    public final void rule__XConstructorCall__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23574:1: ( ( 'new' ) )
+            // InternalEntityMockDSL.g:23575:1: ( 'new' )
+            {
+            // InternalEntityMockDSL.g:23575:1: ( 'new' )
+            // InternalEntityMockDSL.g:23576:2: 'new'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); 
+            }
+            match(input,136,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__2"
+    // InternalEntityMockDSL.g:23585:1: rule__XConstructorCall__Group__2 : rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 ;
+    public final void rule__XConstructorCall__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23589:1: ( rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 )
+            // InternalEntityMockDSL.g:23590:2: rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3
+            {
+            pushFollow(FOLLOW_166);
+            rule__XConstructorCall__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__2"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__2__Impl"
+    // InternalEntityMockDSL.g:23597:1: rule__XConstructorCall__Group__2__Impl : ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) ;
+    public final void rule__XConstructorCall__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23601:1: ( ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:23602:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:23602:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            // InternalEntityMockDSL.g:23603:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:23604:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            // InternalEntityMockDSL.g:23604:3: rule__XConstructorCall__ConstructorAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__ConstructorAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__3"
+    // InternalEntityMockDSL.g:23612:1: rule__XConstructorCall__Group__3 : rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 ;
+    public final void rule__XConstructorCall__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23616:1: ( rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 )
+            // InternalEntityMockDSL.g:23617:2: rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4
+            {
+            pushFollow(FOLLOW_166);
+            rule__XConstructorCall__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__3"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__3__Impl"
+    // InternalEntityMockDSL.g:23624:1: rule__XConstructorCall__Group__3__Impl : ( ( rule__XConstructorCall__Group_3__0 )? ) ;
+    public final void rule__XConstructorCall__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23628:1: ( ( ( rule__XConstructorCall__Group_3__0 )? ) )
+            // InternalEntityMockDSL.g:23629:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            {
+            // InternalEntityMockDSL.g:23629:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            // InternalEntityMockDSL.g:23630:2: ( rule__XConstructorCall__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGroup_3()); 
+            }
+            // InternalEntityMockDSL.g:23631:2: ( rule__XConstructorCall__Group_3__0 )?
+            int alt187=2;
+            alt187 = dfa187.predict(input);
+            switch (alt187) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23631:3: rule__XConstructorCall__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__4"
+    // InternalEntityMockDSL.g:23639:1: rule__XConstructorCall__Group__4 : rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 ;
+    public final void rule__XConstructorCall__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23643:1: ( rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 )
+            // InternalEntityMockDSL.g:23644:2: rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5
+            {
+            pushFollow(FOLLOW_166);
+            rule__XConstructorCall__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__4"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__4__Impl"
+    // InternalEntityMockDSL.g:23651:1: rule__XConstructorCall__Group__4__Impl : ( ( rule__XConstructorCall__Group_4__0 )? ) ;
+    public final void rule__XConstructorCall__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23655:1: ( ( ( rule__XConstructorCall__Group_4__0 )? ) )
+            // InternalEntityMockDSL.g:23656:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            {
+            // InternalEntityMockDSL.g:23656:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            // InternalEntityMockDSL.g:23657:2: ( rule__XConstructorCall__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGroup_4()); 
+            }
+            // InternalEntityMockDSL.g:23658:2: ( rule__XConstructorCall__Group_4__0 )?
+            int alt188=2;
+            alt188 = dfa188.predict(input);
+            switch (alt188) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23658:3: rule__XConstructorCall__Group_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__5"
+    // InternalEntityMockDSL.g:23666:1: rule__XConstructorCall__Group__5 : rule__XConstructorCall__Group__5__Impl ;
+    public final void rule__XConstructorCall__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23670:1: ( rule__XConstructorCall__Group__5__Impl )
+            // InternalEntityMockDSL.g:23671:2: rule__XConstructorCall__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__5"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group__5__Impl"
+    // InternalEntityMockDSL.g:23677:1: rule__XConstructorCall__Group__5__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) ;
+    public final void rule__XConstructorCall__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23681:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) )
+            // InternalEntityMockDSL.g:23682:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            {
+            // InternalEntityMockDSL.g:23682:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            // InternalEntityMockDSL.g:23683:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); 
+            }
+            // InternalEntityMockDSL.g:23684:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            int alt189=2;
+            alt189 = dfa189.predict(input);
+            switch (alt189) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23684:3: rule__XConstructorCall__ArgumentsAssignment_5
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__ArgumentsAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__0"
+    // InternalEntityMockDSL.g:23693:1: rule__XConstructorCall__Group_3__0 : rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 ;
+    public final void rule__XConstructorCall__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23697:1: ( rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 )
+            // InternalEntityMockDSL.g:23698:2: rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XConstructorCall__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__0__Impl"
+    // InternalEntityMockDSL.g:23705:1: rule__XConstructorCall__Group_3__0__Impl : ( ( '<' ) ) ;
+    public final void rule__XConstructorCall__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23709:1: ( ( ( '<' ) ) )
+            // InternalEntityMockDSL.g:23710:1: ( ( '<' ) )
+            {
+            // InternalEntityMockDSL.g:23710:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:23711:2: ( '<' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); 
+            }
+            // InternalEntityMockDSL.g:23712:2: ( '<' )
+            // InternalEntityMockDSL.g:23712:3: '<'
+            {
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__1"
+    // InternalEntityMockDSL.g:23720:1: rule__XConstructorCall__Group_3__1 : rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 ;
+    public final void rule__XConstructorCall__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23724:1: ( rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 )
+            // InternalEntityMockDSL.g:23725:2: rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2
+            {
+            pushFollow(FOLLOW_142);
+            rule__XConstructorCall__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__1__Impl"
+    // InternalEntityMockDSL.g:23732:1: rule__XConstructorCall__Group_3__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) ;
+    public final void rule__XConstructorCall__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23736:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) )
+            // InternalEntityMockDSL.g:23737:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            {
+            // InternalEntityMockDSL.g:23737:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            // InternalEntityMockDSL.g:23738:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); 
+            }
+            // InternalEntityMockDSL.g:23739:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            // InternalEntityMockDSL.g:23739:3: rule__XConstructorCall__TypeArgumentsAssignment_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__TypeArgumentsAssignment_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__2"
+    // InternalEntityMockDSL.g:23747:1: rule__XConstructorCall__Group_3__2 : rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 ;
+    public final void rule__XConstructorCall__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23751:1: ( rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 )
+            // InternalEntityMockDSL.g:23752:2: rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3
+            {
+            pushFollow(FOLLOW_142);
+            rule__XConstructorCall__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__2"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__2__Impl"
+    // InternalEntityMockDSL.g:23759:1: rule__XConstructorCall__Group_3__2__Impl : ( ( rule__XConstructorCall__Group_3_2__0 )* ) ;
+    public final void rule__XConstructorCall__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23763:1: ( ( ( rule__XConstructorCall__Group_3_2__0 )* ) )
+            // InternalEntityMockDSL.g:23764:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:23764:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            // InternalEntityMockDSL.g:23765:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); 
+            }
+            // InternalEntityMockDSL.g:23766:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            loop190:
+            do {
+                int alt190=2;
+                int LA190_0 = input.LA(1);
+
+                if ( (LA190_0==70) ) {
+                    alt190=1;
+                }
+
+
+                switch (alt190) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:23766:3: rule__XConstructorCall__Group_3_2__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XConstructorCall__Group_3_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop190;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__3"
+    // InternalEntityMockDSL.g:23774:1: rule__XConstructorCall__Group_3__3 : rule__XConstructorCall__Group_3__3__Impl ;
+    public final void rule__XConstructorCall__Group_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23778:1: ( rule__XConstructorCall__Group_3__3__Impl )
+            // InternalEntityMockDSL.g:23779:2: rule__XConstructorCall__Group_3__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__3"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3__3__Impl"
+    // InternalEntityMockDSL.g:23785:1: rule__XConstructorCall__Group_3__3__Impl : ( '>' ) ;
+    public final void rule__XConstructorCall__Group_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23789:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:23790:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:23790:1: ( '>' )
+            // InternalEntityMockDSL.g:23791:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3__3__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3_2__0"
+    // InternalEntityMockDSL.g:23801:1: rule__XConstructorCall__Group_3_2__0 : rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 ;
+    public final void rule__XConstructorCall__Group_3_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23805:1: ( rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 )
+            // InternalEntityMockDSL.g:23806:2: rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__XConstructorCall__Group_3_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3_2__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3_2__0__Impl"
+    // InternalEntityMockDSL.g:23813:1: rule__XConstructorCall__Group_3_2__0__Impl : ( ',' ) ;
+    public final void rule__XConstructorCall__Group_3_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23817:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:23818:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:23818:1: ( ',' )
+            // InternalEntityMockDSL.g:23819:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3_2__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3_2__1"
+    // InternalEntityMockDSL.g:23828:1: rule__XConstructorCall__Group_3_2__1 : rule__XConstructorCall__Group_3_2__1__Impl ;
+    public final void rule__XConstructorCall__Group_3_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23832:1: ( rule__XConstructorCall__Group_3_2__1__Impl )
+            // InternalEntityMockDSL.g:23833:2: rule__XConstructorCall__Group_3_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_3_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3_2__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_3_2__1__Impl"
+    // InternalEntityMockDSL.g:23839:1: rule__XConstructorCall__Group_3_2__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) ;
+    public final void rule__XConstructorCall__Group_3_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23843:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) )
+            // InternalEntityMockDSL.g:23844:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:23844:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            // InternalEntityMockDSL.g:23845:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); 
+            }
+            // InternalEntityMockDSL.g:23846:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            // InternalEntityMockDSL.g:23846:3: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__TypeArgumentsAssignment_3_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_3_2__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__0"
+    // InternalEntityMockDSL.g:23855:1: rule__XConstructorCall__Group_4__0 : rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 ;
+    public final void rule__XConstructorCall__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23859:1: ( rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 )
+            // InternalEntityMockDSL.g:23860:2: rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1
+            {
+            pushFollow(FOLLOW_143);
+            rule__XConstructorCall__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__0__Impl"
+    // InternalEntityMockDSL.g:23867:1: rule__XConstructorCall__Group_4__0__Impl : ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) ;
+    public final void rule__XConstructorCall__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23871:1: ( ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) )
+            // InternalEntityMockDSL.g:23872:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            {
+            // InternalEntityMockDSL.g:23872:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            // InternalEntityMockDSL.g:23873:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); 
+            }
+            // InternalEntityMockDSL.g:23874:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            // InternalEntityMockDSL.g:23874:3: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__1"
+    // InternalEntityMockDSL.g:23882:1: rule__XConstructorCall__Group_4__1 : rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 ;
+    public final void rule__XConstructorCall__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23886:1: ( rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 )
+            // InternalEntityMockDSL.g:23887:2: rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2
+            {
+            pushFollow(FOLLOW_143);
+            rule__XConstructorCall__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__1__Impl"
+    // InternalEntityMockDSL.g:23894:1: rule__XConstructorCall__Group_4__1__Impl : ( ( rule__XConstructorCall__Alternatives_4_1 )? ) ;
+    public final void rule__XConstructorCall__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23898:1: ( ( ( rule__XConstructorCall__Alternatives_4_1 )? ) )
+            // InternalEntityMockDSL.g:23899:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            {
+            // InternalEntityMockDSL.g:23899:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            // InternalEntityMockDSL.g:23900:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); 
+            }
+            // InternalEntityMockDSL.g:23901:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            int alt191=2;
+            int LA191_0 = input.LA(1);
+
+            if ( ((LA191_0>=RULE_ID && LA191_0<=RULE_STRING)||LA191_0==28||LA191_0==32||(LA191_0>=35 && LA191_0<=36)||LA191_0==41||(LA191_0>=46 && LA191_0<=51)||LA191_0==57||LA191_0==68||(LA191_0>=124 && LA191_0<=125)||LA191_0==127||LA191_0==129||(LA191_0>=133 && LA191_0<=141)||LA191_0==143||(LA191_0>=155 && LA191_0<=156)) ) {
+                alt191=1;
+            }
+            switch (alt191) {
+                case 1 :
+                    // InternalEntityMockDSL.g:23901:3: rule__XConstructorCall__Alternatives_4_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XConstructorCall__Alternatives_4_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__2"
+    // InternalEntityMockDSL.g:23909:1: rule__XConstructorCall__Group_4__2 : rule__XConstructorCall__Group_4__2__Impl ;
+    public final void rule__XConstructorCall__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23913:1: ( rule__XConstructorCall__Group_4__2__Impl )
+            // InternalEntityMockDSL.g:23914:2: rule__XConstructorCall__Group_4__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__2"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4__2__Impl"
+    // InternalEntityMockDSL.g:23920:1: rule__XConstructorCall__Group_4__2__Impl : ( ')' ) ;
+    public final void rule__XConstructorCall__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23924:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:23925:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:23925:1: ( ')' )
+            // InternalEntityMockDSL.g:23926:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0"
+    // InternalEntityMockDSL.g:23936:1: rule__XConstructorCall__Group_4_1_1__0 : rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 ;
+    public final void rule__XConstructorCall__Group_4_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23940:1: ( rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 )
+            // InternalEntityMockDSL.g:23941:2: rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XConstructorCall__Group_4_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0__Impl"
+    // InternalEntityMockDSL.g:23948:1: rule__XConstructorCall__Group_4_1_1__0__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) ;
+    public final void rule__XConstructorCall__Group_4_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23952:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) )
+            // InternalEntityMockDSL.g:23953:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:23953:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            // InternalEntityMockDSL.g:23954:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:23955:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            // InternalEntityMockDSL.g:23955:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__ArgumentsAssignment_4_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1"
+    // InternalEntityMockDSL.g:23963:1: rule__XConstructorCall__Group_4_1_1__1 : rule__XConstructorCall__Group_4_1_1__1__Impl ;
+    public final void rule__XConstructorCall__Group_4_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23967:1: ( rule__XConstructorCall__Group_4_1_1__1__Impl )
+            // InternalEntityMockDSL.g:23968:2: rule__XConstructorCall__Group_4_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1__Impl"
+    // InternalEntityMockDSL.g:23974:1: rule__XConstructorCall__Group_4_1_1__1__Impl : ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) ;
+    public final void rule__XConstructorCall__Group_4_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23978:1: ( ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:23979:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:23979:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            // InternalEntityMockDSL.g:23980:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:23981:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            loop192:
+            do {
+                int alt192=2;
+                int LA192_0 = input.LA(1);
+
+                if ( (LA192_0==70) ) {
+                    alt192=1;
+                }
+
+
+                switch (alt192) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:23981:3: rule__XConstructorCall__Group_4_1_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XConstructorCall__Group_4_1_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop192;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0"
+    // InternalEntityMockDSL.g:23990:1: rule__XConstructorCall__Group_4_1_1_1__0 : rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 ;
+    public final void rule__XConstructorCall__Group_4_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:23994:1: ( rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 )
+            // InternalEntityMockDSL.g:23995:2: rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XConstructorCall__Group_4_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1_1__0"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0__Impl"
+    // InternalEntityMockDSL.g:24002:1: rule__XConstructorCall__Group_4_1_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XConstructorCall__Group_4_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24006:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:24007:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:24007:1: ( ',' )
+            // InternalEntityMockDSL.g:24008:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1"
+    // InternalEntityMockDSL.g:24017:1: rule__XConstructorCall__Group_4_1_1_1__1 : rule__XConstructorCall__Group_4_1_1_1__1__Impl ;
+    public final void rule__XConstructorCall__Group_4_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24021:1: ( rule__XConstructorCall__Group_4_1_1_1__1__Impl )
+            // InternalEntityMockDSL.g:24022:2: rule__XConstructorCall__Group_4_1_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__Group_4_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1_1__1"
+
+
+    // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1__Impl"
+    // InternalEntityMockDSL.g:24028:1: rule__XConstructorCall__Group_4_1_1_1__1__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) ;
+    public final void rule__XConstructorCall__Group_4_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24032:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:24033:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:24033:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            // InternalEntityMockDSL.g:24034:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:24035:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            // InternalEntityMockDSL.g:24035:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__Group_4_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__Group__0"
+    // InternalEntityMockDSL.g:24044:1: rule__XBooleanLiteral__Group__0 : rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 ;
+    public final void rule__XBooleanLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24048:1: ( rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 )
+            // InternalEntityMockDSL.g:24049:2: rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1
+            {
+            pushFollow(FOLLOW_167);
+            rule__XBooleanLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XBooleanLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:24056:1: rule__XBooleanLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XBooleanLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24060:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24061:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24061:1: ( () )
+            // InternalEntityMockDSL.g:24062:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24063:2: ()
+            // InternalEntityMockDSL.g:24063:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__Group__1"
+    // InternalEntityMockDSL.g:24071:1: rule__XBooleanLiteral__Group__1 : rule__XBooleanLiteral__Group__1__Impl ;
+    public final void rule__XBooleanLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24075:1: ( rule__XBooleanLiteral__Group__1__Impl )
+            // InternalEntityMockDSL.g:24076:2: rule__XBooleanLiteral__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBooleanLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:24082:1: rule__XBooleanLiteral__Group__1__Impl : ( ( rule__XBooleanLiteral__Alternatives_1 ) ) ;
+    public final void rule__XBooleanLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24086:1: ( ( ( rule__XBooleanLiteral__Alternatives_1 ) ) )
+            // InternalEntityMockDSL.g:24087:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            {
+            // InternalEntityMockDSL.g:24087:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            // InternalEntityMockDSL.g:24088:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); 
+            }
+            // InternalEntityMockDSL.g:24089:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            // InternalEntityMockDSL.g:24089:3: rule__XBooleanLiteral__Alternatives_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XBooleanLiteral__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XNullLiteral__Group__0"
+    // InternalEntityMockDSL.g:24098:1: rule__XNullLiteral__Group__0 : rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 ;
+    public final void rule__XNullLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24102:1: ( rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 )
+            // InternalEntityMockDSL.g:24103:2: rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1
+            {
+            pushFollow(FOLLOW_168);
+            rule__XNullLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XNullLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNullLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XNullLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:24110:1: rule__XNullLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XNullLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24114:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24115:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24115:1: ( () )
+            // InternalEntityMockDSL.g:24116:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24117:2: ()
+            // InternalEntityMockDSL.g:24117:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNullLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XNullLiteral__Group__1"
+    // InternalEntityMockDSL.g:24125:1: rule__XNullLiteral__Group__1 : rule__XNullLiteral__Group__1__Impl ;
+    public final void rule__XNullLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24129:1: ( rule__XNullLiteral__Group__1__Impl )
+            // InternalEntityMockDSL.g:24130:2: rule__XNullLiteral__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XNullLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNullLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XNullLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:24136:1: rule__XNullLiteral__Group__1__Impl : ( 'null' ) ;
+    public final void rule__XNullLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24140:1: ( ( 'null' ) )
+            // InternalEntityMockDSL.g:24141:1: ( 'null' )
+            {
+            // InternalEntityMockDSL.g:24141:1: ( 'null' )
+            // InternalEntityMockDSL.g:24142:2: 'null'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); 
+            }
+            match(input,137,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNullLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XNumberLiteral__Group__0"
+    // InternalEntityMockDSL.g:24152:1: rule__XNumberLiteral__Group__0 : rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 ;
+    public final void rule__XNumberLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24156:1: ( rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 )
+            // InternalEntityMockDSL.g:24157:2: rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1
+            {
+            pushFollow(FOLLOW_169);
+            rule__XNumberLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XNumberLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNumberLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XNumberLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:24164:1: rule__XNumberLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XNumberLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24168:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24169:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24169:1: ( () )
+            // InternalEntityMockDSL.g:24170:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24171:2: ()
+            // InternalEntityMockDSL.g:24171:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNumberLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XNumberLiteral__Group__1"
+    // InternalEntityMockDSL.g:24179:1: rule__XNumberLiteral__Group__1 : rule__XNumberLiteral__Group__1__Impl ;
+    public final void rule__XNumberLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24183:1: ( rule__XNumberLiteral__Group__1__Impl )
+            // InternalEntityMockDSL.g:24184:2: rule__XNumberLiteral__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XNumberLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNumberLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XNumberLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:24190:1: rule__XNumberLiteral__Group__1__Impl : ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) ;
+    public final void rule__XNumberLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24194:1: ( ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:24195:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:24195:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            // InternalEntityMockDSL.g:24196:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:24197:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            // InternalEntityMockDSL.g:24197:3: rule__XNumberLiteral__ValueAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XNumberLiteral__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNumberLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XStringLiteral__Group__0"
+    // InternalEntityMockDSL.g:24206:1: rule__XStringLiteral__Group__0 : rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 ;
+    public final void rule__XStringLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24210:1: ( rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 )
+            // InternalEntityMockDSL.g:24211:2: rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1
+            {
+            pushFollow(FOLLOW_13);
+            rule__XStringLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XStringLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XStringLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XStringLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:24218:1: rule__XStringLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XStringLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24222:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24223:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24223:1: ( () )
+            // InternalEntityMockDSL.g:24224:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24225:2: ()
+            // InternalEntityMockDSL.g:24225:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XStringLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XStringLiteral__Group__1"
+    // InternalEntityMockDSL.g:24233:1: rule__XStringLiteral__Group__1 : rule__XStringLiteral__Group__1__Impl ;
+    public final void rule__XStringLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24237:1: ( rule__XStringLiteral__Group__1__Impl )
+            // InternalEntityMockDSL.g:24238:2: rule__XStringLiteral__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XStringLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XStringLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XStringLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:24244:1: rule__XStringLiteral__Group__1__Impl : ( ( rule__XStringLiteral__ValueAssignment_1 ) ) ;
+    public final void rule__XStringLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24248:1: ( ( ( rule__XStringLiteral__ValueAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:24249:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:24249:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            // InternalEntityMockDSL.g:24250:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:24251:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            // InternalEntityMockDSL.g:24251:3: rule__XStringLiteral__ValueAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XStringLiteral__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XStringLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__0"
+    // InternalEntityMockDSL.g:24260:1: rule__XTypeLiteral__Group__0 : rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 ;
+    public final void rule__XTypeLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24264:1: ( rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 )
+            // InternalEntityMockDSL.g:24265:2: rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1
+            {
+            pushFollow(FOLLOW_170);
+            rule__XTypeLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__0"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__0__Impl"
+    // InternalEntityMockDSL.g:24272:1: rule__XTypeLiteral__Group__0__Impl : ( () ) ;
+    public final void rule__XTypeLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24276:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24277:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24277:1: ( () )
+            // InternalEntityMockDSL.g:24278:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24279:2: ()
+            // InternalEntityMockDSL.g:24279:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__1"
+    // InternalEntityMockDSL.g:24287:1: rule__XTypeLiteral__Group__1 : rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 ;
+    public final void rule__XTypeLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24291:1: ( rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 )
+            // InternalEntityMockDSL.g:24292:2: rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XTypeLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__1"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__1__Impl"
+    // InternalEntityMockDSL.g:24299:1: rule__XTypeLiteral__Group__1__Impl : ( 'typeof' ) ;
+    public final void rule__XTypeLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24303:1: ( ( 'typeof' ) )
+            // InternalEntityMockDSL.g:24304:1: ( 'typeof' )
+            {
+            // InternalEntityMockDSL.g:24304:1: ( 'typeof' )
+            // InternalEntityMockDSL.g:24305:2: 'typeof'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); 
+            }
+            match(input,138,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__2"
+    // InternalEntityMockDSL.g:24314:1: rule__XTypeLiteral__Group__2 : rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 ;
+    public final void rule__XTypeLiteral__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24318:1: ( rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 )
+            // InternalEntityMockDSL.g:24319:2: rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3
+            {
+            pushFollow(FOLLOW_7);
+            rule__XTypeLiteral__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__2"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__2__Impl"
+    // InternalEntityMockDSL.g:24326:1: rule__XTypeLiteral__Group__2__Impl : ( '(' ) ;
+    public final void rule__XTypeLiteral__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24330:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:24331:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:24331:1: ( '(' )
+            // InternalEntityMockDSL.g:24332:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__3"
+    // InternalEntityMockDSL.g:24341:1: rule__XTypeLiteral__Group__3 : rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 ;
+    public final void rule__XTypeLiteral__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24345:1: ( rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 )
+            // InternalEntityMockDSL.g:24346:2: rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4
+            {
+            pushFollow(FOLLOW_171);
+            rule__XTypeLiteral__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__3"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__3__Impl"
+    // InternalEntityMockDSL.g:24353:1: rule__XTypeLiteral__Group__3__Impl : ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) ;
+    public final void rule__XTypeLiteral__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24357:1: ( ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:24358:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:24358:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            // InternalEntityMockDSL.g:24359:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:24360:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            // InternalEntityMockDSL.g:24360:3: rule__XTypeLiteral__TypeAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__TypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__4"
+    // InternalEntityMockDSL.g:24368:1: rule__XTypeLiteral__Group__4 : rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 ;
+    public final void rule__XTypeLiteral__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24372:1: ( rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 )
+            // InternalEntityMockDSL.g:24373:2: rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5
+            {
+            pushFollow(FOLLOW_171);
+            rule__XTypeLiteral__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__4"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__4__Impl"
+    // InternalEntityMockDSL.g:24380:1: rule__XTypeLiteral__Group__4__Impl : ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) ;
+    public final void rule__XTypeLiteral__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24384:1: ( ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) )
+            // InternalEntityMockDSL.g:24385:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            {
+            // InternalEntityMockDSL.g:24385:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            // InternalEntityMockDSL.g:24386:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:24387:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            loop193:
+            do {
+                int alt193=2;
+                int LA193_0 = input.LA(1);
+
+                if ( (LA193_0==125) ) {
+                    alt193=1;
+                }
+
+
+                switch (alt193) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:24387:3: rule__XTypeLiteral__ArrayDimensionsAssignment_4
+            	    {
+            	    pushFollow(FOLLOW_172);
+            	    rule__XTypeLiteral__ArrayDimensionsAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop193;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__5"
+    // InternalEntityMockDSL.g:24395:1: rule__XTypeLiteral__Group__5 : rule__XTypeLiteral__Group__5__Impl ;
+    public final void rule__XTypeLiteral__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24399:1: ( rule__XTypeLiteral__Group__5__Impl )
+            // InternalEntityMockDSL.g:24400:2: rule__XTypeLiteral__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTypeLiteral__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__5"
+
+
+    // $ANTLR start "rule__XTypeLiteral__Group__5__Impl"
+    // InternalEntityMockDSL.g:24406:1: rule__XTypeLiteral__Group__5__Impl : ( ')' ) ;
+    public final void rule__XTypeLiteral__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24410:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:24411:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:24411:1: ( ')' )
+            // InternalEntityMockDSL.g:24412:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__Group__5__Impl"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__0"
+    // InternalEntityMockDSL.g:24422:1: rule__XThrowExpression__Group__0 : rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 ;
+    public final void rule__XThrowExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24426:1: ( rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 )
+            // InternalEntityMockDSL.g:24427:2: rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1
+            {
+            pushFollow(FOLLOW_173);
+            rule__XThrowExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XThrowExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__0"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:24434:1: rule__XThrowExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XThrowExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24438:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24439:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24439:1: ( () )
+            // InternalEntityMockDSL.g:24440:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24441:2: ()
+            // InternalEntityMockDSL.g:24441:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__1"
+    // InternalEntityMockDSL.g:24449:1: rule__XThrowExpression__Group__1 : rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 ;
+    public final void rule__XThrowExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24453:1: ( rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 )
+            // InternalEntityMockDSL.g:24454:2: rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XThrowExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XThrowExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__1"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:24461:1: rule__XThrowExpression__Group__1__Impl : ( 'throw' ) ;
+    public final void rule__XThrowExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24465:1: ( ( 'throw' ) )
+            // InternalEntityMockDSL.g:24466:1: ( 'throw' )
+            {
+            // InternalEntityMockDSL.g:24466:1: ( 'throw' )
+            // InternalEntityMockDSL.g:24467:2: 'throw'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); 
+            }
+            match(input,139,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__2"
+    // InternalEntityMockDSL.g:24476:1: rule__XThrowExpression__Group__2 : rule__XThrowExpression__Group__2__Impl ;
+    public final void rule__XThrowExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24480:1: ( rule__XThrowExpression__Group__2__Impl )
+            // InternalEntityMockDSL.g:24481:2: rule__XThrowExpression__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XThrowExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__2"
+
+
+    // $ANTLR start "rule__XThrowExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:24487:1: rule__XThrowExpression__Group__2__Impl : ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) ;
+    public final void rule__XThrowExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24491:1: ( ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:24492:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:24492:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            // InternalEntityMockDSL.g:24493:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:24494:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            // InternalEntityMockDSL.g:24494:3: rule__XThrowExpression__ExpressionAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XThrowExpression__ExpressionAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__0"
+    // InternalEntityMockDSL.g:24503:1: rule__XReturnExpression__Group__0 : rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 ;
+    public final void rule__XReturnExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24507:1: ( rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 )
+            // InternalEntityMockDSL.g:24508:2: rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1
+            {
+            pushFollow(FOLLOW_174);
+            rule__XReturnExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XReturnExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__0"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:24515:1: rule__XReturnExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XReturnExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24519:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24520:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24520:1: ( () )
+            // InternalEntityMockDSL.g:24521:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24522:2: ()
+            // InternalEntityMockDSL.g:24522:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__1"
+    // InternalEntityMockDSL.g:24530:1: rule__XReturnExpression__Group__1 : rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 ;
+    public final void rule__XReturnExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24534:1: ( rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 )
+            // InternalEntityMockDSL.g:24535:2: rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XReturnExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XReturnExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__1"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:24542:1: rule__XReturnExpression__Group__1__Impl : ( 'return' ) ;
+    public final void rule__XReturnExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24546:1: ( ( 'return' ) )
+            // InternalEntityMockDSL.g:24547:1: ( 'return' )
+            {
+            // InternalEntityMockDSL.g:24547:1: ( 'return' )
+            // InternalEntityMockDSL.g:24548:2: 'return'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); 
+            }
+            match(input,140,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__2"
+    // InternalEntityMockDSL.g:24557:1: rule__XReturnExpression__Group__2 : rule__XReturnExpression__Group__2__Impl ;
+    public final void rule__XReturnExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24561:1: ( rule__XReturnExpression__Group__2__Impl )
+            // InternalEntityMockDSL.g:24562:2: rule__XReturnExpression__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XReturnExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__2"
+
+
+    // $ANTLR start "rule__XReturnExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:24568:1: rule__XReturnExpression__Group__2__Impl : ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) ;
+    public final void rule__XReturnExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24572:1: ( ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) )
+            // InternalEntityMockDSL.g:24573:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            {
+            // InternalEntityMockDSL.g:24573:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            // InternalEntityMockDSL.g:24574:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:24575:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            int alt194=2;
+            alt194 = dfa194.predict(input);
+            switch (alt194) {
+                case 1 :
+                    // InternalEntityMockDSL.g:24575:3: rule__XReturnExpression__ExpressionAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XReturnExpression__ExpressionAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0"
+    // InternalEntityMockDSL.g:24584:1: rule__XTryCatchFinallyExpression__Group__0 : rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 ;
+    public final void rule__XTryCatchFinallyExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24588:1: ( rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 )
+            // InternalEntityMockDSL.g:24589:2: rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1
+            {
+            pushFollow(FOLLOW_175);
+            rule__XTryCatchFinallyExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__0"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:24596:1: rule__XTryCatchFinallyExpression__Group__0__Impl : ( () ) ;
+    public final void rule__XTryCatchFinallyExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24600:1: ( ( () ) )
+            // InternalEntityMockDSL.g:24601:1: ( () )
+            {
+            // InternalEntityMockDSL.g:24601:1: ( () )
+            // InternalEntityMockDSL.g:24602:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); 
+            }
+            // InternalEntityMockDSL.g:24603:2: ()
+            // InternalEntityMockDSL.g:24603:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1"
+    // InternalEntityMockDSL.g:24611:1: rule__XTryCatchFinallyExpression__Group__1 : rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 ;
+    public final void rule__XTryCatchFinallyExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24615:1: ( rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 )
+            // InternalEntityMockDSL.g:24616:2: rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2
+            {
+            pushFollow(FOLLOW_106);
+            rule__XTryCatchFinallyExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:24623:1: rule__XTryCatchFinallyExpression__Group__1__Impl : ( 'try' ) ;
+    public final void rule__XTryCatchFinallyExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24627:1: ( ( 'try' ) )
+            // InternalEntityMockDSL.g:24628:1: ( 'try' )
+            {
+            // InternalEntityMockDSL.g:24628:1: ( 'try' )
+            // InternalEntityMockDSL.g:24629:2: 'try'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); 
+            }
+            match(input,141,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2"
+    // InternalEntityMockDSL.g:24638:1: rule__XTryCatchFinallyExpression__Group__2 : rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 ;
+    public final void rule__XTryCatchFinallyExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24642:1: ( rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 )
+            // InternalEntityMockDSL.g:24643:2: rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3
+            {
+            pushFollow(FOLLOW_176);
+            rule__XTryCatchFinallyExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__2"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:24650:1: rule__XTryCatchFinallyExpression__Group__2__Impl : ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24654:1: ( ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:24655:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:24655:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            // InternalEntityMockDSL.g:24656:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:24657:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            // InternalEntityMockDSL.g:24657:3: rule__XTryCatchFinallyExpression__ExpressionAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__ExpressionAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3"
+    // InternalEntityMockDSL.g:24665:1: rule__XTryCatchFinallyExpression__Group__3 : rule__XTryCatchFinallyExpression__Group__3__Impl ;
+    public final void rule__XTryCatchFinallyExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24669:1: ( rule__XTryCatchFinallyExpression__Group__3__Impl )
+            // InternalEntityMockDSL.g:24670:2: rule__XTryCatchFinallyExpression__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__3"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:24676:1: rule__XTryCatchFinallyExpression__Group__3__Impl : ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24680:1: ( ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) )
+            // InternalEntityMockDSL.g:24681:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            {
+            // InternalEntityMockDSL.g:24681:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            // InternalEntityMockDSL.g:24682:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); 
+            }
+            // InternalEntityMockDSL.g:24683:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            // InternalEntityMockDSL.g:24683:3: rule__XTryCatchFinallyExpression__Alternatives_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0"
+    // InternalEntityMockDSL.g:24692:1: rule__XTryCatchFinallyExpression__Group_3_0__0 : rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24696:1: ( rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 )
+            // InternalEntityMockDSL.g:24697:2: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1
+            {
+            pushFollow(FOLLOW_177);
+            rule__XTryCatchFinallyExpression__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0__0"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0__Impl"
+    // InternalEntityMockDSL.g:24704:1: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl : ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24708:1: ( ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) )
+            // InternalEntityMockDSL.g:24709:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            {
+            // InternalEntityMockDSL.g:24709:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            // InternalEntityMockDSL.g:24710:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            {
+            // InternalEntityMockDSL.g:24710:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) )
+            // InternalEntityMockDSL.g:24711:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:24712:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            // InternalEntityMockDSL.g:24712:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            {
+            pushFollow(FOLLOW_178);
+            rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:24715:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            // InternalEntityMockDSL.g:24716:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:24717:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            loop195:
+            do {
+                int alt195=2;
+                int LA195_0 = input.LA(1);
+
+                if ( (LA195_0==144) ) {
+                    int LA195_2 = input.LA(2);
+
+                    if ( (synpred262_InternalEntityMockDSL()) ) {
+                        alt195=1;
+                    }
+
+
+                }
+
+
+                switch (alt195) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:24717:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            	    {
+            	    pushFollow(FOLLOW_178);
+            	    rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop195;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1"
+    // InternalEntityMockDSL.g:24726:1: rule__XTryCatchFinallyExpression__Group_3_0__1 : rule__XTryCatchFinallyExpression__Group_3_0__1__Impl ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24730:1: ( rule__XTryCatchFinallyExpression__Group_3_0__1__Impl )
+            // InternalEntityMockDSL.g:24731:2: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0__1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1__Impl"
+    // InternalEntityMockDSL.g:24737:1: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl : ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24741:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) )
+            // InternalEntityMockDSL.g:24742:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:24742:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            // InternalEntityMockDSL.g:24743:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); 
+            }
+            // InternalEntityMockDSL.g:24744:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            int alt196=2;
+            int LA196_0 = input.LA(1);
+
+            if ( (LA196_0==142) ) {
+                int LA196_1 = input.LA(2);
+
+                if ( (synpred263_InternalEntityMockDSL()) ) {
+                    alt196=1;
+                }
+            }
+            switch (alt196) {
+                case 1 :
+                    // InternalEntityMockDSL.g:24744:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XTryCatchFinallyExpression__Group_3_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0"
+    // InternalEntityMockDSL.g:24753:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0 : rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24757:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 )
+            // InternalEntityMockDSL.g:24758:2: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0_1__0"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl"
+    // InternalEntityMockDSL.g:24765:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl : ( ( 'finally' ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24769:1: ( ( ( 'finally' ) ) )
+            // InternalEntityMockDSL.g:24770:1: ( ( 'finally' ) )
+            {
+            // InternalEntityMockDSL.g:24770:1: ( ( 'finally' ) )
+            // InternalEntityMockDSL.g:24771:2: ( 'finally' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:24772:2: ( 'finally' )
+            // InternalEntityMockDSL.g:24772:3: 'finally'
+            {
+            match(input,142,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1"
+    // InternalEntityMockDSL.g:24780:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1 : rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24784:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl )
+            // InternalEntityMockDSL.g:24785:2: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0_1__1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl"
+    // InternalEntityMockDSL.g:24791:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24795:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) )
+            // InternalEntityMockDSL.g:24796:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:24796:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            // InternalEntityMockDSL.g:24797:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:24798:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            // InternalEntityMockDSL.g:24798:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0"
+    // InternalEntityMockDSL.g:24807:1: rule__XTryCatchFinallyExpression__Group_3_1__0 : rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24811:1: ( rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 )
+            // InternalEntityMockDSL.g:24812:2: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XTryCatchFinallyExpression__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_1__0"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0__Impl"
+    // InternalEntityMockDSL.g:24819:1: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl : ( 'finally' ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24823:1: ( ( 'finally' ) )
+            // InternalEntityMockDSL.g:24824:1: ( 'finally' )
+            {
+            // InternalEntityMockDSL.g:24824:1: ( 'finally' )
+            // InternalEntityMockDSL.g:24825:2: 'finally'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); 
+            }
+            match(input,142,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1"
+    // InternalEntityMockDSL.g:24834:1: rule__XTryCatchFinallyExpression__Group_3_1__1 : rule__XTryCatchFinallyExpression__Group_3_1__1__Impl ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24838:1: ( rule__XTryCatchFinallyExpression__Group_3_1__1__Impl )
+            // InternalEntityMockDSL.g:24839:2: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_1__1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1__Impl"
+    // InternalEntityMockDSL.g:24845:1: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) ;
+    public final void rule__XTryCatchFinallyExpression__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24849:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) )
+            // InternalEntityMockDSL.g:24850:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:24850:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            // InternalEntityMockDSL.g:24851:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); 
+            }
+            // InternalEntityMockDSL.g:24852:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            // InternalEntityMockDSL.g:24852:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__0"
+    // InternalEntityMockDSL.g:24861:1: rule__XSynchronizedExpression__Group__0 : rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 ;
+    public final void rule__XSynchronizedExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24865:1: ( rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 )
+            // InternalEntityMockDSL.g:24866:2: rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1
+            {
+            pushFollow(FOLLOW_106);
+            rule__XSynchronizedExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__0"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__0__Impl"
+    // InternalEntityMockDSL.g:24873:1: rule__XSynchronizedExpression__Group__0__Impl : ( ( rule__XSynchronizedExpression__Group_0__0 ) ) ;
+    public final void rule__XSynchronizedExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24877:1: ( ( ( rule__XSynchronizedExpression__Group_0__0 ) ) )
+            // InternalEntityMockDSL.g:24878:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:24878:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            // InternalEntityMockDSL.g:24879:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:24880:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            // InternalEntityMockDSL.g:24880:3: rule__XSynchronizedExpression__Group_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__1"
+    // InternalEntityMockDSL.g:24888:1: rule__XSynchronizedExpression__Group__1 : rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 ;
+    public final void rule__XSynchronizedExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24892:1: ( rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 )
+            // InternalEntityMockDSL.g:24893:2: rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2
+            {
+            pushFollow(FOLLOW_63);
+            rule__XSynchronizedExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__1"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__1__Impl"
+    // InternalEntityMockDSL.g:24900:1: rule__XSynchronizedExpression__Group__1__Impl : ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) ;
+    public final void rule__XSynchronizedExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24904:1: ( ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:24905:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:24905:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            // InternalEntityMockDSL.g:24906:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:24907:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            // InternalEntityMockDSL.g:24907:3: rule__XSynchronizedExpression__ParamAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__ParamAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__2"
+    // InternalEntityMockDSL.g:24915:1: rule__XSynchronizedExpression__Group__2 : rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 ;
+    public final void rule__XSynchronizedExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24919:1: ( rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 )
+            // InternalEntityMockDSL.g:24920:2: rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3
+            {
+            pushFollow(FOLLOW_106);
+            rule__XSynchronizedExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__2"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__2__Impl"
+    // InternalEntityMockDSL.g:24927:1: rule__XSynchronizedExpression__Group__2__Impl : ( ')' ) ;
+    public final void rule__XSynchronizedExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24931:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:24932:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:24932:1: ( ')' )
+            // InternalEntityMockDSL.g:24933:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__3"
+    // InternalEntityMockDSL.g:24942:1: rule__XSynchronizedExpression__Group__3 : rule__XSynchronizedExpression__Group__3__Impl ;
+    public final void rule__XSynchronizedExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24946:1: ( rule__XSynchronizedExpression__Group__3__Impl )
+            // InternalEntityMockDSL.g:24947:2: rule__XSynchronizedExpression__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__3"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group__3__Impl"
+    // InternalEntityMockDSL.g:24953:1: rule__XSynchronizedExpression__Group__3__Impl : ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) ;
+    public final void rule__XSynchronizedExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24957:1: ( ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) )
+            // InternalEntityMockDSL.g:24958:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            {
+            // InternalEntityMockDSL.g:24958:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            // InternalEntityMockDSL.g:24959:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); 
+            }
+            // InternalEntityMockDSL.g:24960:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            // InternalEntityMockDSL.g:24960:3: rule__XSynchronizedExpression__ExpressionAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__ExpressionAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0__0"
+    // InternalEntityMockDSL.g:24969:1: rule__XSynchronizedExpression__Group_0__0 : rule__XSynchronizedExpression__Group_0__0__Impl ;
+    public final void rule__XSynchronizedExpression__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24973:1: ( rule__XSynchronizedExpression__Group_0__0__Impl )
+            // InternalEntityMockDSL.g:24974:2: rule__XSynchronizedExpression__Group_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0__0"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:24980:1: rule__XSynchronizedExpression__Group_0__0__Impl : ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) ;
+    public final void rule__XSynchronizedExpression__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:24984:1: ( ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:24985:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:24985:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            // InternalEntityMockDSL.g:24986:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); 
+            }
+            // InternalEntityMockDSL.g:24987:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            // InternalEntityMockDSL.g:24987:3: rule__XSynchronizedExpression__Group_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0"
+    // InternalEntityMockDSL.g:24996:1: rule__XSynchronizedExpression__Group_0_0__0 : rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 ;
+    public final void rule__XSynchronizedExpression__Group_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25000:1: ( rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 )
+            // InternalEntityMockDSL.g:25001:2: rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1
+            {
+            pushFollow(FOLLOW_179);
+            rule__XSynchronizedExpression__Group_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__0"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0__Impl"
+    // InternalEntityMockDSL.g:25008:1: rule__XSynchronizedExpression__Group_0_0__0__Impl : ( () ) ;
+    public final void rule__XSynchronizedExpression__Group_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25012:1: ( ( () ) )
+            // InternalEntityMockDSL.g:25013:1: ( () )
+            {
+            // InternalEntityMockDSL.g:25013:1: ( () )
+            // InternalEntityMockDSL.g:25014:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:25015:2: ()
+            // InternalEntityMockDSL.g:25015:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1"
+    // InternalEntityMockDSL.g:25023:1: rule__XSynchronizedExpression__Group_0_0__1 : rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 ;
+    public final void rule__XSynchronizedExpression__Group_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25027:1: ( rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 )
+            // InternalEntityMockDSL.g:25028:2: rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2
+            {
+            pushFollow(FOLLOW_27);
+            rule__XSynchronizedExpression__Group_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__1"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1__Impl"
+    // InternalEntityMockDSL.g:25035:1: rule__XSynchronizedExpression__Group_0_0__1__Impl : ( 'synchronized' ) ;
+    public final void rule__XSynchronizedExpression__Group_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25039:1: ( ( 'synchronized' ) )
+            // InternalEntityMockDSL.g:25040:1: ( 'synchronized' )
+            {
+            // InternalEntityMockDSL.g:25040:1: ( 'synchronized' )
+            // InternalEntityMockDSL.g:25041:2: 'synchronized'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); 
+            }
+            match(input,143,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2"
+    // InternalEntityMockDSL.g:25050:1: rule__XSynchronizedExpression__Group_0_0__2 : rule__XSynchronizedExpression__Group_0_0__2__Impl ;
+    public final void rule__XSynchronizedExpression__Group_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25054:1: ( rule__XSynchronizedExpression__Group_0_0__2__Impl )
+            // InternalEntityMockDSL.g:25055:2: rule__XSynchronizedExpression__Group_0_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XSynchronizedExpression__Group_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__2"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2__Impl"
+    // InternalEntityMockDSL.g:25061:1: rule__XSynchronizedExpression__Group_0_0__2__Impl : ( '(' ) ;
+    public final void rule__XSynchronizedExpression__Group_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25065:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:25066:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:25066:1: ( '(' )
+            // InternalEntityMockDSL.g:25067:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__Group_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__0"
+    // InternalEntityMockDSL.g:25077:1: rule__XCatchClause__Group__0 : rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 ;
+    public final void rule__XCatchClause__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25081:1: ( rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 )
+            // InternalEntityMockDSL.g:25082:2: rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__XCatchClause__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__0"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__0__Impl"
+    // InternalEntityMockDSL.g:25089:1: rule__XCatchClause__Group__0__Impl : ( ( 'catch' ) ) ;
+    public final void rule__XCatchClause__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25093:1: ( ( ( 'catch' ) ) )
+            // InternalEntityMockDSL.g:25094:1: ( ( 'catch' ) )
+            {
+            // InternalEntityMockDSL.g:25094:1: ( ( 'catch' ) )
+            // InternalEntityMockDSL.g:25095:2: ( 'catch' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); 
+            }
+            // InternalEntityMockDSL.g:25096:2: ( 'catch' )
+            // InternalEntityMockDSL.g:25096:3: 'catch'
+            {
+            match(input,144,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__1"
+    // InternalEntityMockDSL.g:25104:1: rule__XCatchClause__Group__1 : rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 ;
+    public final void rule__XCatchClause__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25108:1: ( rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 )
+            // InternalEntityMockDSL.g:25109:2: rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2
+            {
+            pushFollow(FOLLOW_50);
+            rule__XCatchClause__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__1"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__1__Impl"
+    // InternalEntityMockDSL.g:25116:1: rule__XCatchClause__Group__1__Impl : ( '(' ) ;
+    public final void rule__XCatchClause__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25120:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:25121:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:25121:1: ( '(' )
+            // InternalEntityMockDSL.g:25122:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__2"
+    // InternalEntityMockDSL.g:25131:1: rule__XCatchClause__Group__2 : rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 ;
+    public final void rule__XCatchClause__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25135:1: ( rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 )
+            // InternalEntityMockDSL.g:25136:2: rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3
+            {
+            pushFollow(FOLLOW_63);
+            rule__XCatchClause__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__2"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__2__Impl"
+    // InternalEntityMockDSL.g:25143:1: rule__XCatchClause__Group__2__Impl : ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) ;
+    public final void rule__XCatchClause__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25147:1: ( ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:25148:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:25148:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            // InternalEntityMockDSL.g:25149:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:25150:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            // InternalEntityMockDSL.g:25150:3: rule__XCatchClause__DeclaredParamAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__DeclaredParamAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__3"
+    // InternalEntityMockDSL.g:25158:1: rule__XCatchClause__Group__3 : rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 ;
+    public final void rule__XCatchClause__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25162:1: ( rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 )
+            // InternalEntityMockDSL.g:25163:2: rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4
+            {
+            pushFollow(FOLLOW_106);
+            rule__XCatchClause__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__3"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__3__Impl"
+    // InternalEntityMockDSL.g:25170:1: rule__XCatchClause__Group__3__Impl : ( ')' ) ;
+    public final void rule__XCatchClause__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25174:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:25175:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:25175:1: ( ')' )
+            // InternalEntityMockDSL.g:25176:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__4"
+    // InternalEntityMockDSL.g:25185:1: rule__XCatchClause__Group__4 : rule__XCatchClause__Group__4__Impl ;
+    public final void rule__XCatchClause__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25189:1: ( rule__XCatchClause__Group__4__Impl )
+            // InternalEntityMockDSL.g:25190:2: rule__XCatchClause__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__4"
+
+
+    // $ANTLR start "rule__XCatchClause__Group__4__Impl"
+    // InternalEntityMockDSL.g:25196:1: rule__XCatchClause__Group__4__Impl : ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) ;
+    public final void rule__XCatchClause__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25200:1: ( ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) )
+            // InternalEntityMockDSL.g:25201:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            {
+            // InternalEntityMockDSL.g:25201:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            // InternalEntityMockDSL.g:25202:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); 
+            }
+            // InternalEntityMockDSL.g:25203:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            // InternalEntityMockDSL.g:25203:3: rule__XCatchClause__ExpressionAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__XCatchClause__ExpressionAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__Group__4__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__0"
+    // InternalEntityMockDSL.g:25212:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
+    public final void rule__QualifiedName__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25216:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
+            // InternalEntityMockDSL.g:25217:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__QualifiedName__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__0__Impl"
+    // InternalEntityMockDSL.g:25224:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedName__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25228:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:25229:1: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:25229:1: ( ruleValidID )
+            // InternalEntityMockDSL.g:25230:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__1"
+    // InternalEntityMockDSL.g:25239:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
+    public final void rule__QualifiedName__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25243:1: ( rule__QualifiedName__Group__1__Impl )
+            // InternalEntityMockDSL.g:25244:2: rule__QualifiedName__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__1__Impl"
+    // InternalEntityMockDSL.g:25250:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
+    public final void rule__QualifiedName__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25254:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
+            // InternalEntityMockDSL.g:25255:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:25255:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalEntityMockDSL.g:25256:2: ( rule__QualifiedName__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:25257:2: ( rule__QualifiedName__Group_1__0 )*
+            loop197:
+            do {
+                int alt197=2;
+                int LA197_0 = input.LA(1);
+
+                if ( (LA197_0==44) ) {
+                    int LA197_2 = input.LA(2);
+
+                    if ( (LA197_2==RULE_ID) ) {
+                        int LA197_3 = input.LA(3);
+
+                        if ( (synpred264_InternalEntityMockDSL()) ) {
+                            alt197=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt197) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:25257:3: rule__QualifiedName__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_180);
+            	    rule__QualifiedName__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop197;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__0"
+    // InternalEntityMockDSL.g:25266:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
+    public final void rule__QualifiedName__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25270:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
+            // InternalEntityMockDSL.g:25271:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__QualifiedName__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__0"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:25278:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
+    public final void rule__QualifiedName__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25282:1: ( ( ( '.' ) ) )
+            // InternalEntityMockDSL.g:25283:1: ( ( '.' ) )
+            {
+            // InternalEntityMockDSL.g:25283:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:25284:2: ( '.' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+            }
+            // InternalEntityMockDSL.g:25285:2: ( '.' )
+            // InternalEntityMockDSL.g:25285:3: '.'
+            {
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__1"
+    // InternalEntityMockDSL.g:25293:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
+    public final void rule__QualifiedName__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25297:1: ( rule__QualifiedName__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:25298:2: rule__QualifiedName__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__1"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:25304:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedName__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25308:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:25309:1: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:25309:1: ( ruleValidID )
+            // InternalEntityMockDSL.g:25310:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__Number__Group_1__0"
+    // InternalEntityMockDSL.g:25320:1: rule__Number__Group_1__0 : rule__Number__Group_1__0__Impl rule__Number__Group_1__1 ;
+    public final void rule__Number__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25324:1: ( rule__Number__Group_1__0__Impl rule__Number__Group_1__1 )
+            // InternalEntityMockDSL.g:25325:2: rule__Number__Group_1__0__Impl rule__Number__Group_1__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__Number__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Number__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1__0"
+
+
+    // $ANTLR start "rule__Number__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:25332:1: rule__Number__Group_1__0__Impl : ( ( rule__Number__Alternatives_1_0 ) ) ;
+    public final void rule__Number__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25336:1: ( ( ( rule__Number__Alternatives_1_0 ) ) )
+            // InternalEntityMockDSL.g:25337:1: ( ( rule__Number__Alternatives_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:25337:1: ( ( rule__Number__Alternatives_1_0 ) )
+            // InternalEntityMockDSL.g:25338:2: ( rule__Number__Alternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberAccess().getAlternatives_1_0()); 
+            }
+            // InternalEntityMockDSL.g:25339:2: ( rule__Number__Alternatives_1_0 )
+            // InternalEntityMockDSL.g:25339:3: rule__Number__Alternatives_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__Number__Alternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberAccess().getAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__Number__Group_1__1"
+    // InternalEntityMockDSL.g:25347:1: rule__Number__Group_1__1 : rule__Number__Group_1__1__Impl ;
+    public final void rule__Number__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25351:1: ( rule__Number__Group_1__1__Impl )
+            // InternalEntityMockDSL.g:25352:2: rule__Number__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Number__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1__1"
+
+
+    // $ANTLR start "rule__Number__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:25358:1: rule__Number__Group_1__1__Impl : ( ( rule__Number__Group_1_1__0 )? ) ;
+    public final void rule__Number__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25362:1: ( ( ( rule__Number__Group_1_1__0 )? ) )
+            // InternalEntityMockDSL.g:25363:1: ( ( rule__Number__Group_1_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:25363:1: ( ( rule__Number__Group_1_1__0 )? )
+            // InternalEntityMockDSL.g:25364:2: ( rule__Number__Group_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberAccess().getGroup_1_1()); 
+            }
+            // InternalEntityMockDSL.g:25365:2: ( rule__Number__Group_1_1__0 )?
+            int alt198=2;
+            int LA198_0 = input.LA(1);
+
+            if ( (LA198_0==44) ) {
+                int LA198_1 = input.LA(2);
+
+                if ( ((LA198_1>=RULE_INT && LA198_1<=RULE_DECIMAL)) ) {
+                    alt198=1;
+                }
+            }
+            switch (alt198) {
+                case 1 :
+                    // InternalEntityMockDSL.g:25365:3: rule__Number__Group_1_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__Number__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberAccess().getGroup_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__Number__Group_1_1__0"
+    // InternalEntityMockDSL.g:25374:1: rule__Number__Group_1_1__0 : rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 ;
+    public final void rule__Number__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25378:1: ( rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 )
+            // InternalEntityMockDSL.g:25379:2: rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1
+            {
+            pushFollow(FOLLOW_181);
+            rule__Number__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Number__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1_1__0"
+
+
+    // $ANTLR start "rule__Number__Group_1_1__0__Impl"
+    // InternalEntityMockDSL.g:25386:1: rule__Number__Group_1_1__0__Impl : ( '.' ) ;
+    public final void rule__Number__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25390:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:25391:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:25391:1: ( '.' )
+            // InternalEntityMockDSL.g:25392:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Number__Group_1_1__1"
+    // InternalEntityMockDSL.g:25401:1: rule__Number__Group_1_1__1 : rule__Number__Group_1_1__1__Impl ;
+    public final void rule__Number__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25405:1: ( rule__Number__Group_1_1__1__Impl )
+            // InternalEntityMockDSL.g:25406:2: rule__Number__Group_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Number__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1_1__1"
+
+
+    // $ANTLR start "rule__Number__Group_1_1__1__Impl"
+    // InternalEntityMockDSL.g:25412:1: rule__Number__Group_1_1__1__Impl : ( ( rule__Number__Alternatives_1_1_1 ) ) ;
+    public final void rule__Number__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25416:1: ( ( ( rule__Number__Alternatives_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:25417:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:25417:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            // InternalEntityMockDSL.g:25418:2: ( rule__Number__Alternatives_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:25419:2: ( rule__Number__Alternatives_1_1_1 )
+            // InternalEntityMockDSL.g:25419:3: rule__Number__Alternatives_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__Number__Alternatives_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Number__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__0"
+    // InternalEntityMockDSL.g:25428:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
+    public final void rule__JvmTypeReference__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25432:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
+            // InternalEntityMockDSL.g:25433:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
+            {
+            pushFollow(FOLLOW_110);
+            rule__JvmTypeReference__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:25440:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
+    public final void rule__JvmTypeReference__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25444:1: ( ( ruleJvmParameterizedTypeReference ) )
+            // InternalEntityMockDSL.g:25445:1: ( ruleJvmParameterizedTypeReference )
+            {
+            // InternalEntityMockDSL.g:25445:1: ( ruleJvmParameterizedTypeReference )
+            // InternalEntityMockDSL.g:25446:2: ruleJvmParameterizedTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__1"
+    // InternalEntityMockDSL.g:25455:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
+    public final void rule__JvmTypeReference__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25459:1: ( rule__JvmTypeReference__Group_0__1__Impl )
+            // InternalEntityMockDSL.g:25460:2: rule__JvmTypeReference__Group_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__1"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:25466:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
+    public final void rule__JvmTypeReference__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25470:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
+            // InternalEntityMockDSL.g:25471:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:25471:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalEntityMockDSL.g:25472:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
+            }
+            // InternalEntityMockDSL.g:25473:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            loop199:
+            do {
+                int alt199=2;
+                int LA199_0 = input.LA(1);
+
+                if ( (LA199_0==125) ) {
+                    int LA199_2 = input.LA(2);
+
+                    if ( (LA199_2==123) ) {
+                        int LA199_3 = input.LA(3);
+
+                        if ( (synpred266_InternalEntityMockDSL()) ) {
+                            alt199=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt199) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:25473:3: rule__JvmTypeReference__Group_0_1__0
+            	    {
+            	    pushFollow(FOLLOW_172);
+            	    rule__JvmTypeReference__Group_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop199;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1__0"
+    // InternalEntityMockDSL.g:25482:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
+    public final void rule__JvmTypeReference__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25486:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
+            // InternalEntityMockDSL.g:25487:2: rule__JvmTypeReference__Group_0_1__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1__0__Impl"
+    // InternalEntityMockDSL.g:25493:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
+    public final void rule__JvmTypeReference__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25497:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
+            // InternalEntityMockDSL.g:25498:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:25498:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalEntityMockDSL.g:25499:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:25500:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalEntityMockDSL.g:25500:3: rule__JvmTypeReference__Group_0_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0"
+    // InternalEntityMockDSL.g:25509:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
+    public final void rule__JvmTypeReference__Group_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25513:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
+            // InternalEntityMockDSL.g:25514:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
+            {
+            pushFollow(FOLLOW_110);
+            rule__JvmTypeReference__Group_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0__Impl"
+    // InternalEntityMockDSL.g:25521:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
+    public final void rule__JvmTypeReference__Group_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25525:1: ( ( () ) )
+            // InternalEntityMockDSL.g:25526:1: ( () )
+            {
+            // InternalEntityMockDSL.g:25526:1: ( () )
+            // InternalEntityMockDSL.g:25527:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:25528:2: ()
+            // InternalEntityMockDSL.g:25528:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1"
+    // InternalEntityMockDSL.g:25536:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
+    public final void rule__JvmTypeReference__Group_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25540:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
+            // InternalEntityMockDSL.g:25541:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__1"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1__Impl"
+    // InternalEntityMockDSL.g:25547:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
+    public final void rule__JvmTypeReference__Group_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25551:1: ( ( ruleArrayBrackets ) )
+            // InternalEntityMockDSL.g:25552:1: ( ruleArrayBrackets )
+            {
+            // InternalEntityMockDSL.g:25552:1: ( ruleArrayBrackets )
+            // InternalEntityMockDSL.g:25553:2: ruleArrayBrackets
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__0"
+    // InternalEntityMockDSL.g:25563:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
+    public final void rule__ArrayBrackets__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25567:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
+            // InternalEntityMockDSL.g:25568:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
+            {
+            pushFollow(FOLLOW_146);
+            rule__ArrayBrackets__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__0"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__0__Impl"
+    // InternalEntityMockDSL.g:25575:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
+    public final void rule__ArrayBrackets__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25579:1: ( ( '[' ) )
+            // InternalEntityMockDSL.g:25580:1: ( '[' )
+            {
+            // InternalEntityMockDSL.g:25580:1: ( '[' )
+            // InternalEntityMockDSL.g:25581:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__1"
+    // InternalEntityMockDSL.g:25590:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
+    public final void rule__ArrayBrackets__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25594:1: ( rule__ArrayBrackets__Group__1__Impl )
+            // InternalEntityMockDSL.g:25595:2: rule__ArrayBrackets__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__1"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__1__Impl"
+    // InternalEntityMockDSL.g:25601:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
+    public final void rule__ArrayBrackets__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25605:1: ( ( ']' ) )
+            // InternalEntityMockDSL.g:25606:1: ( ']' )
+            {
+            // InternalEntityMockDSL.g:25606:1: ( ']' )
+            // InternalEntityMockDSL.g:25607:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+            }
+            match(input,123,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__0"
+    // InternalEntityMockDSL.g:25617:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
+    public final void rule__XFunctionTypeRef__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25621:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
+            // InternalEntityMockDSL.g:25622:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XFunctionTypeRef__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__0__Impl"
+    // InternalEntityMockDSL.g:25629:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
+    public final void rule__XFunctionTypeRef__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25633:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
+            // InternalEntityMockDSL.g:25634:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            {
+            // InternalEntityMockDSL.g:25634:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalEntityMockDSL.g:25635:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
+            }
+            // InternalEntityMockDSL.g:25636:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            int alt200=2;
+            int LA200_0 = input.LA(1);
+
+            if ( (LA200_0==68) ) {
+                alt200=1;
+            }
+            switch (alt200) {
+                case 1 :
+                    // InternalEntityMockDSL.g:25636:3: rule__XFunctionTypeRef__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFunctionTypeRef__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__1"
+    // InternalEntityMockDSL.g:25644:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
+    public final void rule__XFunctionTypeRef__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25648:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
+            // InternalEntityMockDSL.g:25649:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
+            {
+            pushFollow(FOLLOW_50);
+            rule__XFunctionTypeRef__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__1__Impl"
+    // InternalEntityMockDSL.g:25656:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
+    public final void rule__XFunctionTypeRef__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25660:1: ( ( '=>' ) )
+            // InternalEntityMockDSL.g:25661:1: ( '=>' )
+            {
+            // InternalEntityMockDSL.g:25661:1: ( '=>' )
+            // InternalEntityMockDSL.g:25662:2: '=>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
+            }
+            match(input,32,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__2"
+    // InternalEntityMockDSL.g:25671:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
+    public final void rule__XFunctionTypeRef__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25675:1: ( rule__XFunctionTypeRef__Group__2__Impl )
+            // InternalEntityMockDSL.g:25676:2: rule__XFunctionTypeRef__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__2"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__2__Impl"
+    // InternalEntityMockDSL.g:25682:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
+    public final void rule__XFunctionTypeRef__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25686:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
+            // InternalEntityMockDSL.g:25687:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            {
+            // InternalEntityMockDSL.g:25687:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalEntityMockDSL.g:25688:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
+            }
+            // InternalEntityMockDSL.g:25689:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalEntityMockDSL.g:25689:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ReturnTypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__0"
+    // InternalEntityMockDSL.g:25698:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
+    public final void rule__XFunctionTypeRef__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25702:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
+            // InternalEntityMockDSL.g:25703:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
+            {
+            pushFollow(FOLLOW_48);
+            rule__XFunctionTypeRef__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__0__Impl"
+    // InternalEntityMockDSL.g:25710:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
+    public final void rule__XFunctionTypeRef__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25714:1: ( ( '(' ) )
+            // InternalEntityMockDSL.g:25715:1: ( '(' )
+            {
+            // InternalEntityMockDSL.g:25715:1: ( '(' )
+            // InternalEntityMockDSL.g:25716:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__1"
+    // InternalEntityMockDSL.g:25725:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
+    public final void rule__XFunctionTypeRef__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25729:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
+            // InternalEntityMockDSL.g:25730:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
+            {
+            pushFollow(FOLLOW_48);
+            rule__XFunctionTypeRef__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__1__Impl"
+    // InternalEntityMockDSL.g:25737:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
+    public final void rule__XFunctionTypeRef__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25741:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
+            // InternalEntityMockDSL.g:25742:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:25742:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalEntityMockDSL.g:25743:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
+            }
+            // InternalEntityMockDSL.g:25744:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            int alt201=2;
+            int LA201_0 = input.LA(1);
+
+            if ( (LA201_0==RULE_ID||LA201_0==32||LA201_0==68) ) {
+                alt201=1;
+            }
+            switch (alt201) {
+                case 1 :
+                    // InternalEntityMockDSL.g:25744:3: rule__XFunctionTypeRef__Group_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFunctionTypeRef__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__2"
+    // InternalEntityMockDSL.g:25752:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25756:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
+            // InternalEntityMockDSL.g:25757:2: rule__XFunctionTypeRef__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__2"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__2__Impl"
+    // InternalEntityMockDSL.g:25763:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
+    public final void rule__XFunctionTypeRef__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25767:1: ( ( ')' ) )
+            // InternalEntityMockDSL.g:25768:1: ( ')' )
+            {
+            // InternalEntityMockDSL.g:25768:1: ( ')' )
+            // InternalEntityMockDSL.g:25769:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0"
+    // InternalEntityMockDSL.g:25779:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
+    public final void rule__XFunctionTypeRef__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25783:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
+            // InternalEntityMockDSL.g:25784:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__XFunctionTypeRef__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0__Impl"
+    // InternalEntityMockDSL.g:25791:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25795:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
+            // InternalEntityMockDSL.g:25796:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:25796:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalEntityMockDSL.g:25797:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:25798:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalEntityMockDSL.g:25798:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1"
+    // InternalEntityMockDSL.g:25806:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25810:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
+            // InternalEntityMockDSL.g:25811:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1__Impl"
+    // InternalEntityMockDSL.g:25817:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25821:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
+            // InternalEntityMockDSL.g:25822:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            {
+            // InternalEntityMockDSL.g:25822:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalEntityMockDSL.g:25823:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
+            }
+            // InternalEntityMockDSL.g:25824:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            loop202:
+            do {
+                int alt202=2;
+                int LA202_0 = input.LA(1);
+
+                if ( (LA202_0==70) ) {
+                    alt202=1;
+                }
+
+
+                switch (alt202) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:25824:3: rule__XFunctionTypeRef__Group_0_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__XFunctionTypeRef__Group_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop202;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0"
+    // InternalEntityMockDSL.g:25833:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25837:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
+            // InternalEntityMockDSL.g:25838:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__XFunctionTypeRef__Group_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
+    // InternalEntityMockDSL.g:25845:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25849:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:25850:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:25850:1: ( ',' )
+            // InternalEntityMockDSL.g:25851:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1"
+    // InternalEntityMockDSL.g:25860:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25864:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
+            // InternalEntityMockDSL.g:25865:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
+    // InternalEntityMockDSL.g:25871:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25875:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
+            // InternalEntityMockDSL.g:25876:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:25876:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalEntityMockDSL.g:25877:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
+            }
+            // InternalEntityMockDSL.g:25878:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalEntityMockDSL.g:25878:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0"
+    // InternalEntityMockDSL.g:25887:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25891:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
+            // InternalEntityMockDSL.g:25892:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
+            {
+            pushFollow(FOLLOW_113);
+            rule__JvmParameterizedTypeReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0__Impl"
+    // InternalEntityMockDSL.g:25899:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25903:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
+            // InternalEntityMockDSL.g:25904:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            {
+            // InternalEntityMockDSL.g:25904:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalEntityMockDSL.g:25905:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
+            }
+            // InternalEntityMockDSL.g:25906:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalEntityMockDSL.g:25906:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__TypeAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1"
+    // InternalEntityMockDSL.g:25914:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25918:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
+            // InternalEntityMockDSL.g:25919:2: rule__JvmParameterizedTypeReference__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1__Impl"
+    // InternalEntityMockDSL.g:25925:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
+    public final void rule__JvmParameterizedTypeReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25929:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
+            // InternalEntityMockDSL.g:25930:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            {
+            // InternalEntityMockDSL.g:25930:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalEntityMockDSL.g:25931:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
+            }
+            // InternalEntityMockDSL.g:25932:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            int alt203=2;
+            alt203 = dfa203.predict(input);
+            switch (alt203) {
+                case 1 :
+                    // InternalEntityMockDSL.g:25932:3: rule__JvmParameterizedTypeReference__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmParameterizedTypeReference__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0"
+    // InternalEntityMockDSL.g:25941:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25945:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
+            // InternalEntityMockDSL.g:25946:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__JvmParameterizedTypeReference__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
+    // InternalEntityMockDSL.g:25953:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25957:1: ( ( ( '<' ) ) )
+            // InternalEntityMockDSL.g:25958:1: ( ( '<' ) )
+            {
+            // InternalEntityMockDSL.g:25958:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:25959:2: ( '<' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
+            }
+            // InternalEntityMockDSL.g:25960:2: ( '<' )
+            // InternalEntityMockDSL.g:25960:3: '<'
+            {
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1"
+    // InternalEntityMockDSL.g:25968:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25972:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
+            // InternalEntityMockDSL.g:25973:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
+            {
+            pushFollow(FOLLOW_142);
+            rule__JvmParameterizedTypeReference__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
+    // InternalEntityMockDSL.g:25980:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25984:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
+            // InternalEntityMockDSL.g:25985:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            {
+            // InternalEntityMockDSL.g:25985:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalEntityMockDSL.g:25986:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
+            }
+            // InternalEntityMockDSL.g:25987:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalEntityMockDSL.g:25987:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2"
+    // InternalEntityMockDSL.g:25995:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:25999:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
+            // InternalEntityMockDSL.g:26000:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
+            {
+            pushFollow(FOLLOW_142);
+            rule__JvmParameterizedTypeReference__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
+    // InternalEntityMockDSL.g:26007:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26011:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
+            // InternalEntityMockDSL.g:26012:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:26012:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalEntityMockDSL.g:26013:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
+            }
+            // InternalEntityMockDSL.g:26014:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            loop204:
+            do {
+                int alt204=2;
+                int LA204_0 = input.LA(1);
+
+                if ( (LA204_0==70) ) {
+                    alt204=1;
+                }
+
+
+                switch (alt204) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:26014:3: rule__JvmParameterizedTypeReference__Group_1_2__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__JvmParameterizedTypeReference__Group_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop204;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3"
+    // InternalEntityMockDSL.g:26022:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26026:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
+            // InternalEntityMockDSL.g:26027:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
+            {
+            pushFollow(FOLLOW_40);
+            rule__JvmParameterizedTypeReference__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__3"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
+    // InternalEntityMockDSL.g:26034:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26038:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:26039:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:26039:1: ( '>' )
+            // InternalEntityMockDSL.g:26040:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4"
+    // InternalEntityMockDSL.g:26049:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26053:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
+            // InternalEntityMockDSL.g:26054:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__4"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
+    // InternalEntityMockDSL.g:26060:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26064:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
+            // InternalEntityMockDSL.g:26065:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            {
+            // InternalEntityMockDSL.g:26065:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalEntityMockDSL.g:26066:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
+            }
+            // InternalEntityMockDSL.g:26067:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            loop205:
+            do {
+                int alt205=2;
+                int LA205_0 = input.LA(1);
+
+                if ( (LA205_0==44) ) {
+                    int LA205_2 = input.LA(2);
+
+                    if ( (LA205_2==RULE_ID) ) {
+                        int LA205_3 = input.LA(3);
+
+                        if ( (synpred272_InternalEntityMockDSL()) ) {
+                            alt205=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt205) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:26067:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+            	    {
+            	    pushFollow(FOLLOW_180);
+            	    rule__JvmParameterizedTypeReference__Group_1_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop205;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0"
+    // InternalEntityMockDSL.g:26076:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26080:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
+            // InternalEntityMockDSL.g:26081:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__JvmParameterizedTypeReference__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
+    // InternalEntityMockDSL.g:26088:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26092:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:26093:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:26093:1: ( ',' )
+            // InternalEntityMockDSL.g:26094:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1"
+    // InternalEntityMockDSL.g:26103:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26107:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
+            // InternalEntityMockDSL.g:26108:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
+    // InternalEntityMockDSL.g:26114:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26118:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
+            // InternalEntityMockDSL.g:26119:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:26119:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalEntityMockDSL.g:26120:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
+            }
+            // InternalEntityMockDSL.g:26121:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalEntityMockDSL.g:26121:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0"
+    // InternalEntityMockDSL.g:26130:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26134:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
+            // InternalEntityMockDSL.g:26135:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__JvmParameterizedTypeReference__Group_1_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
+    // InternalEntityMockDSL.g:26142:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26146:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
+            // InternalEntityMockDSL.g:26147:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:26147:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalEntityMockDSL.g:26148:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
+            }
+            // InternalEntityMockDSL.g:26149:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalEntityMockDSL.g:26149:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1"
+    // InternalEntityMockDSL.g:26157:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26161:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
+            // InternalEntityMockDSL.g:26162:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
+            {
+            pushFollow(FOLLOW_113);
+            rule__JvmParameterizedTypeReference__Group_1_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
+    // InternalEntityMockDSL.g:26169:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26173:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
+            // InternalEntityMockDSL.g:26174:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            {
+            // InternalEntityMockDSL.g:26174:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalEntityMockDSL.g:26175:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
+            }
+            // InternalEntityMockDSL.g:26176:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalEntityMockDSL.g:26176:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2"
+    // InternalEntityMockDSL.g:26184:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26188:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
+            // InternalEntityMockDSL.g:26189:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
+    // InternalEntityMockDSL.g:26195:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26199:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
+            // InternalEntityMockDSL.g:26200:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            {
+            // InternalEntityMockDSL.g:26200:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalEntityMockDSL.g:26201:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
+            }
+            // InternalEntityMockDSL.g:26202:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            int alt206=2;
+            alt206 = dfa206.predict(input);
+            switch (alt206) {
+                case 1 :
+                    // InternalEntityMockDSL.g:26202:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmParameterizedTypeReference__Group_1_4_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
+    // InternalEntityMockDSL.g:26211:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26215:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
+            // InternalEntityMockDSL.g:26216:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
+    // InternalEntityMockDSL.g:26222:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26226:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
+            // InternalEntityMockDSL.g:26227:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            {
+            // InternalEntityMockDSL.g:26227:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalEntityMockDSL.g:26228:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
+            }
+            // InternalEntityMockDSL.g:26229:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalEntityMockDSL.g:26229:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
+    // InternalEntityMockDSL.g:26238:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26242:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
+            // InternalEntityMockDSL.g:26243:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
+    // InternalEntityMockDSL.g:26250:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26254:1: ( ( () ) )
+            // InternalEntityMockDSL.g:26255:1: ( () )
+            {
+            // InternalEntityMockDSL.g:26255:1: ( () )
+            // InternalEntityMockDSL.g:26256:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:26257:2: ()
+            // InternalEntityMockDSL.g:26257:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
+    // InternalEntityMockDSL.g:26265:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26269:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
+            // InternalEntityMockDSL.g:26270:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
+    // InternalEntityMockDSL.g:26276:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26280:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:26281:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:26281:1: ( '.' )
+            // InternalEntityMockDSL.g:26282:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
+    // InternalEntityMockDSL.g:26292:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26296:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
+            // InternalEntityMockDSL.g:26297:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
+    // InternalEntityMockDSL.g:26304:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26308:1: ( ( ( '<' ) ) )
+            // InternalEntityMockDSL.g:26309:1: ( ( '<' ) )
+            {
+            // InternalEntityMockDSL.g:26309:1: ( ( '<' ) )
+            // InternalEntityMockDSL.g:26310:2: ( '<' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
+            }
+            // InternalEntityMockDSL.g:26311:2: ( '<' )
+            // InternalEntityMockDSL.g:26311:3: '<'
+            {
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
+    // InternalEntityMockDSL.g:26319:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26323:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
+            // InternalEntityMockDSL.g:26324:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
+            {
+            pushFollow(FOLLOW_142);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
+    // InternalEntityMockDSL.g:26331:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26335:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
+            // InternalEntityMockDSL.g:26336:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:26336:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalEntityMockDSL.g:26337:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
+            }
+            // InternalEntityMockDSL.g:26338:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalEntityMockDSL.g:26338:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
+    // InternalEntityMockDSL.g:26346:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26350:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
+            // InternalEntityMockDSL.g:26351:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
+            {
+            pushFollow(FOLLOW_142);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
+    // InternalEntityMockDSL.g:26358:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26362:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
+            // InternalEntityMockDSL.g:26363:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            {
+            // InternalEntityMockDSL.g:26363:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalEntityMockDSL.g:26364:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
+            }
+            // InternalEntityMockDSL.g:26365:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            loop207:
+            do {
+                int alt207=2;
+                int LA207_0 = input.LA(1);
+
+                if ( (LA207_0==70) ) {
+                    alt207=1;
+                }
+
+
+                switch (alt207) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:26365:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+            	    {
+            	    pushFollow(FOLLOW_49);
+            	    rule__JvmParameterizedTypeReference__Group_1_4_2_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop207;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
+    // InternalEntityMockDSL.g:26373:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26377:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
+            // InternalEntityMockDSL.g:26378:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
+    // InternalEntityMockDSL.g:26384:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26388:1: ( ( '>' ) )
+            // InternalEntityMockDSL.g:26389:1: ( '>' )
+            {
+            // InternalEntityMockDSL.g:26389:1: ( '>' )
+            // InternalEntityMockDSL.g:26390:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
+    // InternalEntityMockDSL.g:26400:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26404:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
+            // InternalEntityMockDSL.g:26405:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
+    // InternalEntityMockDSL.g:26412:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26416:1: ( ( ',' ) )
+            // InternalEntityMockDSL.g:26417:1: ( ',' )
+            {
+            // InternalEntityMockDSL.g:26417:1: ( ',' )
+            // InternalEntityMockDSL.g:26418:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
+    // InternalEntityMockDSL.g:26427:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26431:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
+            // InternalEntityMockDSL.g:26432:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
+    // InternalEntityMockDSL.g:26438:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26442:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
+            // InternalEntityMockDSL.g:26443:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            {
+            // InternalEntityMockDSL.g:26443:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalEntityMockDSL.g:26444:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
+            }
+            // InternalEntityMockDSL.g:26445:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalEntityMockDSL.g:26445:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__0"
+    // InternalEntityMockDSL.g:26454:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
+    public final void rule__JvmWildcardTypeReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26458:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
+            // InternalEntityMockDSL.g:26459:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
+            {
+            pushFollow(FOLLOW_141);
+            rule__JvmWildcardTypeReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__0__Impl"
+    // InternalEntityMockDSL.g:26466:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
+    public final void rule__JvmWildcardTypeReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26470:1: ( ( () ) )
+            // InternalEntityMockDSL.g:26471:1: ( () )
+            {
+            // InternalEntityMockDSL.g:26471:1: ( () )
+            // InternalEntityMockDSL.g:26472:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
+            }
+            // InternalEntityMockDSL.g:26473:2: ()
+            // InternalEntityMockDSL.g:26473:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__1"
+    // InternalEntityMockDSL.g:26481:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
+    public final void rule__JvmWildcardTypeReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26485:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
+            // InternalEntityMockDSL.g:26486:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
+            {
+            pushFollow(FOLLOW_182);
+            rule__JvmWildcardTypeReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__1__Impl"
+    // InternalEntityMockDSL.g:26493:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
+    public final void rule__JvmWildcardTypeReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26497:1: ( ( '?' ) )
+            // InternalEntityMockDSL.g:26498:1: ( '?' )
+            {
+            // InternalEntityMockDSL.g:26498:1: ( '?' )
+            // InternalEntityMockDSL.g:26499:2: '?'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
+            }
+            match(input,145,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__2"
+    // InternalEntityMockDSL.g:26508:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26512:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
+            // InternalEntityMockDSL.g:26513:2: rule__JvmWildcardTypeReference__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__2"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__2__Impl"
+    // InternalEntityMockDSL.g:26519:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
+    public final void rule__JvmWildcardTypeReference__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26523:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
+            // InternalEntityMockDSL.g:26524:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            {
+            // InternalEntityMockDSL.g:26524:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalEntityMockDSL.g:26525:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
+            }
+            // InternalEntityMockDSL.g:26526:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            int alt208=2;
+            int LA208_0 = input.LA(1);
+
+            if ( (LA208_0==46||LA208_0==50) ) {
+                alt208=1;
+            }
+            switch (alt208) {
+                case 1 :
+                    // InternalEntityMockDSL.g:26526:3: rule__JvmWildcardTypeReference__Alternatives_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Alternatives_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__2__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0"
+    // InternalEntityMockDSL.g:26535:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26539:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
+            // InternalEntityMockDSL.g:26540:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
+            {
+            pushFollow(FOLLOW_183);
+            rule__JvmWildcardTypeReference__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
+    // InternalEntityMockDSL.g:26547:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26551:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
+            // InternalEntityMockDSL.g:26552:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            {
+            // InternalEntityMockDSL.g:26552:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalEntityMockDSL.g:26553:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
+            }
+            // InternalEntityMockDSL.g:26554:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalEntityMockDSL.g:26554:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1"
+    // InternalEntityMockDSL.g:26562:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26566:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
+            // InternalEntityMockDSL.g:26567:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
+    // InternalEntityMockDSL.g:26573:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26577:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
+            // InternalEntityMockDSL.g:26578:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            {
+            // InternalEntityMockDSL.g:26578:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalEntityMockDSL.g:26579:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
+            }
+            // InternalEntityMockDSL.g:26580:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            loop209:
+            do {
+                int alt209=2;
+                int LA209_0 = input.LA(1);
+
+                if ( (LA209_0==146) ) {
+                    alt209=1;
+                }
+
+
+                switch (alt209) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:26580:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+            	    {
+            	    pushFollow(FOLLOW_184);
+            	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop209;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0"
+    // InternalEntityMockDSL.g:26589:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26593:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
+            // InternalEntityMockDSL.g:26594:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
+            {
+            pushFollow(FOLLOW_183);
+            rule__JvmWildcardTypeReference__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
+    // InternalEntityMockDSL.g:26601:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26605:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
+            // InternalEntityMockDSL.g:26606:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            {
+            // InternalEntityMockDSL.g:26606:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalEntityMockDSL.g:26607:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:26608:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalEntityMockDSL.g:26608:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1"
+    // InternalEntityMockDSL.g:26616:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26620:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
+            // InternalEntityMockDSL.g:26621:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
+    // InternalEntityMockDSL.g:26627:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26631:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
+            // InternalEntityMockDSL.g:26632:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            {
+            // InternalEntityMockDSL.g:26632:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalEntityMockDSL.g:26633:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
+            }
+            // InternalEntityMockDSL.g:26634:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            loop210:
+            do {
+                int alt210=2;
+                int LA210_0 = input.LA(1);
+
+                if ( (LA210_0==146) ) {
+                    alt210=1;
+                }
+
+
+                switch (alt210) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:26634:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+            	    {
+            	    pushFollow(FOLLOW_184);
+            	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop210;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__0"
+    // InternalEntityMockDSL.g:26643:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
+    public final void rule__JvmUpperBound__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26647:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
+            // InternalEntityMockDSL.g:26648:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__JvmUpperBound__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__0"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__0__Impl"
+    // InternalEntityMockDSL.g:26655:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
+    public final void rule__JvmUpperBound__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26659:1: ( ( 'extends' ) )
+            // InternalEntityMockDSL.g:26660:1: ( 'extends' )
+            {
+            // InternalEntityMockDSL.g:26660:1: ( 'extends' )
+            // InternalEntityMockDSL.g:26661:2: 'extends'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
+            }
+            match(input,46,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__1"
+    // InternalEntityMockDSL.g:26670:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
+    public final void rule__JvmUpperBound__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26674:1: ( rule__JvmUpperBound__Group__1__Impl )
+            // InternalEntityMockDSL.g:26675:2: rule__JvmUpperBound__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__1"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__1__Impl"
+    // InternalEntityMockDSL.g:26681:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmUpperBound__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26685:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:26686:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:26686:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalEntityMockDSL.g:26687:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:26688:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalEntityMockDSL.g:26688:3: rule__JvmUpperBound__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__0"
+    // InternalEntityMockDSL.g:26697:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
+    public final void rule__JvmUpperBoundAnded__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26701:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
+            // InternalEntityMockDSL.g:26702:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__JvmUpperBoundAnded__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__0"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__0__Impl"
+    // InternalEntityMockDSL.g:26709:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
+    public final void rule__JvmUpperBoundAnded__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26713:1: ( ( '&' ) )
+            // InternalEntityMockDSL.g:26714:1: ( '&' )
+            {
+            // InternalEntityMockDSL.g:26714:1: ( '&' )
+            // InternalEntityMockDSL.g:26715:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+            match(input,146,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__1"
+    // InternalEntityMockDSL.g:26724:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
+    public final void rule__JvmUpperBoundAnded__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26728:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
+            // InternalEntityMockDSL.g:26729:2: rule__JvmUpperBoundAnded__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__1"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__1__Impl"
+    // InternalEntityMockDSL.g:26735:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmUpperBoundAnded__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26739:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:26740:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:26740:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalEntityMockDSL.g:26741:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:26742:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalEntityMockDSL.g:26742:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__0"
+    // InternalEntityMockDSL.g:26751:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
+    public final void rule__JvmLowerBound__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26755:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
+            // InternalEntityMockDSL.g:26756:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__JvmLowerBound__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__0"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__0__Impl"
+    // InternalEntityMockDSL.g:26763:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
+    public final void rule__JvmLowerBound__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26767:1: ( ( 'super' ) )
+            // InternalEntityMockDSL.g:26768:1: ( 'super' )
+            {
+            // InternalEntityMockDSL.g:26768:1: ( 'super' )
+            // InternalEntityMockDSL.g:26769:2: 'super'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
+            }
+            match(input,50,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__1"
+    // InternalEntityMockDSL.g:26778:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
+    public final void rule__JvmLowerBound__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26782:1: ( rule__JvmLowerBound__Group__1__Impl )
+            // InternalEntityMockDSL.g:26783:2: rule__JvmLowerBound__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__1"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__1__Impl"
+    // InternalEntityMockDSL.g:26789:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmLowerBound__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26793:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:26794:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:26794:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalEntityMockDSL.g:26795:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:26796:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalEntityMockDSL.g:26796:3: rule__JvmLowerBound__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__0"
+    // InternalEntityMockDSL.g:26805:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
+    public final void rule__JvmLowerBoundAnded__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26809:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
+            // InternalEntityMockDSL.g:26810:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__JvmLowerBoundAnded__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__0"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__0__Impl"
+    // InternalEntityMockDSL.g:26817:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
+    public final void rule__JvmLowerBoundAnded__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26821:1: ( ( '&' ) )
+            // InternalEntityMockDSL.g:26822:1: ( '&' )
+            {
+            // InternalEntityMockDSL.g:26822:1: ( '&' )
+            // InternalEntityMockDSL.g:26823:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+            match(input,146,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__1"
+    // InternalEntityMockDSL.g:26832:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
+    public final void rule__JvmLowerBoundAnded__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26836:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
+            // InternalEntityMockDSL.g:26837:2: rule__JvmLowerBoundAnded__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__1"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__1__Impl"
+    // InternalEntityMockDSL.g:26843:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmLowerBoundAnded__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26847:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalEntityMockDSL.g:26848:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            {
+            // InternalEntityMockDSL.g:26848:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalEntityMockDSL.g:26849:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalEntityMockDSL.g:26850:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalEntityMockDSL.g:26850:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0"
+    // InternalEntityMockDSL.g:26859:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
+    public final void rule__QualifiedNameWithWildcard__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26863:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
+            // InternalEntityMockDSL.g:26864:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__QualifiedNameWithWildcard__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0__Impl"
+    // InternalEntityMockDSL.g:26871:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26875:1: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:26876:1: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:26876:1: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:26877:2: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1"
+    // InternalEntityMockDSL.g:26886:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
+    public final void rule__QualifiedNameWithWildcard__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26890:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
+            // InternalEntityMockDSL.g:26891:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
+            {
+            pushFollow(FOLLOW_185);
+            rule__QualifiedNameWithWildcard__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1__Impl"
+    // InternalEntityMockDSL.g:26898:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26902:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:26903:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:26903:1: ( '.' )
+            // InternalEntityMockDSL.g:26904:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2"
+    // InternalEntityMockDSL.g:26913:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
+    public final void rule__QualifiedNameWithWildcard__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26917:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
+            // InternalEntityMockDSL.g:26918:2: rule__QualifiedNameWithWildcard__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__2"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2__Impl"
+    // InternalEntityMockDSL.g:26924:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26928:1: ( ( '*' ) )
+            // InternalEntityMockDSL.g:26929:1: ( '*' )
+            {
+            // InternalEntityMockDSL.g:26929:1: ( '*' )
+            // InternalEntityMockDSL.g:26930:2: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+            }
+            match(input,37,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__2__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0"
+    // InternalEntityMockDSL.g:26940:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
+    public final void rule__QualifiedNameInStaticImport__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26944:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
+            // InternalEntityMockDSL.g:26945:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
+            {
+            pushFollow(FOLLOW_40);
+            rule__QualifiedNameInStaticImport__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameInStaticImport__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0__Impl"
+    // InternalEntityMockDSL.g:26952:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedNameInStaticImport__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26956:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:26957:1: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:26957:1: ( ruleValidID )
+            // InternalEntityMockDSL.g:26958:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1"
+    // InternalEntityMockDSL.g:26967:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
+    public final void rule__QualifiedNameInStaticImport__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26971:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
+            // InternalEntityMockDSL.g:26972:2: rule__QualifiedNameInStaticImport__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameInStaticImport__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1__Impl"
+    // InternalEntityMockDSL.g:26978:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
+    public final void rule__QualifiedNameInStaticImport__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:26982:1: ( ( '.' ) )
+            // InternalEntityMockDSL.g:26983:1: ( '.' )
+            {
+            // InternalEntityMockDSL.g:26983:1: ( '.' )
+            // InternalEntityMockDSL.g:26984:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1"
+    // InternalEntityMockDSL.g:26994:1: rule__EntityMock__UnorderedGroup_4_1 : rule__EntityMock__UnorderedGroup_4_1__0 {...}?;
+    public final void rule__EntityMock__UnorderedGroup_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+        	
+        try {
+            // InternalEntityMockDSL.g:26999:1: ( rule__EntityMock__UnorderedGroup_4_1__0 {...}?)
+            // InternalEntityMockDSL.g:27000:2: rule__EntityMock__UnorderedGroup_4_1__0 {...}?
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__UnorderedGroup_4_1__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()) ) {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1", "getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1())");
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__Impl"
+    // InternalEntityMockDSL.g:27008:1: rule__EntityMock__UnorderedGroup_4_1__Impl : ( ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) ) ) ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalEntityMockDSL.g:27013:1: ( ( ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) ) ) )
+            // InternalEntityMockDSL.g:27014:3: ( ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) ) )
+            {
+            // InternalEntityMockDSL.g:27014:3: ( ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) ) | ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) ) )
+            int alt211=5;
+            int LA211_0 = input.LA(1);
+
+            if ( LA211_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                alt211=1;
+            }
+            else if ( LA211_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                alt211=2;
+            }
+            else if ( LA211_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                alt211=3;
+            }
+            else if ( LA211_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                alt211=4;
+            }
+            else if ( LA211_0 == 103 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                alt211=5;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 211, 0, input);
+
+                throw nvae;
+            }
+            switch (alt211) {
+                case 1 :
+                    // InternalEntityMockDSL.g:27015:3: ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27015:3: ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) )
+                    // InternalEntityMockDSL.g:27016:4: {...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0)");
+                    }
+                    // InternalEntityMockDSL.g:27016:108: ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) )
+                    // InternalEntityMockDSL.g:27017:5: ( ( rule__EntityMock__Group_4_1_0__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27023:5: ( ( rule__EntityMock__Group_4_1_0__0 ) )
+                    // InternalEntityMockDSL.g:27024:6: ( rule__EntityMock__Group_4_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAccess().getGroup_4_1_0()); 
+                    }
+                    // InternalEntityMockDSL.g:27025:6: ( rule__EntityMock__Group_4_1_0__0 )
+                    // InternalEntityMockDSL.g:27025:7: rule__EntityMock__Group_4_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__Group_4_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAccess().getGroup_4_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:27030:3: ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27030:3: ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) )
+                    // InternalEntityMockDSL.g:27031:4: {...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1)");
+                    }
+                    // InternalEntityMockDSL.g:27031:108: ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) )
+                    // InternalEntityMockDSL.g:27032:5: ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27038:5: ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) )
+                    // InternalEntityMockDSL.g:27039:6: ( rule__EntityMock__DatainterchangesAssignment_4_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1()); 
+                    }
+                    // InternalEntityMockDSL.g:27040:6: ( rule__EntityMock__DatainterchangesAssignment_4_1_1 )
+                    // InternalEntityMockDSL.g:27040:7: rule__EntityMock__DatainterchangesAssignment_4_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__DatainterchangesAssignment_4_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:27045:3: ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27045:3: ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) )
+                    // InternalEntityMockDSL.g:27046:4: {...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2)");
+                    }
+                    // InternalEntityMockDSL.g:27046:108: ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) )
+                    // InternalEntityMockDSL.g:27047:5: ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27053:5: ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) )
+                    // InternalEntityMockDSL.g:27054:6: ( rule__EntityMock__ResourcesAssignment_4_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2()); 
+                    }
+                    // InternalEntityMockDSL.g:27055:6: ( rule__EntityMock__ResourcesAssignment_4_1_2 )
+                    // InternalEntityMockDSL.g:27055:7: rule__EntityMock__ResourcesAssignment_4_1_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__ResourcesAssignment_4_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:27060:3: ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27060:3: ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) )
+                    // InternalEntityMockDSL.g:27061:4: {...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3)");
+                    }
+                    // InternalEntityMockDSL.g:27061:108: ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) )
+                    // InternalEntityMockDSL.g:27062:5: ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27068:5: ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) )
+                    // InternalEntityMockDSL.g:27069:6: ( rule__EntityMock__ObjectsAssignment_4_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3()); 
+                    }
+                    // InternalEntityMockDSL.g:27070:6: ( rule__EntityMock__ObjectsAssignment_4_1_3 )
+                    // InternalEntityMockDSL.g:27070:7: rule__EntityMock__ObjectsAssignment_4_1_3
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__ObjectsAssignment_4_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:27075:3: ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27075:3: ({...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) ) )
+                    // InternalEntityMockDSL.g:27076:4: {...}? => ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMock__UnorderedGroup_4_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4)");
+                    }
+                    // InternalEntityMockDSL.g:27076:108: ( ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) ) )
+                    // InternalEntityMockDSL.g:27077:5: ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27083:5: ( ( rule__EntityMock__EntitiesAssignment_4_1_4 ) )
+                    // InternalEntityMockDSL.g:27084:6: ( rule__EntityMock__EntitiesAssignment_4_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockAccess().getEntitiesAssignment_4_1_4()); 
+                    }
+                    // InternalEntityMockDSL.g:27085:6: ( rule__EntityMock__EntitiesAssignment_4_1_4 )
+                    // InternalEntityMockDSL.g:27085:7: rule__EntityMock__EntitiesAssignment_4_1_4
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__EntitiesAssignment_4_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockAccess().getEntitiesAssignment_4_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__Impl"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__0"
+    // InternalEntityMockDSL.g:27098:1: rule__EntityMock__UnorderedGroup_4_1__0 : rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__1 )? ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27102:1: ( rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__1 )? )
+            // InternalEntityMockDSL.g:27103:2: rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__1 )?
+            {
+            pushFollow(FOLLOW_186);
+            rule__EntityMock__UnorderedGroup_4_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalEntityMockDSL.g:27104:2: ( rule__EntityMock__UnorderedGroup_4_1__1 )?
+            int alt212=2;
+            int LA212_0 = input.LA(1);
+
+            if ( LA212_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                alt212=1;
+            }
+            else if ( LA212_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                alt212=1;
+            }
+            else if ( LA212_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                alt212=1;
+            }
+            else if ( LA212_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                alt212=1;
+            }
+            else if ( LA212_0 == 103 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                alt212=1;
+            }
+            switch (alt212) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMock__UnorderedGroup_4_1__1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__UnorderedGroup_4_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__0"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__1"
+    // InternalEntityMockDSL.g:27110:1: rule__EntityMock__UnorderedGroup_4_1__1 : rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__2 )? ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27114:1: ( rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__2 )? )
+            // InternalEntityMockDSL.g:27115:2: rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__2 )?
+            {
+            pushFollow(FOLLOW_186);
+            rule__EntityMock__UnorderedGroup_4_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalEntityMockDSL.g:27116:2: ( rule__EntityMock__UnorderedGroup_4_1__2 )?
+            int alt213=2;
+            int LA213_0 = input.LA(1);
+
+            if ( LA213_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                alt213=1;
+            }
+            else if ( LA213_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                alt213=1;
+            }
+            else if ( LA213_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                alt213=1;
+            }
+            else if ( LA213_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                alt213=1;
+            }
+            else if ( LA213_0 == 103 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                alt213=1;
+            }
+            switch (alt213) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMock__UnorderedGroup_4_1__2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__UnorderedGroup_4_1__2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__1"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__2"
+    // InternalEntityMockDSL.g:27122:1: rule__EntityMock__UnorderedGroup_4_1__2 : rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__3 )? ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27126:1: ( rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__3 )? )
+            // InternalEntityMockDSL.g:27127:2: rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__3 )?
+            {
+            pushFollow(FOLLOW_186);
+            rule__EntityMock__UnorderedGroup_4_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalEntityMockDSL.g:27128:2: ( rule__EntityMock__UnorderedGroup_4_1__3 )?
+            int alt214=2;
+            int LA214_0 = input.LA(1);
+
+            if ( LA214_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                alt214=1;
+            }
+            else if ( LA214_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                alt214=1;
+            }
+            else if ( LA214_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                alt214=1;
+            }
+            else if ( LA214_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                alt214=1;
+            }
+            else if ( LA214_0 == 103 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                alt214=1;
+            }
+            switch (alt214) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMock__UnorderedGroup_4_1__3
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__UnorderedGroup_4_1__3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__2"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__3"
+    // InternalEntityMockDSL.g:27134:1: rule__EntityMock__UnorderedGroup_4_1__3 : rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__4 )? ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27138:1: ( rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__4 )? )
+            // InternalEntityMockDSL.g:27139:2: rule__EntityMock__UnorderedGroup_4_1__Impl ( rule__EntityMock__UnorderedGroup_4_1__4 )?
+            {
+            pushFollow(FOLLOW_186);
+            rule__EntityMock__UnorderedGroup_4_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalEntityMockDSL.g:27140:2: ( rule__EntityMock__UnorderedGroup_4_1__4 )?
+            int alt215=2;
+            int LA215_0 = input.LA(1);
+
+            if ( LA215_0 == 60 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                alt215=1;
+            }
+            else if ( LA215_0 == 61 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                alt215=1;
+            }
+            else if ( LA215_0 == 64 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                alt215=1;
+            }
+            else if ( LA215_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                alt215=1;
+            }
+            else if ( LA215_0 == 103 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                alt215=1;
+            }
+            switch (alt215) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMock__UnorderedGroup_4_1__4
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMock__UnorderedGroup_4_1__4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__3"
+
+
+    // $ANTLR start "rule__EntityMock__UnorderedGroup_4_1__4"
+    // InternalEntityMockDSL.g:27146:1: rule__EntityMock__UnorderedGroup_4_1__4 : rule__EntityMock__UnorderedGroup_4_1__Impl ;
+    public final void rule__EntityMock__UnorderedGroup_4_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27150:1: ( rule__EntityMock__UnorderedGroup_4_1__Impl )
+            // InternalEntityMockDSL.g:27151:2: rule__EntityMock__UnorderedGroup_4_1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMock__UnorderedGroup_4_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__UnorderedGroup_4_1__4"
+
+
+    // $ANTLR start "rule__EntityMockEntity__UnorderedGroup_4_1_3"
+    // InternalEntityMockDSL.g:27158:1: rule__EntityMockEntity__UnorderedGroup_4_1_3 : ( rule__EntityMockEntity__UnorderedGroup_4_1_3__0 )? ;
+    public final void rule__EntityMockEntity__UnorderedGroup_4_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+        	
+        try {
+            // InternalEntityMockDSL.g:27163:1: ( ( rule__EntityMockEntity__UnorderedGroup_4_1_3__0 )? )
+            // InternalEntityMockDSL.g:27164:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__0 )?
+            {
+            // InternalEntityMockDSL.g:27164:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__0 )?
+            int alt216=2;
+            int LA216_0 = input.LA(1);
+
+            if ( LA216_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                alt216=1;
+            }
+            else if ( LA216_0 == 148 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                alt216=1;
+            }
+            switch (alt216) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMockEntity__UnorderedGroup_4_1_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__UnorderedGroup_4_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__UnorderedGroup_4_1_3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl"
+    // InternalEntityMockDSL.g:27172:1: rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl : ( ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) ) | ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) ) ) ;
+    public final void rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalEntityMockDSL.g:27177:1: ( ( ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) ) | ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) ) ) )
+            // InternalEntityMockDSL.g:27178:3: ( ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) ) | ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) ) )
+            {
+            // InternalEntityMockDSL.g:27178:3: ( ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) ) | ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) ) )
+            int alt218=2;
+            int LA218_0 = input.LA(1);
+
+            if ( LA218_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                alt218=1;
+            }
+            else if ( LA218_0 == 148 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                alt218=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 218, 0, input);
+
+                throw nvae;
+            }
+            switch (alt218) {
+                case 1 :
+                    // InternalEntityMockDSL.g:27179:3: ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27179:3: ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) )
+                    // InternalEntityMockDSL.g:27180:4: {...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0)");
+                    }
+                    // InternalEntityMockDSL.g:27180:116: ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) )
+                    // InternalEntityMockDSL.g:27181:5: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27187:5: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) )
+                    // InternalEntityMockDSL.g:27188:6: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* )
+                    {
+                    // InternalEntityMockDSL.g:27188:6: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) )
+                    // InternalEntityMockDSL.g:27189:7: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+                    }
+                    // InternalEntityMockDSL.g:27190:7: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )
+                    // InternalEntityMockDSL.g:27190:8: rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+                    {
+                    pushFollow(FOLLOW_36);
+                    rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:27193:6: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* )
+                    // InternalEntityMockDSL.g:27194:7: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+                    }
+                    // InternalEntityMockDSL.g:27195:7: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )*
+                    loop217:
+                    do {
+                        int alt217=2;
+                        int LA217_0 = input.LA(1);
+
+                        if ( (LA217_0==73) ) {
+                            int LA217_1 = input.LA(2);
+
+                            if ( (LA217_1==RULE_ID) ) {
+                                int LA217_3 = input.LA(3);
+
+                                if ( (LA217_3==113) ) {
+                                    int LA217_4 = input.LA(4);
+
+                                    if ( (LA217_4==RULE_ID) ) {
+                                        int LA217_5 = input.LA(5);
+
+                                        if ( (synpred287_InternalEntityMockDSL()) ) {
+                                            alt217=1;
+                                        }
+
+
+                                    }
+
+
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt217) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:27195:8: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+                    	    {
+                    	    pushFollow(FOLLOW_36);
+                    	    rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop217;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:27201:3: ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:27201:3: ({...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) ) )
+                    // InternalEntityMockDSL.g:27202:4: {...}? => ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1)");
+                    }
+                    // InternalEntityMockDSL.g:27202:116: ( ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) ) )
+                    // InternalEntityMockDSL.g:27203:5: ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1);
+                    selected = true;
+                    // InternalEntityMockDSL.g:27209:5: ( ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 ) )
+                    // InternalEntityMockDSL.g:27210:6: ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingAssignment_4_1_3_1()); 
+                    }
+                    // InternalEntityMockDSL.g:27211:6: ( rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 )
+                    // InternalEntityMockDSL.g:27211:7: rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingAssignment_4_1_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl"
+
+
+    // $ANTLR start "rule__EntityMockEntity__UnorderedGroup_4_1_3__0"
+    // InternalEntityMockDSL.g:27224:1: rule__EntityMockEntity__UnorderedGroup_4_1_3__0 : rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl ( rule__EntityMockEntity__UnorderedGroup_4_1_3__1 )? ;
+    public final void rule__EntityMockEntity__UnorderedGroup_4_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27228:1: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl ( rule__EntityMockEntity__UnorderedGroup_4_1_3__1 )? )
+            // InternalEntityMockDSL.g:27229:2: rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl ( rule__EntityMockEntity__UnorderedGroup_4_1_3__1 )?
+            {
+            pushFollow(FOLLOW_187);
+            rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalEntityMockDSL.g:27230:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__1 )?
+            int alt219=2;
+            int LA219_0 = input.LA(1);
+
+            if ( LA219_0 == 73 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                alt219=1;
+            }
+            else if ( LA219_0 == 148 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                alt219=1;
+            }
+            switch (alt219) {
+                case 1 :
+                    // InternalEntityMockDSL.g:0:0: rule__EntityMockEntity__UnorderedGroup_4_1_3__1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__EntityMockEntity__UnorderedGroup_4_1_3__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__UnorderedGroup_4_1_3__0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__UnorderedGroup_4_1_3__1"
+    // InternalEntityMockDSL.g:27236:1: rule__EntityMockEntity__UnorderedGroup_4_1_3__1 : rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl ;
+    public final void rule__EntityMockEntity__UnorderedGroup_4_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27240:1: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl )
+            // InternalEntityMockDSL.g:27241:2: rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EntityMockEntity__UnorderedGroup_4_1_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__UnorderedGroup_4_1_3__1"
+
+
+    // $ANTLR start "rule__EntityMockModel__ImportSectionAssignment_0"
+    // InternalEntityMockDSL.g:27248:1: rule__EntityMockModel__ImportSectionAssignment_0 : ( ruleXImportSection ) ;
+    public final void rule__EntityMockModel__ImportSectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27252:1: ( ( ruleXImportSection ) )
+            // InternalEntityMockDSL.g:27253:2: ( ruleXImportSection )
+            {
+            // InternalEntityMockDSL.g:27253:2: ( ruleXImportSection )
+            // InternalEntityMockDSL.g:27254:3: ruleXImportSection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXImportSection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__ImportSectionAssignment_0"
+
+
+    // $ANTLR start "rule__EntityMockModel__PackagesAssignment_1"
+    // InternalEntityMockDSL.g:27263:1: rule__EntityMockModel__PackagesAssignment_1 : ( ruleEntityMockPackage ) ;
+    public final void rule__EntityMockModel__PackagesAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27267:1: ( ( ruleEntityMockPackage ) )
+            // InternalEntityMockDSL.g:27268:2: ( ruleEntityMockPackage )
+            {
+            // InternalEntityMockDSL.g:27268:2: ( ruleEntityMockPackage )
+            // InternalEntityMockDSL.g:27269:3: ruleEntityMockPackage
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockPackage();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockModel__PackagesAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockPackage__NameAssignment_2"
+    // InternalEntityMockDSL.g:27278:1: rule__EntityMockPackage__NameAssignment_2 : ( ruleQualifiedName ) ;
+    public final void rule__EntityMockPackage__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27282:1: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:27283:2: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:27283:2: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:27284:3: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__NameAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMockPackage__MocksAssignment_3_1"
+    // InternalEntityMockDSL.g:27293:1: rule__EntityMockPackage__MocksAssignment_3_1 : ( ruleEntityMock ) ;
+    public final void rule__EntityMockPackage__MocksAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27297:1: ( ( ruleEntityMock ) )
+            // InternalEntityMockDSL.g:27298:2: ( ruleEntityMock )
+            {
+            // InternalEntityMockDSL.g:27298:2: ( ruleEntityMock )
+            // InternalEntityMockDSL.g:27299:3: ruleEntityMock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockPackage__MocksAssignment_3_1"
+
+
+    // $ANTLR start "rule__EntityMock__NameAssignment_2"
+    // InternalEntityMockDSL.g:27308:1: rule__EntityMock__NameAssignment_2 : ( RULE_ID ) ;
+    public final void rule__EntityMock__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27312:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27313:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27313:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27314:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__NameAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMock__DescriptionAssignment_3_0"
+    // InternalEntityMockDSL.g:27323:1: rule__EntityMock__DescriptionAssignment_3_0 : ( ( 'describedBy' ) ) ;
+    public final void rule__EntityMock__DescriptionAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27327:1: ( ( ( 'describedBy' ) ) )
+            // InternalEntityMockDSL.g:27328:2: ( ( 'describedBy' ) )
+            {
+            // InternalEntityMockDSL.g:27328:2: ( ( 'describedBy' ) )
+            // InternalEntityMockDSL.g:27329:3: ( 'describedBy' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:27330:3: ( 'describedBy' )
+            // InternalEntityMockDSL.g:27331:4: 'describedBy'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); 
+            }
+            match(input,147,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__DescriptionAssignment_3_0"
+
+
+    // $ANTLR start "rule__EntityMock__DescriptionValueAssignment_3_1"
+    // InternalEntityMockDSL.g:27342:1: rule__EntityMock__DescriptionValueAssignment_3_1 : ( RULE_STRING ) ;
+    public final void rule__EntityMock__DescriptionValueAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27346:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:27347:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:27347:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:27348:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__DescriptionValueAssignment_3_1"
+
+
+    // $ANTLR start "rule__EntityMock__RunPriorityAssignment_4_1_0_1"
+    // InternalEntityMockDSL.g:27357:1: rule__EntityMock__RunPriorityAssignment_4_1_0_1 : ( RULE_INT ) ;
+    public final void rule__EntityMock__RunPriorityAssignment_4_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27361:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:27362:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:27362:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:27363:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__RunPriorityAssignment_4_1_0_1"
+
+
+    // $ANTLR start "rule__EntityMock__DatainterchangesAssignment_4_1_1"
+    // InternalEntityMockDSL.g:27372:1: rule__EntityMock__DatainterchangesAssignment_4_1_1 : ( ruleRunningDataInterchanges ) ;
+    public final void rule__EntityMock__DatainterchangesAssignment_4_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27376:1: ( ( ruleRunningDataInterchanges ) )
+            // InternalEntityMockDSL.g:27377:2: ( ruleRunningDataInterchanges )
+            {
+            // InternalEntityMockDSL.g:27377:2: ( ruleRunningDataInterchanges )
+            // InternalEntityMockDSL.g:27378:3: ruleRunningDataInterchanges
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleRunningDataInterchanges();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__DatainterchangesAssignment_4_1_1"
+
+
+    // $ANTLR start "rule__EntityMock__ResourcesAssignment_4_1_2"
+    // InternalEntityMockDSL.g:27387:1: rule__EntityMock__ResourcesAssignment_4_1_2 : ( ruleEntityMockResources ) ;
+    public final void rule__EntityMock__ResourcesAssignment_4_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27391:1: ( ( ruleEntityMockResources ) )
+            // InternalEntityMockDSL.g:27392:2: ( ruleEntityMockResources )
+            {
+            // InternalEntityMockDSL.g:27392:2: ( ruleEntityMockResources )
+            // InternalEntityMockDSL.g:27393:3: ruleEntityMockResources
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockResources();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__ResourcesAssignment_4_1_2"
+
+
+    // $ANTLR start "rule__EntityMock__ObjectsAssignment_4_1_3"
+    // InternalEntityMockDSL.g:27402:1: rule__EntityMock__ObjectsAssignment_4_1_3 : ( ruleEntityMockObjects ) ;
+    public final void rule__EntityMock__ObjectsAssignment_4_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27406:1: ( ( ruleEntityMockObjects ) )
+            // InternalEntityMockDSL.g:27407:2: ( ruleEntityMockObjects )
+            {
+            // InternalEntityMockDSL.g:27407:2: ( ruleEntityMockObjects )
+            // InternalEntityMockDSL.g:27408:3: ruleEntityMockObjects
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjects();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__ObjectsAssignment_4_1_3"
+
+
+    // $ANTLR start "rule__EntityMock__EntitiesAssignment_4_1_4"
+    // InternalEntityMockDSL.g:27417:1: rule__EntityMock__EntitiesAssignment_4_1_4 : ( ruleEntityMockEntities ) ;
+    public final void rule__EntityMock__EntitiesAssignment_4_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27421:1: ( ( ruleEntityMockEntities ) )
+            // InternalEntityMockDSL.g:27422:2: ( ruleEntityMockEntities )
+            {
+            // InternalEntityMockDSL.g:27422:2: ( ruleEntityMockEntities )
+            // InternalEntityMockDSL.g:27423:3: ruleEntityMockEntities
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntities();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMock__EntitiesAssignment_4_1_4"
+
+
+    // $ANTLR start "rule__RunningDataInterchanges__DatainterchangesAssignment_3"
+    // InternalEntityMockDSL.g:27432:1: rule__RunningDataInterchanges__DatainterchangesAssignment_3 : ( ruleRunningDataInterchange ) ;
+    public final void rule__RunningDataInterchanges__DatainterchangesAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27436:1: ( ( ruleRunningDataInterchange ) )
+            // InternalEntityMockDSL.g:27437:2: ( ruleRunningDataInterchange )
+            {
+            // InternalEntityMockDSL.g:27437:2: ( ruleRunningDataInterchange )
+            // InternalEntityMockDSL.g:27438:3: ruleRunningDataInterchange
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleRunningDataInterchange();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchanges__DatainterchangesAssignment_3"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__DatainterchangeRefAssignment_2"
+    // InternalEntityMockDSL.g:27447:1: rule__RunningDataInterchange__DatainterchangeRefAssignment_2 : ( ( RULE_ID ) ) ;
+    public final void rule__RunningDataInterchange__DatainterchangeRefAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27451:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27452:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27452:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27453:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:27454:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27455:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__DatainterchangeRefAssignment_2"
+
+
+    // $ANTLR start "rule__RunningDataInterchange__FileURLAssignment_4"
+    // InternalEntityMockDSL.g:27466:1: rule__RunningDataInterchange__FileURLAssignment_4 : ( RULE_STRING ) ;
+    public final void rule__RunningDataInterchange__FileURLAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27470:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:27471:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:27471:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:27472:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RunningDataInterchange__FileURLAssignment_4"
+
+
+    // $ANTLR start "rule__EntityMockResources__ResourcesAssignment_3"
+    // InternalEntityMockDSL.g:27481:1: rule__EntityMockResources__ResourcesAssignment_3 : ( ruleEntityMockResource ) ;
+    public final void rule__EntityMockResources__ResourcesAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27485:1: ( ( ruleEntityMockResource ) )
+            // InternalEntityMockDSL.g:27486:2: ( ruleEntityMockResource )
+            {
+            // InternalEntityMockDSL.g:27486:2: ( ruleEntityMockResource )
+            // InternalEntityMockDSL.g:27487:3: ruleEntityMockResource
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockResource();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResources__ResourcesAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockResource__NameAssignment_1"
+    // InternalEntityMockDSL.g:27496:1: rule__EntityMockResource__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockResource__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27500:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27501:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27501:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27502:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockResource__AttributesAssignment_3_2_0"
+    // InternalEntityMockDSL.g:27511:1: rule__EntityMockResource__AttributesAssignment_3_2_0 : ( ruleEntityMockResourceAttribute ) ;
+    public final void rule__EntityMockResource__AttributesAssignment_3_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27515:1: ( ( ruleEntityMockResourceAttribute ) )
+            // InternalEntityMockDSL.g:27516:2: ( ruleEntityMockResourceAttribute )
+            {
+            // InternalEntityMockDSL.g:27516:2: ( ruleEntityMockResourceAttribute )
+            // InternalEntityMockDSL.g:27517:3: ruleEntityMockResourceAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockResourceAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__AttributesAssignment_3_2_0"
+
+
+    // $ANTLR start "rule__EntityMockResource__DatarowsAssignment_6"
+    // InternalEntityMockDSL.g:27526:1: rule__EntityMockResource__DatarowsAssignment_6 : ( ruleEntityMockResourceDataRow ) ;
+    public final void rule__EntityMockResource__DatarowsAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27530:1: ( ( ruleEntityMockResourceDataRow ) )
+            // InternalEntityMockDSL.g:27531:2: ( ruleEntityMockResourceDataRow )
+            {
+            // InternalEntityMockDSL.g:27531:2: ( ruleEntityMockResourceDataRow )
+            // InternalEntityMockDSL.g:27532:3: ruleEntityMockResourceDataRow
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockResourceDataRow();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResource__DatarowsAssignment_6"
+
+
+    // $ANTLR start "rule__EntityMockResourceAttribute__NameAssignment_1"
+    // InternalEntityMockDSL.g:27541:1: rule__EntityMockResourceAttribute__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockResourceAttribute__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27545:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27546:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27546:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27547:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceAttribute__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__NameAssignment_1"
+    // InternalEntityMockDSL.g:27556:1: rule__EntityMockResourceDataRow__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockResourceDataRow__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27560:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27561:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27561:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27562:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0"
+    // InternalEntityMockDSL.g:27571:1: rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0 : ( RULE_STRING ) ;
+    public final void rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27575:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:27576:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:27576:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:27577:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockResourceDataRow__ValuesAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__EntityMockObjects__ObjectsAssignment_3"
+    // InternalEntityMockDSL.g:27586:1: rule__EntityMockObjects__ObjectsAssignment_3 : ( ruleEntityMockObject ) ;
+    public final void rule__EntityMockObjects__ObjectsAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27590:1: ( ( ruleEntityMockObject ) )
+            // InternalEntityMockDSL.g:27591:2: ( ruleEntityMockObject )
+            {
+            // InternalEntityMockDSL.g:27591:2: ( ruleEntityMockObject )
+            // InternalEntityMockDSL.g:27592:3: ruleEntityMockObject
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjects__ObjectsAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObject__NameAssignment_1"
+    // InternalEntityMockDSL.g:27601:1: rule__EntityMockObject__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObject__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27605:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27606:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27606:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27607:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObject__EnumerationsAssignment_3"
+    // InternalEntityMockDSL.g:27616:1: rule__EntityMockObject__EnumerationsAssignment_3 : ( ruleEntityMockObjectEnum ) ;
+    public final void rule__EntityMockObject__EnumerationsAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27620:1: ( ( ruleEntityMockObjectEnum ) )
+            // InternalEntityMockDSL.g:27621:2: ( ruleEntityMockObjectEnum )
+            {
+            // InternalEntityMockDSL.g:27621:2: ( ruleEntityMockObjectEnum )
+            // InternalEntityMockDSL.g:27622:3: ruleEntityMockObjectEnum
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjectEnum();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__EnumerationsAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObject__AttributesAssignment_4"
+    // InternalEntityMockDSL.g:27631:1: rule__EntityMockObject__AttributesAssignment_4 : ( ruleIEntityMockObjectAttribute ) ;
+    public final void rule__EntityMockObject__AttributesAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27635:1: ( ( ruleIEntityMockObjectAttribute ) )
+            // InternalEntityMockDSL.g:27636:2: ( ruleIEntityMockObjectAttribute )
+            {
+            // InternalEntityMockDSL.g:27636:2: ( ruleIEntityMockObjectAttribute )
+            // InternalEntityMockDSL.g:27637:3: ruleIEntityMockObjectAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIEntityMockObjectAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__AttributesAssignment_4"
+
+
+    // $ANTLR start "rule__EntityMockObject__CalculationsAssignment_5"
+    // InternalEntityMockDSL.g:27646:1: rule__EntityMockObject__CalculationsAssignment_5 : ( ruleEntityMockObjectFunction ) ;
+    public final void rule__EntityMockObject__CalculationsAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27650:1: ( ( ruleEntityMockObjectFunction ) )
+            // InternalEntityMockDSL.g:27651:2: ( ruleEntityMockObjectFunction )
+            {
+            // InternalEntityMockDSL.g:27651:2: ( ruleEntityMockObjectFunction )
+            // InternalEntityMockDSL.g:27652:3: ruleEntityMockObjectFunction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjectFunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObject__CalculationsAssignment_5"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__NameAssignment_1"
+    // InternalEntityMockDSL.g:27661:1: rule__EntityMockObjectEnum__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectEnum__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27665:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27666:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27666:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27667:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectEnum__UsingResourceAssignment_3"
+    // InternalEntityMockDSL.g:27676:1: rule__EntityMockObjectEnum__UsingResourceAssignment_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectEnum__UsingResourceAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27680:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27681:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27681:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27682:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:27683:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27684:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEnum__UsingResourceAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__NameAssignment_1"
+    // InternalEntityMockDSL.g:27695:1: rule__EntityMockObjectPlainValue__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectPlainValue__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27699:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27700:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27700:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27701:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectPlainValue__ValuesAssignment_3_0"
+    // InternalEntityMockDSL.g:27710:1: rule__EntityMockObjectPlainValue__ValuesAssignment_3_0 : ( RULE_STRING ) ;
+    public final void rule__EntityMockObjectPlainValue__ValuesAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27714:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:27715:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:27715:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:27716:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectPlainValue__ValuesAssignment_3_0"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__NameAssignment_1"
+    // InternalEntityMockDSL.g:27725:1: rule__EntityMockObjectResourceValue__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectResourceValue__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27729:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27730:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27730:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27731:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3"
+    // InternalEntityMockDSL.g:27740:1: rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27744:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27745:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27745:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27746:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:27747:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27748:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__ResourceEnumAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1"
+    // InternalEntityMockDSL.g:27759:1: rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27763:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27764:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27764:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27765:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); 
+            }
+            // InternalEntityMockDSL.g:27766:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27767:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectResourceValue__ResourceAttributeAssignment_4_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__NameAssignment_1"
+    // InternalEntityMockDSL.g:27778:1: rule__EntityMockObjectArrayValue__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectArrayValue__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27782:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27783:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27783:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27784:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__EnumerationAssignment_3"
+    // InternalEntityMockDSL.g:27793:1: rule__EntityMockObjectArrayValue__EnumerationAssignment_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectArrayValue__EnumerationAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27797:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27798:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27798:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27799:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:27800:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27801:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__EnumerationAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObjectArrayValue__ItemsAssignment_5"
+    // InternalEntityMockDSL.g:27812:1: rule__EntityMockObjectArrayValue__ItemsAssignment_5 : ( ruleEntityMockObjectItemValue ) ;
+    public final void rule__EntityMockObjectArrayValue__ItemsAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27816:1: ( ( ruleEntityMockObjectItemValue ) )
+            // InternalEntityMockDSL.g:27817:2: ( ruleEntityMockObjectItemValue )
+            {
+            // InternalEntityMockDSL.g:27817:2: ( ruleEntityMockObjectItemValue )
+            // InternalEntityMockDSL.g:27818:3: ruleEntityMockObjectItemValue
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjectItemValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectArrayValue__ItemsAssignment_5"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__DatarowAssignment_1"
+    // InternalEntityMockDSL.g:27827:1: rule__EntityMockObjectItemValue__DatarowAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectItemValue__DatarowAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27831:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27832:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27832:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27833:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:27834:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27835:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__DatarowAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectItemValue__ValuesAssignment_3_0"
+    // InternalEntityMockDSL.g:27846:1: rule__EntityMockObjectItemValue__ValuesAssignment_3_0 : ( RULE_STRING ) ;
+    public final void rule__EntityMockObjectItemValue__ValuesAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27850:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:27851:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:27851:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:27852:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectItemValue__ValuesAssignment_3_0"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__NameAssignment_2"
+    // InternalEntityMockDSL.g:27861:1: rule__EntityMockObjectEmbed__NameAssignment_2 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectEmbed__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27865:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27866:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27866:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27867:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__NameAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMockObjectEmbed__ObjectAssignment_4"
+    // InternalEntityMockDSL.g:27876:1: rule__EntityMockObjectEmbed__ObjectAssignment_4 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectEmbed__ObjectAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27880:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27881:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27881:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27882:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); 
+            }
+            // InternalEntityMockDSL.g:27883:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27884:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectEmbed__ObjectAssignment_4"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__NameAssignment_1"
+    // InternalEntityMockDSL.g:27895:1: rule__EntityMockObjectFunction__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectFunction__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27899:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27900:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:27900:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:27901:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__OftypeAssignment_3"
+    // InternalEntityMockDSL.g:27910:1: rule__EntityMockObjectFunction__OftypeAssignment_3 : ( ruleJvmParameterizedTypeReference ) ;
+    public final void rule__EntityMockObjectFunction__OftypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27914:1: ( ( ruleJvmParameterizedTypeReference ) )
+            // InternalEntityMockDSL.g:27915:2: ( ruleJvmParameterizedTypeReference )
+            {
+            // InternalEntityMockDSL.g:27915:2: ( ruleJvmParameterizedTypeReference )
+            // InternalEntityMockDSL.g:27916:3: ruleJvmParameterizedTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__OftypeAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__ParamsAssignment_6_0"
+    // InternalEntityMockDSL.g:27925:1: rule__EntityMockObjectFunction__ParamsAssignment_6_0 : ( ruleEntityMockObjectFunctionParameter ) ;
+    public final void rule__EntityMockObjectFunction__ParamsAssignment_6_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27929:1: ( ( ruleEntityMockObjectFunctionParameter ) )
+            // InternalEntityMockDSL.g:27930:2: ( ruleEntityMockObjectFunctionParameter )
+            {
+            // InternalEntityMockDSL.g:27930:2: ( ruleEntityMockObjectFunctionParameter )
+            // InternalEntityMockDSL.g:27931:3: ruleEntityMockObjectFunctionParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjectFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__ParamsAssignment_6_0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__ParamsAssignment_6_1_1"
+    // InternalEntityMockDSL.g:27940:1: rule__EntityMockObjectFunction__ParamsAssignment_6_1_1 : ( ruleEntityMockObjectFunctionParameter ) ;
+    public final void rule__EntityMockObjectFunction__ParamsAssignment_6_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27944:1: ( ( ruleEntityMockObjectFunctionParameter ) )
+            // InternalEntityMockDSL.g:27945:2: ( ruleEntityMockObjectFunctionParameter )
+            {
+            // InternalEntityMockDSL.g:27945:2: ( ruleEntityMockObjectFunctionParameter )
+            // InternalEntityMockDSL.g:27946:3: ruleEntityMockObjectFunctionParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockObjectFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__ParamsAssignment_6_1_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunction__BodyAssignment_8"
+    // InternalEntityMockDSL.g:27955:1: rule__EntityMockObjectFunction__BodyAssignment_8 : ( ruleXBlockExpression ) ;
+    public final void rule__EntityMockObjectFunction__BodyAssignment_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27959:1: ( ( ruleXBlockExpression ) )
+            // InternalEntityMockDSL.g:27960:2: ( ruleXBlockExpression )
+            {
+            // InternalEntityMockDSL.g:27960:2: ( ruleXBlockExpression )
+            // InternalEntityMockDSL.g:27961:3: ruleXBlockExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunction__BodyAssignment_8"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0"
+    // InternalEntityMockDSL.g:27970:1: rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27974:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:27975:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:27975:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:27976:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__ParameterTypeAssignment_0"
+
+
+    // $ANTLR start "rule__EntityMockObjectFunctionParameter__NameAssignment_1"
+    // InternalEntityMockDSL.g:27985:1: rule__EntityMockObjectFunctionParameter__NameAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockObjectFunctionParameter__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:27989:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:27990:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:27990:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:27991:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:27992:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:27993:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFunctionParameter__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__NameAssignment_1"
+    // InternalEntityMockDSL.g:28004:1: rule__EntityMockObjectFill__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockObjectFill__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28008:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28009:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:28009:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:28010:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockObjectFill__FillerTypeAssignment_3"
+    // InternalEntityMockDSL.g:28019:1: rule__EntityMockObjectFill__FillerTypeAssignment_3 : ( rulePropertyFillerType ) ;
+    public final void rule__EntityMockObjectFill__FillerTypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28023:1: ( ( rulePropertyFillerType ) )
+            // InternalEntityMockDSL.g:28024:2: ( rulePropertyFillerType )
+            {
+            // InternalEntityMockDSL.g:28024:2: ( rulePropertyFillerType )
+            // InternalEntityMockDSL.g:28025:3: rulePropertyFillerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            rulePropertyFillerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockObjectFill__FillerTypeAssignment_3"
+
+
+    // $ANTLR start "rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1"
+    // InternalEntityMockDSL.g:28034:1: rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28038:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28039:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28039:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28040:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateFuture__DateFutureYearsAssignment_1"
+
+
+    // $ANTLR start "rule__PropertyFillerDatePast__DatePastYearsAssignment_1"
+    // InternalEntityMockDSL.g:28049:1: rule__PropertyFillerDatePast__DatePastYearsAssignment_1 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerDatePast__DatePastYearsAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28053:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28054:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28054:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28055:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDatePast__DatePastYearsAssignment_1"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__DateBeginYearsAssignment_2"
+    // InternalEntityMockDSL.g:28064:1: rule__PropertyFillerDateRange__DateBeginYearsAssignment_2 : ( ruleSINT ) ;
+    public final void rule__PropertyFillerDateRange__DateBeginYearsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28068:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28069:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28069:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28070:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__DateBeginYearsAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerDateRange__DateEndYearsAssignment_4"
+    // InternalEntityMockDSL.g:28079:1: rule__PropertyFillerDateRange__DateEndYearsAssignment_4 : ( ruleSINT ) ;
+    public final void rule__PropertyFillerDateRange__DateEndYearsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28083:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28084:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28084:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28085:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerDateRange__DateEndYearsAssignment_4"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0"
+    // InternalEntityMockDSL.g:28094:1: rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0 : ( ruleSignedNumber ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28098:1: ( ( ruleSignedNumber ) )
+            // InternalEntityMockDSL.g:28099:2: ( ruleSignedNumber )
+            {
+            // InternalEntityMockDSL.g:28099:2: ( ruleSignedNumber )
+            // InternalEntityMockDSL.g:28100:3: ruleSignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__BeginRangeAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1"
+    // InternalEntityMockDSL.g:28109:1: rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28113:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28114:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28114:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28115:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28116:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28117:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__BeginRangeRefAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0"
+    // InternalEntityMockDSL.g:28128:1: rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0 : ( ruleSignedNumber ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28132:1: ( ( ruleSignedNumber ) )
+            // InternalEntityMockDSL.g:28133:2: ( ruleSignedNumber )
+            {
+            // InternalEntityMockDSL.g:28133:2: ( ruleSignedNumber )
+            // InternalEntityMockDSL.g:28134:3: ruleSignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__EndRangeAssignment_2_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1"
+    // InternalEntityMockDSL.g:28143:1: rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28147:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28148:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28148:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28149:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28150:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28151:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__EndRangeRefAssignment_2_2_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4"
+    // InternalEntityMockDSL.g:28162:1: rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28166:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28167:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28167:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28168:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__DecimalsAssignment_4"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1"
+    // InternalEntityMockDSL.g:28177:1: rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1 : ( ruleUnsignedNumber ) ;
+    public final void rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28181:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:28182:2: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:28182:2: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:28183:3: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRange__RoundedAssignment_6_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2"
+    // InternalEntityMockDSL.g:28192:1: rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2 : ( ruleSignedNumber ) ;
+    public final void rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28196:1: ( ( ruleSignedNumber ) )
+            // InternalEntityMockDSL.g:28197:2: ( ruleSignedNumber )
+            {
+            // InternalEntityMockDSL.g:28197:2: ( ruleSignedNumber )
+            // InternalEntityMockDSL.g:28198:3: ruleSignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedDoubleRandom__ItemsAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0"
+    // InternalEntityMockDSL.g:28207:1: rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0 : ( ruleSINT ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28211:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28212:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28212:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28213:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__BeginRangeAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1"
+    // InternalEntityMockDSL.g:28222:1: rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28226:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28227:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28227:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28228:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28229:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28230:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__BeginRangeRefAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0"
+    // InternalEntityMockDSL.g:28241:1: rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0 : ( ruleSINT ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28245:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28246:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28246:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28247:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__EndRangeAssignment_3_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1"
+    // InternalEntityMockDSL.g:28256:1: rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28260:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28261:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28261:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28262:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28263:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28264:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__EndRangeRefAssignment_3_2_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1"
+    // InternalEntityMockDSL.g:28275:1: rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28279:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28280:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28280:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28281:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRange__RoundedAssignment_4_1"
+
+
+    // $ANTLR start "rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2"
+    // InternalEntityMockDSL.g:28290:1: rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2 : ( ruleSINT ) ;
+    public final void rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28294:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28295:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28295:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28296:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerSignedIntegerRandom__ItemsAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextRandom__ItemsAssignment_2"
+    // InternalEntityMockDSL.g:28305:1: rule__PropertyFillerTextRandom__ItemsAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__PropertyFillerTextRandom__ItemsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28309:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:28310:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:28310:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:28311:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextRandom__ItemsAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextParagraphs__CountAssignment_2"
+    // InternalEntityMockDSL.g:28320:1: rule__PropertyFillerTextParagraphs__CountAssignment_2 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerTextParagraphs__CountAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28324:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28325:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28325:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28326:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextParagraphs__CountAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextSentences__CountAssignment_2"
+    // InternalEntityMockDSL.g:28335:1: rule__PropertyFillerTextSentences__CountAssignment_2 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerTextSentences__CountAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28339:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28340:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28340:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28341:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextSentences__CountAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerTextWords__CountAssignment_2"
+    // InternalEntityMockDSL.g:28350:1: rule__PropertyFillerTextWords__CountAssignment_2 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerTextWords__CountAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28354:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28355:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28355:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28356:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerTextWords__CountAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0"
+    // InternalEntityMockDSL.g:28365:1: rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0 : ( ruleUnsignedNumber ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28369:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:28370:2: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:28370:2: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:28371:3: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__BeginRangeAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1"
+    // InternalEntityMockDSL.g:28380:1: rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28384:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28385:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28385:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28386:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28387:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28388:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__BeginRangeRefAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0"
+    // InternalEntityMockDSL.g:28399:1: rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0 : ( ruleUnsignedNumber ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28403:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:28404:2: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:28404:2: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:28405:3: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__EndRangeAssignment_2_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1"
+    // InternalEntityMockDSL.g:28414:1: rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28418:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28419:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28419:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28420:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28421:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28422:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__EndRangeRefAssignment_2_2_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4"
+    // InternalEntityMockDSL.g:28433:1: rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28437:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28438:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28438:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28439:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__DecimalsAssignment_4"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1"
+    // InternalEntityMockDSL.g:28448:1: rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1 : ( ruleUnsignedNumber ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28452:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:28453:2: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:28453:2: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:28454:3: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRange__RoundedAssignment_6_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2"
+    // InternalEntityMockDSL.g:28463:1: rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2 : ( ruleUnsignedNumber ) ;
+    public final void rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28467:1: ( ( ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:28468:2: ( ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:28468:2: ( ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:28469:3: ruleUnsignedNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedDoubleRandom__ItemsAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0"
+    // InternalEntityMockDSL.g:28478:1: rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28482:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28483:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28483:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28484:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__BeginRangeAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1"
+    // InternalEntityMockDSL.g:28493:1: rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28497:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28498:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28498:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28499:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28500:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28501:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__BeginRangeRefAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0"
+    // InternalEntityMockDSL.g:28512:1: rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28516:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28517:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28517:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28518:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__EndRangeAssignment_3_2_0"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1"
+    // InternalEntityMockDSL.g:28527:1: rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28531:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28532:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28532:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28533:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28534:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28535:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__EndRangeRefAssignment_3_2_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1"
+    // InternalEntityMockDSL.g:28546:1: rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28550:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28551:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28551:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28552:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRange__RoundedAssignment_4_1"
+
+
+    // $ANTLR start "rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2"
+    // InternalEntityMockDSL.g:28561:1: rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2 : ( RULE_INT ) ;
+    public final void rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28565:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28566:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28566:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28567:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyFillerUnsignedIntegerRandom__ItemsAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMockEntities__EntitiesAssignment_3"
+    // InternalEntityMockDSL.g:28576:1: rule__EntityMockEntities__EntitiesAssignment_3 : ( ruleEntityMockEntity ) ;
+    public final void rule__EntityMockEntities__EntitiesAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28580:1: ( ( ruleEntityMockEntity ) )
+            // InternalEntityMockDSL.g:28581:2: ( ruleEntityMockEntity )
+            {
+            // InternalEntityMockDSL.g:28581:2: ( ruleEntityMockEntity )
+            // InternalEntityMockDSL.g:28582:3: ruleEntityMockEntity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntities__EntitiesAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__NameAssignment_1"
+    // InternalEntityMockDSL.g:28591:1: rule__EntityMockEntity__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockEntity__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28595:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28596:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:28596:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:28597:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__EntityRefAssignment_3"
+    // InternalEntityMockDSL.g:28606:1: rule__EntityMockEntity__EntityRefAssignment_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntity__EntityRefAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28610:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28611:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28611:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28612:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:28613:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28614:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityIDTerminalRuleCall_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityIDTerminalRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__EntityRefAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__MinRowsAssignment_4_0_1"
+    // InternalEntityMockDSL.g:28625:1: rule__EntityMockEntity__MinRowsAssignment_4_0_1 : ( RULE_INT ) ;
+    public final void rule__EntityMockEntity__MinRowsAssignment_4_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28629:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28630:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28630:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28631:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__MinRowsAssignment_4_0_1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__MaxRowsAssignment_4_0_3"
+    // InternalEntityMockDSL.g:28640:1: rule__EntityMockEntity__MaxRowsAssignment_4_0_3 : ( RULE_INT ) ;
+    public final void rule__EntityMockEntity__MaxRowsAssignment_4_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28644:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28645:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28645:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28646:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__MaxRowsAssignment_4_0_3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__TemplatesAssignment_4_0_5"
+    // InternalEntityMockDSL.g:28655:1: rule__EntityMockEntity__TemplatesAssignment_4_0_5 : ( ruleEntityMockTemplate ) ;
+    public final void rule__EntityMockEntity__TemplatesAssignment_4_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28659:1: ( ( ruleEntityMockTemplate ) )
+            // InternalEntityMockDSL.g:28660:2: ( ruleEntityMockTemplate )
+            {
+            // InternalEntityMockDSL.g:28660:2: ( ruleEntityMockTemplate )
+            // InternalEntityMockDSL.g:28661:3: ruleEntityMockTemplate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockTemplate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__TemplatesAssignment_4_0_5"
+
+
+    // $ANTLR start "rule__EntityMockEntity__AttributesAssignment_4_0_6"
+    // InternalEntityMockDSL.g:28670:1: rule__EntityMockEntity__AttributesAssignment_4_0_6 : ( ruleIEntityMockAttribute ) ;
+    public final void rule__EntityMockEntity__AttributesAssignment_4_0_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28674:1: ( ( ruleIEntityMockAttribute ) )
+            // InternalEntityMockDSL.g:28675:2: ( ruleIEntityMockAttribute )
+            {
+            // InternalEntityMockDSL.g:28675:2: ( ruleIEntityMockAttribute )
+            // InternalEntityMockDSL.g:28676:3: ruleIEntityMockAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIEntityMockAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__AttributesAssignment_4_0_6"
+
+
+    // $ANTLR start "rule__EntityMockEntity__CalculationsAssignment_4_0_7"
+    // InternalEntityMockDSL.g:28685:1: rule__EntityMockEntity__CalculationsAssignment_4_0_7 : ( ruleEntityMockEntityFunction ) ;
+    public final void rule__EntityMockEntity__CalculationsAssignment_4_0_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28689:1: ( ( ruleEntityMockEntityFunction ) )
+            // InternalEntityMockDSL.g:28690:2: ( ruleEntityMockEntityFunction )
+            {
+            // InternalEntityMockDSL.g:28690:2: ( ruleEntityMockEntityFunction )
+            // InternalEntityMockDSL.g:28691:3: ruleEntityMockEntityFunction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntityFunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__CalculationsAssignment_4_0_7"
+
+
+    // $ANTLR start "rule__EntityMockEntity__ByResourceAssignment_4_1_1"
+    // InternalEntityMockDSL.g:28700:1: rule__EntityMockEntity__ByResourceAssignment_4_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntity__ByResourceAssignment_4_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28704:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28705:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28705:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28706:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28707:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28708:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__ByResourceAssignment_4_1_1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0"
+    // InternalEntityMockDSL.g:28719:1: rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 : ( ruleEntityMockByResourceAttribute ) ;
+    public final void rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28723:1: ( ( ruleEntityMockByResourceAttribute ) )
+            // InternalEntityMockDSL.g:28724:2: ( ruleEntityMockByResourceAttribute )
+            {
+            // InternalEntityMockDSL.g:28724:2: ( ruleEntityMockByResourceAttribute )
+            // InternalEntityMockDSL.g:28725:3: ruleEntityMockByResourceAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockByResourceAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0"
+
+
+    // $ANTLR start "rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1"
+    // InternalEntityMockDSL.g:28734:1: rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1 : ( ( 'createBlobMapping' ) ) ;
+    public final void rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28738:1: ( ( ( 'createBlobMapping' ) ) )
+            // InternalEntityMockDSL.g:28739:2: ( ( 'createBlobMapping' ) )
+            {
+            // InternalEntityMockDSL.g:28739:2: ( ( 'createBlobMapping' ) )
+            // InternalEntityMockDSL.g:28740:3: ( 'createBlobMapping' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28741:3: ( 'createBlobMapping' )
+            // InternalEntityMockDSL.g:28742:4: 'createBlobMapping'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); 
+            }
+            match(input,148,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__CreateBlobMappingAssignment_4_1_3_1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__IteratorAssignment_4_2_1"
+    // InternalEntityMockDSL.g:28753:1: rule__EntityMockEntity__IteratorAssignment_4_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntity__IteratorAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28757:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:28758:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:28758:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:28759:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28760:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:28761:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__IteratorAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__EntityMockEntity__IterateAssignment_4_2_3"
+    // InternalEntityMockDSL.g:28772:1: rule__EntityMockEntity__IterateAssignment_4_2_3 : ( ruleIIterate ) ;
+    public final void rule__EntityMockEntity__IterateAssignment_4_2_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28776:1: ( ( ruleIIterate ) )
+            // InternalEntityMockDSL.g:28777:2: ( ruleIIterate )
+            {
+            // InternalEntityMockDSL.g:28777:2: ( ruleIIterate )
+            // InternalEntityMockDSL.g:28778:3: ruleIIterate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIIterate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__IterateAssignment_4_2_3"
+
+
+    // $ANTLR start "rule__EntityMockEntity__TemplatesAssignment_4_2_5"
+    // InternalEntityMockDSL.g:28787:1: rule__EntityMockEntity__TemplatesAssignment_4_2_5 : ( ruleEntityMockTemplate ) ;
+    public final void rule__EntityMockEntity__TemplatesAssignment_4_2_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28791:1: ( ( ruleEntityMockTemplate ) )
+            // InternalEntityMockDSL.g:28792:2: ( ruleEntityMockTemplate )
+            {
+            // InternalEntityMockDSL.g:28792:2: ( ruleEntityMockTemplate )
+            // InternalEntityMockDSL.g:28793:3: ruleEntityMockTemplate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockTemplate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__TemplatesAssignment_4_2_5"
+
+
+    // $ANTLR start "rule__EntityMockEntity__AttributesAssignment_4_2_6"
+    // InternalEntityMockDSL.g:28802:1: rule__EntityMockEntity__AttributesAssignment_4_2_6 : ( ruleIEntityMockAttribute ) ;
+    public final void rule__EntityMockEntity__AttributesAssignment_4_2_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28806:1: ( ( ruleIEntityMockAttribute ) )
+            // InternalEntityMockDSL.g:28807:2: ( ruleIEntityMockAttribute )
+            {
+            // InternalEntityMockDSL.g:28807:2: ( ruleIEntityMockAttribute )
+            // InternalEntityMockDSL.g:28808:3: ruleIEntityMockAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIEntityMockAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__AttributesAssignment_4_2_6"
+
+
+    // $ANTLR start "rule__EntityMockEntity__CalculationsAssignment_4_2_7"
+    // InternalEntityMockDSL.g:28817:1: rule__EntityMockEntity__CalculationsAssignment_4_2_7 : ( ruleEntityMockEntityFunction ) ;
+    public final void rule__EntityMockEntity__CalculationsAssignment_4_2_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28821:1: ( ( ruleEntityMockEntityFunction ) )
+            // InternalEntityMockDSL.g:28822:2: ( ruleEntityMockEntityFunction )
+            {
+            // InternalEntityMockDSL.g:28822:2: ( ruleEntityMockEntityFunction )
+            // InternalEntityMockDSL.g:28823:3: ruleEntityMockEntityFunction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntityFunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntity__CalculationsAssignment_4_2_7"
+
+
+    // $ANTLR start "rule__IntegerIterate__FromAssignment_1"
+    // InternalEntityMockDSL.g:28832:1: rule__IntegerIterate__FromAssignment_1 : ( ruleSINT ) ;
+    public final void rule__IntegerIterate__FromAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28836:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28837:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28837:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28838:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__FromAssignment_1"
+
+
+    // $ANTLR start "rule__IntegerIterate__UntilAssignment_3"
+    // InternalEntityMockDSL.g:28847:1: rule__IntegerIterate__UntilAssignment_3 : ( ruleSINT ) ;
+    public final void rule__IntegerIterate__UntilAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28851:1: ( ( ruleSINT ) )
+            // InternalEntityMockDSL.g:28852:2: ( ruleSINT )
+            {
+            // InternalEntityMockDSL.g:28852:2: ( ruleSINT )
+            // InternalEntityMockDSL.g:28853:3: ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__UntilAssignment_3"
+
+
+    // $ANTLR start "rule__IntegerIterate__StepAssignment_5"
+    // InternalEntityMockDSL.g:28862:1: rule__IntegerIterate__StepAssignment_5 : ( RULE_INT ) ;
+    public final void rule__IntegerIterate__StepAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28866:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28867:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28867:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28868:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntegerIterate__StepAssignment_5"
+
+
+    // $ANTLR start "rule__DateIterate__FromAssignment_1"
+    // InternalEntityMockDSL.g:28877:1: rule__DateIterate__FromAssignment_1 : ( ruleDate ) ;
+    public final void rule__DateIterate__FromAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28881:1: ( ( ruleDate ) )
+            // InternalEntityMockDSL.g:28882:2: ( ruleDate )
+            {
+            // InternalEntityMockDSL.g:28882:2: ( ruleDate )
+            // InternalEntityMockDSL.g:28883:3: ruleDate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleDate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__FromAssignment_1"
+
+
+    // $ANTLR start "rule__DateIterate__UntilAssignment_3"
+    // InternalEntityMockDSL.g:28892:1: rule__DateIterate__UntilAssignment_3 : ( ruleDate ) ;
+    public final void rule__DateIterate__UntilAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28896:1: ( ( ruleDate ) )
+            // InternalEntityMockDSL.g:28897:2: ( ruleDate )
+            {
+            // InternalEntityMockDSL.g:28897:2: ( ruleDate )
+            // InternalEntityMockDSL.g:28898:3: ruleDate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleDate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__UntilAssignment_3"
+
+
+    // $ANTLR start "rule__DateIterate__StepCountAssignment_5"
+    // InternalEntityMockDSL.g:28907:1: rule__DateIterate__StepCountAssignment_5 : ( RULE_INT ) ;
+    public final void rule__DateIterate__StepCountAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28911:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28912:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28912:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:28913:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__StepCountAssignment_5"
+
+
+    // $ANTLR start "rule__DateIterate__StepTypeAssignment_6"
+    // InternalEntityMockDSL.g:28922:1: rule__DateIterate__StepTypeAssignment_6 : ( ruleEDateStepType ) ;
+    public final void rule__DateIterate__StepTypeAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28926:1: ( ( ruleEDateStepType ) )
+            // InternalEntityMockDSL.g:28927:2: ( ruleEDateStepType )
+            {
+            // InternalEntityMockDSL.g:28927:2: ( ruleEDateStepType )
+            // InternalEntityMockDSL.g:28928:3: ruleEDateStepType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEDateStepType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DateIterate__StepTypeAssignment_6"
+
+
+    // $ANTLR start "rule__Date__YesterdayAssignment_0"
+    // InternalEntityMockDSL.g:28937:1: rule__Date__YesterdayAssignment_0 : ( ( 'yesterday' ) ) ;
+    public final void rule__Date__YesterdayAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28941:1: ( ( ( 'yesterday' ) ) )
+            // InternalEntityMockDSL.g:28942:2: ( ( 'yesterday' ) )
+            {
+            // InternalEntityMockDSL.g:28942:2: ( ( 'yesterday' ) )
+            // InternalEntityMockDSL.g:28943:3: ( 'yesterday' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); 
+            }
+            // InternalEntityMockDSL.g:28944:3: ( 'yesterday' )
+            // InternalEntityMockDSL.g:28945:4: 'yesterday'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); 
+            }
+            match(input,149,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__YesterdayAssignment_0"
+
+
+    // $ANTLR start "rule__Date__TodayAssignment_1"
+    // InternalEntityMockDSL.g:28956:1: rule__Date__TodayAssignment_1 : ( ( 'today' ) ) ;
+    public final void rule__Date__TodayAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28960:1: ( ( ( 'today' ) ) )
+            // InternalEntityMockDSL.g:28961:2: ( ( 'today' ) )
+            {
+            // InternalEntityMockDSL.g:28961:2: ( ( 'today' ) )
+            // InternalEntityMockDSL.g:28962:3: ( 'today' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); 
+            }
+            // InternalEntityMockDSL.g:28963:3: ( 'today' )
+            // InternalEntityMockDSL.g:28964:4: 'today'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); 
+            }
+            match(input,150,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getTodayTodayKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__TodayAssignment_1"
+
+
+    // $ANTLR start "rule__Date__TomorrowAssignment_2"
+    // InternalEntityMockDSL.g:28975:1: rule__Date__TomorrowAssignment_2 : ( ( 'tomorrow' ) ) ;
+    public final void rule__Date__TomorrowAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28979:1: ( ( ( 'tomorrow' ) ) )
+            // InternalEntityMockDSL.g:28980:2: ( ( 'tomorrow' ) )
+            {
+            // InternalEntityMockDSL.g:28980:2: ( ( 'tomorrow' ) )
+            // InternalEntityMockDSL.g:28981:3: ( 'tomorrow' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); 
+            }
+            // InternalEntityMockDSL.g:28982:3: ( 'tomorrow' )
+            // InternalEntityMockDSL.g:28983:4: 'tomorrow'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); 
+            }
+            match(input,151,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__TomorrowAssignment_2"
+
+
+    // $ANTLR start "rule__Date__YearAssignment_3_0"
+    // InternalEntityMockDSL.g:28994:1: rule__Date__YearAssignment_3_0 : ( RULE_INT ) ;
+    public final void rule__Date__YearAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:28998:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:28999:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:28999:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:29000:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__YearAssignment_3_0"
+
+
+    // $ANTLR start "rule__Date__MonthAssignment_3_2"
+    // InternalEntityMockDSL.g:29009:1: rule__Date__MonthAssignment_3_2 : ( RULE_INT ) ;
+    public final void rule__Date__MonthAssignment_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29013:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:29014:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:29014:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:29015:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__MonthAssignment_3_2"
+
+
+    // $ANTLR start "rule__Date__DayAssignment_3_4"
+    // InternalEntityMockDSL.g:29024:1: rule__Date__DayAssignment_3_4 : ( RULE_INT ) ;
+    public final void rule__Date__DayAssignment_3_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29028:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:29029:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:29029:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:29030:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Date__DayAssignment_3_4"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__AttributeRefAssignment_2"
+    // InternalEntityMockDSL.g:29039:1: rule__EntityMockByResourceAttribute__AttributeRefAssignment_2 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockByResourceAttribute__AttributeRefAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29043:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29044:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29044:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29045:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:29046:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29047:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__AttributeRefAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4"
+    // InternalEntityMockDSL.g:29058:1: rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29062:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29063:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29063:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29064:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0()); 
+            }
+            // InternalEntityMockDSL.g:29065:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29066:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockByResourceAttribute__ResourceAttributeAssignment_4"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__NameAssignment_1"
+    // InternalEntityMockDSL.g:29077:1: rule__EntityMockTemplate__NameAssignment_1 : ( RULE_ID ) ;
+    public final void rule__EntityMockTemplate__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29081:1: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29082:2: ( RULE_ID )
+            {
+            // InternalEntityMockDSL.g:29082:2: ( RULE_ID )
+            // InternalEntityMockDSL.g:29083:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockTemplate__ObjectAssignment_3"
+    // InternalEntityMockDSL.g:29092:1: rule__EntityMockTemplate__ObjectAssignment_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockTemplate__ObjectAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29096:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29097:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29097:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29098:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:29099:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29100:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockTemplate__ObjectAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__AttributeRefAssignment_1"
+    // InternalEntityMockDSL.g:29111:1: rule__EntityMockEntityFunction__AttributeRefAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntityFunction__AttributeRefAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29115:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29116:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29116:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29117:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29118:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29119:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__AttributeRefAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__ParamsAssignment_4_0"
+    // InternalEntityMockDSL.g:29130:1: rule__EntityMockEntityFunction__ParamsAssignment_4_0 : ( ruleEntityMockEntityFunctionParameter ) ;
+    public final void rule__EntityMockEntityFunction__ParamsAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29134:1: ( ( ruleEntityMockEntityFunctionParameter ) )
+            // InternalEntityMockDSL.g:29135:2: ( ruleEntityMockEntityFunctionParameter )
+            {
+            // InternalEntityMockDSL.g:29135:2: ( ruleEntityMockEntityFunctionParameter )
+            // InternalEntityMockDSL.g:29136:3: ruleEntityMockEntityFunctionParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntityFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__ParamsAssignment_4_0"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__ParamsAssignment_4_1_1"
+    // InternalEntityMockDSL.g:29145:1: rule__EntityMockEntityFunction__ParamsAssignment_4_1_1 : ( ruleEntityMockEntityFunctionParameter ) ;
+    public final void rule__EntityMockEntityFunction__ParamsAssignment_4_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29149:1: ( ( ruleEntityMockEntityFunctionParameter ) )
+            // InternalEntityMockDSL.g:29150:2: ( ruleEntityMockEntityFunctionParameter )
+            {
+            // InternalEntityMockDSL.g:29150:2: ( ruleEntityMockEntityFunctionParameter )
+            // InternalEntityMockDSL.g:29151:3: ruleEntityMockEntityFunctionParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntityFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__ParamsAssignment_4_1_1"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunction__BodyAssignment_6"
+    // InternalEntityMockDSL.g:29160:1: rule__EntityMockEntityFunction__BodyAssignment_6 : ( ruleXBlockExpression ) ;
+    public final void rule__EntityMockEntityFunction__BodyAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29164:1: ( ( ruleXBlockExpression ) )
+            // InternalEntityMockDSL.g:29165:2: ( ruleXBlockExpression )
+            {
+            // InternalEntityMockDSL.g:29165:2: ( ruleXBlockExpression )
+            // InternalEntityMockDSL.g:29166:3: ruleXBlockExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunction__BodyAssignment_6"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0"
+    // InternalEntityMockDSL.g:29175:1: rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29179:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29180:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29180:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29181:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29182:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29183:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunctionParameter__AttributeRefAssignment_0"
+
+
+    // $ANTLR start "rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1"
+    // InternalEntityMockDSL.g:29194:1: rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1 : ( ruleEntityMockEntityNestedAttribute ) ;
+    public final void rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29198:1: ( ( ruleEntityMockEntityNestedAttribute ) )
+            // InternalEntityMockDSL.g:29199:2: ( ruleEntityMockEntityNestedAttribute )
+            {
+            // InternalEntityMockDSL.g:29199:2: ( ruleEntityMockEntityNestedAttribute )
+            // InternalEntityMockDSL.g:29200:3: ruleEntityMockEntityNestedAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockEntityNestedAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityFunctionParameter__NestedAttributeAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0"
+    // InternalEntityMockDSL.g:29209:1: rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29213:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29214:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29214:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29215:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29216:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29217:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__ReferenceAssignment_0"
+
+
+    // $ANTLR start "rule__EntityMockEntityNestedAttribute__AttributeAssignment_2"
+    // InternalEntityMockDSL.g:29228:1: rule__EntityMockEntityNestedAttribute__AttributeAssignment_2 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockEntityNestedAttribute__AttributeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29232:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29233:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29233:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29234:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:29235:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29236:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockEntityNestedAttribute__AttributeAssignment_2"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1"
+    // InternalEntityMockDSL.g:29247:1: rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29251:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29252:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29252:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29253:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29254:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29255:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__TemplateAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1"
+    // InternalEntityMockDSL.g:29266:1: rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29270:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29271:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29271:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29272:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29273:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29274:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__EmbeddedAssignment_2_1"
+
+
+    // $ANTLR start "rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4"
+    // InternalEntityMockDSL.g:29285:1: rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29289:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29290:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29290:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29291:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0()); 
+            }
+            // InternalEntityMockDSL.g:29292:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29293:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockReferencedObjectAttribute__AttributeAssignment_4"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1"
+    // InternalEntityMockDSL.g:29304:1: rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29308:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29309:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29309:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29310:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29311:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29312:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__AttributeRefAssignment_0_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1"
+    // InternalEntityMockDSL.g:29323:1: rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1 : ( ruleEntityMockReferencedObjectAttribute ) ;
+    public final void rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29327:1: ( ( ruleEntityMockReferencedObjectAttribute ) )
+            // InternalEntityMockDSL.g:29328:2: ( ruleEntityMockReferencedObjectAttribute )
+            {
+            // InternalEntityMockDSL.g:29328:2: ( ruleEntityMockReferencedObjectAttribute )
+            // InternalEntityMockDSL.g:29329:3: ruleEntityMockReferencedObjectAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEntityMockReferencedObjectAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__ReferenceAssignment_0_2_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1"
+    // InternalEntityMockDSL.g:29338:1: rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29342:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29343:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29343:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29344:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29345:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29346:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__ResourceEnumAssignment_1_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3"
+    // InternalEntityMockDSL.g:29357:1: rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29361:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29362:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29362:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29363:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0()); 
+            }
+            // InternalEntityMockDSL.g:29364:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29365:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByObject__ResourceAttributeAssignment_1_3"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__AttributeRefAssignment_1"
+    // InternalEntityMockDSL.g:29376:1: rule__EntityMockAttributeFiller__AttributeRefAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeFiller__AttributeRefAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29380:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29381:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29381:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29382:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29383:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29384:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__AttributeRefAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeFiller__FillerTypeAssignment_3"
+    // InternalEntityMockDSL.g:29395:1: rule__EntityMockAttributeFiller__FillerTypeAssignment_3 : ( rulePropertyFillerType ) ;
+    public final void rule__EntityMockAttributeFiller__FillerTypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29399:1: ( ( rulePropertyFillerType ) )
+            // InternalEntityMockDSL.g:29400:2: ( rulePropertyFillerType )
+            {
+            // InternalEntityMockDSL.g:29400:2: ( rulePropertyFillerType )
+            // InternalEntityMockDSL.g:29401:3: rulePropertyFillerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            rulePropertyFillerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeFiller__FillerTypeAssignment_3"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__AttributeRefAssignment_1"
+    // InternalEntityMockDSL.g:29410:1: rule__EntityMockAttributeByReference__AttributeRefAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeByReference__AttributeRefAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29414:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29415:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29415:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29416:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29417:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29418:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__AttributeRefAssignment_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1"
+    // InternalEntityMockDSL.g:29429:1: rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1 : ( ( RULE_ID ) ) ;
+    public final void rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29433:1: ( ( ( RULE_ID ) ) )
+            // InternalEntityMockDSL.g:29434:2: ( ( RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:29434:2: ( ( RULE_ID ) )
+            // InternalEntityMockDSL.g:29435:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29436:3: ( RULE_ID )
+            // InternalEntityMockDSL.g:29437:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__MockedEntityAssignment_3_1"
+
+
+    // $ANTLR start "rule__EntityMockAttributeByReference__OptionalForAssignment_4_1"
+    // InternalEntityMockDSL.g:29448:1: rule__EntityMockAttributeByReference__OptionalForAssignment_4_1 : ( RULE_INT ) ;
+    public final void rule__EntityMockAttributeByReference__OptionalForAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29452:1: ( ( RULE_INT ) )
+            // InternalEntityMockDSL.g:29453:2: ( RULE_INT )
+            {
+            // InternalEntityMockDSL.g:29453:2: ( RULE_INT )
+            // InternalEntityMockDSL.g:29454:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EntityMockAttributeByReference__OptionalForAssignment_4_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__StaticAssignment_2_0_0"
+    // InternalEntityMockDSL.g:29463:1: rule__XImportDeclaration__StaticAssignment_2_0_0 : ( ( 'static' ) ) ;
+    public final void rule__XImportDeclaration__StaticAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29467:1: ( ( ( 'static' ) ) )
+            // InternalEntityMockDSL.g:29468:2: ( ( 'static' ) )
+            {
+            // InternalEntityMockDSL.g:29468:2: ( ( 'static' ) )
+            // InternalEntityMockDSL.g:29469:3: ( 'static' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29470:3: ( 'static' )
+            // InternalEntityMockDSL.g:29471:4: 'static'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
+            }
+            match(input,47,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__StaticAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ExtensionAssignment_2_0_1"
+    // InternalEntityMockDSL.g:29482:1: rule__XImportDeclaration__ExtensionAssignment_2_0_1 : ( ( 'extension' ) ) ;
+    public final void rule__XImportDeclaration__ExtensionAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29486:1: ( ( ( 'extension' ) ) )
+            // InternalEntityMockDSL.g:29487:2: ( ( 'extension' ) )
+            {
+            // InternalEntityMockDSL.g:29487:2: ( ( 'extension' ) )
+            // InternalEntityMockDSL.g:29488:3: ( 'extension' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29489:3: ( 'extension' )
+            // InternalEntityMockDSL.g:29490:4: 'extension'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
+            }
+            match(input,49,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ExtensionAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2"
+    // InternalEntityMockDSL.g:29501:1: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
+    public final void rule__XImportDeclaration__ImportedTypeAssignment_2_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29505:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
+            // InternalEntityMockDSL.g:29506:2: ( ( ruleQualifiedNameInStaticImport ) )
+            {
+            // InternalEntityMockDSL.g:29506:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalEntityMockDSL.g:29507:3: ( ruleQualifiedNameInStaticImport )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); 
+            }
+            // InternalEntityMockDSL.g:29508:3: ( ruleQualifiedNameInStaticImport )
+            // InternalEntityMockDSL.g:29509:4: ruleQualifiedNameInStaticImport
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__WildcardAssignment_2_0_3_0"
+    // InternalEntityMockDSL.g:29520:1: rule__XImportDeclaration__WildcardAssignment_2_0_3_0 : ( ( '*' ) ) ;
+    public final void rule__XImportDeclaration__WildcardAssignment_2_0_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29524:1: ( ( ( '*' ) ) )
+            // InternalEntityMockDSL.g:29525:2: ( ( '*' ) )
+            {
+            // InternalEntityMockDSL.g:29525:2: ( ( '*' ) )
+            // InternalEntityMockDSL.g:29526:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29527:3: ( '*' )
+            // InternalEntityMockDSL.g:29528:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
+            }
+            match(input,37,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__WildcardAssignment_2_0_3_0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__MemberNameAssignment_2_0_3_1"
+    // InternalEntityMockDSL.g:29539:1: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 : ( ruleValidID ) ;
+    public final void rule__XImportDeclaration__MemberNameAssignment_2_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29543:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:29544:2: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:29544:2: ( ruleValidID )
+            // InternalEntityMockDSL.g:29545:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__MemberNameAssignment_2_0_3_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_1"
+    // InternalEntityMockDSL.g:29554:1: rule__XImportDeclaration__ImportedTypeAssignment_2_1 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__XImportDeclaration__ImportedTypeAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29558:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:29559:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalEntityMockDSL.g:29559:2: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:29560:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29561:3: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:29562:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedTypeAssignment_2_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedNamespaceAssignment_2_2"
+    // InternalEntityMockDSL.g:29573:1: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 : ( ruleQualifiedNameWithWildcard ) ;
+    public final void rule__XImportDeclaration__ImportedNamespaceAssignment_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29577:1: ( ( ruleQualifiedNameWithWildcard ) )
+            // InternalEntityMockDSL.g:29578:2: ( ruleQualifiedNameWithWildcard )
+            {
+            // InternalEntityMockDSL.g:29578:2: ( ruleQualifiedNameWithWildcard )
+            // InternalEntityMockDSL.g:29579:3: ruleQualifiedNameWithWildcard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedNamespaceAssignment_2_2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__FqnImportAssignment_2_3_0"
+    // InternalEntityMockDSL.g:29588:1: rule__XImportDeclaration__FqnImportAssignment_2_3_0 : ( ( 'ns' ) ) ;
+    public final void rule__XImportDeclaration__FqnImportAssignment_2_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29592:1: ( ( ( 'ns' ) ) )
+            // InternalEntityMockDSL.g:29593:2: ( ( 'ns' ) )
+            {
+            // InternalEntityMockDSL.g:29593:2: ( ( 'ns' ) )
+            // InternalEntityMockDSL.g:29594:3: ( 'ns' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29595:3: ( 'ns' )
+            // InternalEntityMockDSL.g:29596:4: 'ns'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
+            }
+            match(input,152,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__FqnImportAssignment_2_3_0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1"
+    // InternalEntityMockDSL.g:29607:1: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 : ( ruleQualifiedName ) ;
+    public final void rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29611:1: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:29612:2: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:29612:2: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:29613:3: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1"
+
+
+    // $ANTLR start "rule__XAnnotation__AnnotationTypeAssignment_2"
+    // InternalEntityMockDSL.g:29622:1: rule__XAnnotation__AnnotationTypeAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__XAnnotation__AnnotationTypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29626:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:29627:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalEntityMockDSL.g:29627:2: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:29628:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:29629:3: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:29630:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__AnnotationTypeAssignment_2"
+
+
+    // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0"
+    // InternalEntityMockDSL.g:29641:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 : ( ruleXAnnotationElementValuePair ) ;
+    public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29645:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalEntityMockDSL.g:29646:2: ( ruleXAnnotationElementValuePair )
+            {
+            // InternalEntityMockDSL.g:29646:2: ( ruleXAnnotationElementValuePair )
+            // InternalEntityMockDSL.g:29647:3: ruleXAnnotationElementValuePair
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationElementValuePair();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0"
+
+
+    // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1"
+    // InternalEntityMockDSL.g:29656:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 : ( ruleXAnnotationElementValuePair ) ;
+    public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29660:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalEntityMockDSL.g:29661:2: ( ruleXAnnotationElementValuePair )
+            {
+            // InternalEntityMockDSL.g:29661:2: ( ruleXAnnotationElementValuePair )
+            // InternalEntityMockDSL.g:29662:3: ruleXAnnotationElementValuePair
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationElementValuePair();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1"
+
+
+    // $ANTLR start "rule__XAnnotation__ValueAssignment_3_1_1"
+    // InternalEntityMockDSL.g:29671:1: rule__XAnnotation__ValueAssignment_3_1_1 : ( ruleXAnnotationElementValueOrCommaList ) ;
+    public final void rule__XAnnotation__ValueAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29675:1: ( ( ruleXAnnotationElementValueOrCommaList ) )
+            // InternalEntityMockDSL.g:29676:2: ( ruleXAnnotationElementValueOrCommaList )
+            {
+            // InternalEntityMockDSL.g:29676:2: ( ruleXAnnotationElementValueOrCommaList )
+            // InternalEntityMockDSL.g:29677:3: ruleXAnnotationElementValueOrCommaList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationElementValueOrCommaList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotation__ValueAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0"
+    // InternalEntityMockDSL.g:29686:1: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 : ( ( ruleValidID ) ) ;
+    public final void rule__XAnnotationElementValuePair__ElementAssignment_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29690:1: ( ( ( ruleValidID ) ) )
+            // InternalEntityMockDSL.g:29691:2: ( ( ruleValidID ) )
+            {
+            // InternalEntityMockDSL.g:29691:2: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:29692:3: ( ruleValidID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
+            }
+            // InternalEntityMockDSL.g:29693:3: ( ruleValidID )
+            // InternalEntityMockDSL.g:29694:4: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValuePair__ValueAssignment_1"
+    // InternalEntityMockDSL.g:29705:1: rule__XAnnotationElementValuePair__ValueAssignment_1 : ( ruleXAnnotationElementValue ) ;
+    public final void rule__XAnnotationElementValuePair__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29709:1: ( ( ruleXAnnotationElementValue ) )
+            // InternalEntityMockDSL.g:29710:2: ( ruleXAnnotationElementValue )
+            {
+            // InternalEntityMockDSL.g:29710:2: ( ruleXAnnotationElementValue )
+            // InternalEntityMockDSL.g:29711:3: ruleXAnnotationElementValue
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationElementValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValuePair__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0"
+    // InternalEntityMockDSL.g:29720:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29724:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:29725:2: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:29725:2: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:29726:3: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1"
+    // InternalEntityMockDSL.g:29735:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29739:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:29740:2: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:29740:2: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:29741:3: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1"
+    // InternalEntityMockDSL.g:29750:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29754:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:29755:2: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:29755:2: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:29756:3: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_0"
+    // InternalEntityMockDSL.g:29765:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29769:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:29770:2: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:29770:2: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:29771:3: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__ElementsAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1"
+    // InternalEntityMockDSL.g:29780:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29784:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:29785:2: ( ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:29785:2: ( ruleXAnnotationOrExpression )
+            // InternalEntityMockDSL.g:29786:3: ruleXAnnotationOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1"
+
+
+    // $ANTLR start "rule__XAssignment__FeatureAssignment_0_1"
+    // InternalEntityMockDSL.g:29795:1: rule__XAssignment__FeatureAssignment_0_1 : ( ( ruleFeatureCallID ) ) ;
+    public final void rule__XAssignment__FeatureAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29799:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalEntityMockDSL.g:29800:2: ( ( ruleFeatureCallID ) )
+            {
+            // InternalEntityMockDSL.g:29800:2: ( ( ruleFeatureCallID ) )
+            // InternalEntityMockDSL.g:29801:3: ( ruleFeatureCallID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29802:3: ( ruleFeatureCallID )
+            // InternalEntityMockDSL.g:29803:4: ruleFeatureCallID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleFeatureCallID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__FeatureAssignment_0_1"
+
+
+    // $ANTLR start "rule__XAssignment__ValueAssignment_0_3"
+    // InternalEntityMockDSL.g:29814:1: rule__XAssignment__ValueAssignment_0_3 : ( ruleXAssignment ) ;
+    public final void rule__XAssignment__ValueAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29818:1: ( ( ruleXAssignment ) )
+            // InternalEntityMockDSL.g:29819:2: ( ruleXAssignment )
+            {
+            // InternalEntityMockDSL.g:29819:2: ( ruleXAssignment )
+            // InternalEntityMockDSL.g:29820:3: ruleXAssignment
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__ValueAssignment_0_3"
+
+
+    // $ANTLR start "rule__XAssignment__FeatureAssignment_1_1_0_0_1"
+    // InternalEntityMockDSL.g:29829:1: rule__XAssignment__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpMultiAssign ) ) ;
+    public final void rule__XAssignment__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29833:1: ( ( ( ruleOpMultiAssign ) ) )
+            // InternalEntityMockDSL.g:29834:2: ( ( ruleOpMultiAssign ) )
+            {
+            // InternalEntityMockDSL.g:29834:2: ( ( ruleOpMultiAssign ) )
+            // InternalEntityMockDSL.g:29835:3: ( ruleOpMultiAssign )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29836:3: ( ruleOpMultiAssign )
+            // InternalEntityMockDSL.g:29837:4: ruleOpMultiAssign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpMultiAssign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__FeatureAssignment_1_1_0_0_1"
+
+
+    // $ANTLR start "rule__XAssignment__RightOperandAssignment_1_1_1"
+    // InternalEntityMockDSL.g:29848:1: rule__XAssignment__RightOperandAssignment_1_1_1 : ( ruleXAssignment ) ;
+    public final void rule__XAssignment__RightOperandAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29852:1: ( ( ruleXAssignment ) )
+            // InternalEntityMockDSL.g:29853:2: ( ruleXAssignment )
+            {
+            // InternalEntityMockDSL.g:29853:2: ( ruleXAssignment )
+            // InternalEntityMockDSL.g:29854:3: ruleXAssignment
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAssignment__RightOperandAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__XOrExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:29863:1: rule__XOrExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOr ) ) ;
+    public final void rule__XOrExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29867:1: ( ( ( ruleOpOr ) ) )
+            // InternalEntityMockDSL.g:29868:2: ( ( ruleOpOr ) )
+            {
+            // InternalEntityMockDSL.g:29868:2: ( ( ruleOpOr ) )
+            // InternalEntityMockDSL.g:29869:3: ( ruleOpOr )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29870:3: ( ruleOpOr )
+            // InternalEntityMockDSL.g:29871:4: ruleOpOr
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpOr();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XOrExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:29882:1: rule__XOrExpression__RightOperandAssignment_1_1 : ( ruleXAndExpression ) ;
+    public final void rule__XOrExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29886:1: ( ( ruleXAndExpression ) )
+            // InternalEntityMockDSL.g:29887:2: ( ruleXAndExpression )
+            {
+            // InternalEntityMockDSL.g:29887:2: ( ruleXAndExpression )
+            // InternalEntityMockDSL.g:29888:3: ruleXAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOrExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XAndExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:29897:1: rule__XAndExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAnd ) ) ;
+    public final void rule__XAndExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29901:1: ( ( ( ruleOpAnd ) ) )
+            // InternalEntityMockDSL.g:29902:2: ( ( ruleOpAnd ) )
+            {
+            // InternalEntityMockDSL.g:29902:2: ( ( ruleOpAnd ) )
+            // InternalEntityMockDSL.g:29903:3: ( ruleOpAnd )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29904:3: ( ruleOpAnd )
+            // InternalEntityMockDSL.g:29905:4: ruleOpAnd
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpAnd();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XAndExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:29916:1: rule__XAndExpression__RightOperandAssignment_1_1 : ( ruleXEqualityExpression ) ;
+    public final void rule__XAndExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29920:1: ( ( ruleXEqualityExpression ) )
+            // InternalEntityMockDSL.g:29921:2: ( ruleXEqualityExpression )
+            {
+            // InternalEntityMockDSL.g:29921:2: ( ruleXEqualityExpression )
+            // InternalEntityMockDSL.g:29922:3: ruleXEqualityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAndExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XEqualityExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:29931:1: rule__XEqualityExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpEquality ) ) ;
+    public final void rule__XEqualityExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29935:1: ( ( ( ruleOpEquality ) ) )
+            // InternalEntityMockDSL.g:29936:2: ( ( ruleOpEquality ) )
+            {
+            // InternalEntityMockDSL.g:29936:2: ( ( ruleOpEquality ) )
+            // InternalEntityMockDSL.g:29937:3: ( ruleOpEquality )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29938:3: ( ruleOpEquality )
+            // InternalEntityMockDSL.g:29939:4: ruleOpEquality
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpEquality();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XEqualityExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:29950:1: rule__XEqualityExpression__RightOperandAssignment_1_1 : ( ruleXRelationalExpression ) ;
+    public final void rule__XEqualityExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29954:1: ( ( ruleXRelationalExpression ) )
+            // InternalEntityMockDSL.g:29955:2: ( ruleXRelationalExpression )
+            {
+            // InternalEntityMockDSL.g:29955:2: ( ruleXRelationalExpression )
+            // InternalEntityMockDSL.g:29956:3: ruleXRelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XEqualityExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__TypeAssignment_1_0_1"
+    // InternalEntityMockDSL.g:29965:1: rule__XRelationalExpression__TypeAssignment_1_0_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__XRelationalExpression__TypeAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29969:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:29970:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:29970:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:29971:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__TypeAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1"
+    // InternalEntityMockDSL.g:29980:1: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpCompare ) ) ;
+    public final void rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:29984:1: ( ( ( ruleOpCompare ) ) )
+            // InternalEntityMockDSL.g:29985:2: ( ( ruleOpCompare ) )
+            {
+            // InternalEntityMockDSL.g:29985:2: ( ( ruleOpCompare ) )
+            // InternalEntityMockDSL.g:29986:3: ( ruleOpCompare )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:29987:3: ( ruleOpCompare )
+            // InternalEntityMockDSL.g:29988:4: ruleOpCompare
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpCompare();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1"
+
+
+    // $ANTLR start "rule__XRelationalExpression__RightOperandAssignment_1_1_1"
+    // InternalEntityMockDSL.g:29999:1: rule__XRelationalExpression__RightOperandAssignment_1_1_1 : ( ruleXOtherOperatorExpression ) ;
+    public final void rule__XRelationalExpression__RightOperandAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30003:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalEntityMockDSL.g:30004:2: ( ruleXOtherOperatorExpression )
+            {
+            // InternalEntityMockDSL.g:30004:2: ( ruleXOtherOperatorExpression )
+            // InternalEntityMockDSL.g:30005:3: ruleXOtherOperatorExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XRelationalExpression__RightOperandAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:30014:1: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOther ) ) ;
+    public final void rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30018:1: ( ( ( ruleOpOther ) ) )
+            // InternalEntityMockDSL.g:30019:2: ( ( ruleOpOther ) )
+            {
+            // InternalEntityMockDSL.g:30019:2: ( ( ruleOpOther ) )
+            // InternalEntityMockDSL.g:30020:3: ( ruleOpOther )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30021:3: ( ruleOpOther )
+            // InternalEntityMockDSL.g:30022:4: ruleOpOther
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpOther();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XOtherOperatorExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:30033:1: rule__XOtherOperatorExpression__RightOperandAssignment_1_1 : ( ruleXAdditiveExpression ) ;
+    public final void rule__XOtherOperatorExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30037:1: ( ( ruleXAdditiveExpression ) )
+            // InternalEntityMockDSL.g:30038:2: ( ruleXAdditiveExpression )
+            {
+            // InternalEntityMockDSL.g:30038:2: ( ruleXAdditiveExpression )
+            // InternalEntityMockDSL.g:30039:3: ruleXAdditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XOtherOperatorExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:30048:1: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAdd ) ) ;
+    public final void rule__XAdditiveExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30052:1: ( ( ( ruleOpAdd ) ) )
+            // InternalEntityMockDSL.g:30053:2: ( ( ruleOpAdd ) )
+            {
+            // InternalEntityMockDSL.g:30053:2: ( ( ruleOpAdd ) )
+            // InternalEntityMockDSL.g:30054:3: ( ruleOpAdd )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30055:3: ( ruleOpAdd )
+            // InternalEntityMockDSL.g:30056:4: ruleOpAdd
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpAdd();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XAdditiveExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:30067:1: rule__XAdditiveExpression__RightOperandAssignment_1_1 : ( ruleXMultiplicativeExpression ) ;
+    public final void rule__XAdditiveExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30071:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalEntityMockDSL.g:30072:2: ( ruleXMultiplicativeExpression )
+            {
+            // InternalEntityMockDSL.g:30072:2: ( ruleXMultiplicativeExpression )
+            // InternalEntityMockDSL.g:30073:3: ruleXMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XAdditiveExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1"
+    // InternalEntityMockDSL.g:30082:1: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpMulti ) ) ;
+    public final void rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30086:1: ( ( ( ruleOpMulti ) ) )
+            // InternalEntityMockDSL.g:30087:2: ( ( ruleOpMulti ) )
+            {
+            // InternalEntityMockDSL.g:30087:2: ( ( ruleOpMulti ) )
+            // InternalEntityMockDSL.g:30088:3: ( ruleOpMulti )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30089:3: ( ruleOpMulti )
+            // InternalEntityMockDSL.g:30090:4: ruleOpMulti
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpMulti();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1"
+
+
+    // $ANTLR start "rule__XMultiplicativeExpression__RightOperandAssignment_1_1"
+    // InternalEntityMockDSL.g:30101:1: rule__XMultiplicativeExpression__RightOperandAssignment_1_1 : ( ruleXUnaryOperation ) ;
+    public final void rule__XMultiplicativeExpression__RightOperandAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30105:1: ( ( ruleXUnaryOperation ) )
+            // InternalEntityMockDSL.g:30106:2: ( ruleXUnaryOperation )
+            {
+            // InternalEntityMockDSL.g:30106:2: ( ruleXUnaryOperation )
+            // InternalEntityMockDSL.g:30107:3: ruleXUnaryOperation
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMultiplicativeExpression__RightOperandAssignment_1_1"
+
+
+    // $ANTLR start "rule__XUnaryOperation__FeatureAssignment_0_1"
+    // InternalEntityMockDSL.g:30116:1: rule__XUnaryOperation__FeatureAssignment_0_1 : ( ( ruleOpUnary ) ) ;
+    public final void rule__XUnaryOperation__FeatureAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30120:1: ( ( ( ruleOpUnary ) ) )
+            // InternalEntityMockDSL.g:30121:2: ( ( ruleOpUnary ) )
+            {
+            // InternalEntityMockDSL.g:30121:2: ( ( ruleOpUnary ) )
+            // InternalEntityMockDSL.g:30122:3: ( ruleOpUnary )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30123:3: ( ruleOpUnary )
+            // InternalEntityMockDSL.g:30124:4: ruleOpUnary
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpUnary();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__FeatureAssignment_0_1"
+
+
+    // $ANTLR start "rule__XUnaryOperation__OperandAssignment_0_2"
+    // InternalEntityMockDSL.g:30135:1: rule__XUnaryOperation__OperandAssignment_0_2 : ( ruleXUnaryOperation ) ;
+    public final void rule__XUnaryOperation__OperandAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30139:1: ( ( ruleXUnaryOperation ) )
+            // InternalEntityMockDSL.g:30140:2: ( ruleXUnaryOperation )
+            {
+            // InternalEntityMockDSL.g:30140:2: ( ruleXUnaryOperation )
+            // InternalEntityMockDSL.g:30141:3: ruleXUnaryOperation
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XUnaryOperation__OperandAssignment_0_2"
+
+
+    // $ANTLR start "rule__XCastedExpression__TypeAssignment_1_1"
+    // InternalEntityMockDSL.g:30150:1: rule__XCastedExpression__TypeAssignment_1_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__XCastedExpression__TypeAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30154:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:30155:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:30155:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:30156:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCastedExpression__TypeAssignment_1_1"
+
+
+    // $ANTLR start "rule__XPostfixOperation__FeatureAssignment_1_0_1"
+    // InternalEntityMockDSL.g:30165:1: rule__XPostfixOperation__FeatureAssignment_1_0_1 : ( ( ruleOpPostfix ) ) ;
+    public final void rule__XPostfixOperation__FeatureAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30169:1: ( ( ( ruleOpPostfix ) ) )
+            // InternalEntityMockDSL.g:30170:2: ( ( ruleOpPostfix ) )
+            {
+            // InternalEntityMockDSL.g:30170:2: ( ( ruleOpPostfix ) )
+            // InternalEntityMockDSL.g:30171:3: ( ruleOpPostfix )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30172:3: ( ruleOpPostfix )
+            // InternalEntityMockDSL.g:30173:4: ruleOpPostfix
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOpPostfix();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XPostfixOperation__FeatureAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1"
+    // InternalEntityMockDSL.g:30184:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 : ( ( '::' ) ) ;
+    public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30188:1: ( ( ( '::' ) ) )
+            // InternalEntityMockDSL.g:30189:2: ( ( '::' ) )
+            {
+            // InternalEntityMockDSL.g:30189:2: ( ( '::' ) )
+            // InternalEntityMockDSL.g:30190:3: ( '::' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30191:3: ( '::' )
+            // InternalEntityMockDSL.g:30192:4: '::'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
+            }
+            match(input,153,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2"
+    // InternalEntityMockDSL.g:30203:1: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 : ( ( ruleFeatureCallID ) ) ;
+    public final void rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30207:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalEntityMockDSL.g:30208:2: ( ( ruleFeatureCallID ) )
+            {
+            // InternalEntityMockDSL.g:30208:2: ( ( ruleFeatureCallID ) )
+            // InternalEntityMockDSL.g:30209:3: ( ruleFeatureCallID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
+            }
+            // InternalEntityMockDSL.g:30210:3: ( ruleFeatureCallID )
+            // InternalEntityMockDSL.g:30211:4: ruleFeatureCallID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleFeatureCallID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__ValueAssignment_1_0_1"
+    // InternalEntityMockDSL.g:30222:1: rule__XMemberFeatureCall__ValueAssignment_1_0_1 : ( ruleXAssignment ) ;
+    public final void rule__XMemberFeatureCall__ValueAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30226:1: ( ( ruleXAssignment ) )
+            // InternalEntityMockDSL.g:30227:2: ( ruleXAssignment )
+            {
+            // InternalEntityMockDSL.g:30227:2: ( ruleXAssignment )
+            // InternalEntityMockDSL.g:30228:3: ruleXAssignment
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__ValueAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1"
+    // InternalEntityMockDSL.g:30237:1: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 : ( ( '?.' ) ) ;
+    public final void rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30241:1: ( ( ( '?.' ) ) )
+            // InternalEntityMockDSL.g:30242:2: ( ( '?.' ) )
+            {
+            // InternalEntityMockDSL.g:30242:2: ( ( '?.' ) )
+            // InternalEntityMockDSL.g:30243:3: ( '?.' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30244:3: ( '?.' )
+            // InternalEntityMockDSL.g:30245:4: '?.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
+            }
+            match(input,154,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2"
+    // InternalEntityMockDSL.g:30256:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 : ( ( '::' ) ) ;
+    public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30260:1: ( ( ( '::' ) ) )
+            // InternalEntityMockDSL.g:30261:2: ( ( '::' ) )
+            {
+            // InternalEntityMockDSL.g:30261:2: ( ( '::' ) )
+            // InternalEntityMockDSL.g:30262:3: ( '::' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
+            }
+            // InternalEntityMockDSL.g:30263:3: ( '::' )
+            // InternalEntityMockDSL.g:30264:4: '::'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
+            }
+            match(input,153,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1"
+    // InternalEntityMockDSL.g:30275:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30279:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:30280:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:30280:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:30281:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1"
+    // InternalEntityMockDSL.g:30290:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30294:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:30295:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:30295:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:30296:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_1_2"
+    // InternalEntityMockDSL.g:30305:1: rule__XMemberFeatureCall__FeatureAssignment_1_1_2 : ( ( ruleIdOrSuper ) ) ;
+    public final void rule__XMemberFeatureCall__FeatureAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30309:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalEntityMockDSL.g:30310:2: ( ( ruleIdOrSuper ) )
+            {
+            // InternalEntityMockDSL.g:30310:2: ( ( ruleIdOrSuper ) )
+            // InternalEntityMockDSL.g:30311:3: ( ruleIdOrSuper )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
+            }
+            // InternalEntityMockDSL.g:30312:3: ( ruleIdOrSuper )
+            // InternalEntityMockDSL.g:30313:4: ruleIdOrSuper
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__FeatureAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0"
+    // InternalEntityMockDSL.g:30324:1: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 : ( ( '(' ) ) ;
+    public final void rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30328:1: ( ( ( '(' ) ) )
+            // InternalEntityMockDSL.g:30329:2: ( ( '(' ) )
+            {
+            // InternalEntityMockDSL.g:30329:2: ( ( '(' ) )
+            // InternalEntityMockDSL.g:30330:3: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:30331:3: ( '(' )
+            // InternalEntityMockDSL.g:30332:4: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0"
+    // InternalEntityMockDSL.g:30343:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 : ( ruleXShortClosure ) ;
+    public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30347:1: ( ( ruleXShortClosure ) )
+            // InternalEntityMockDSL.g:30348:2: ( ruleXShortClosure )
+            {
+            // InternalEntityMockDSL.g:30348:2: ( ruleXShortClosure )
+            // InternalEntityMockDSL.g:30349:3: ruleXShortClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXShortClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0"
+    // InternalEntityMockDSL.g:30358:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 : ( ruleXExpression ) ;
+    public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30362:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30363:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30363:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30364:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1"
+    // InternalEntityMockDSL.g:30373:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 : ( ruleXExpression ) ;
+    public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30377:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30378:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30378:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30379:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1"
+
+
+    // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4"
+    // InternalEntityMockDSL.g:30388:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 : ( ruleXClosure ) ;
+    public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30392:1: ( ( ruleXClosure ) )
+            // InternalEntityMockDSL.g:30393:2: ( ruleXClosure )
+            {
+            // InternalEntityMockDSL.g:30393:2: ( ruleXClosure )
+            // InternalEntityMockDSL.g:30394:3: ruleXClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4"
+
+
+    // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_0"
+    // InternalEntityMockDSL.g:30403:1: rule__XSetLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    public final void rule__XSetLiteral__ElementsAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30407:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30408:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30408:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30409:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__ElementsAssignment_3_0"
+
+
+    // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_1_1"
+    // InternalEntityMockDSL.g:30418:1: rule__XSetLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    public final void rule__XSetLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30422:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30423:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30423:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30424:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSetLiteral__ElementsAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_0"
+    // InternalEntityMockDSL.g:30433:1: rule__XListLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    public final void rule__XListLiteral__ElementsAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30437:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30438:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30438:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30439:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__ElementsAssignment_3_0"
+
+
+    // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_1_1"
+    // InternalEntityMockDSL.g:30448:1: rule__XListLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    public final void rule__XListLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30452:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30453:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30453:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30454:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XListLiteral__ElementsAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0"
+    // InternalEntityMockDSL.g:30463:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30467:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30468:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30468:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30469:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0"
+
+
+    // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1"
+    // InternalEntityMockDSL.g:30478:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30482:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30483:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30483:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30484:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1"
+
+
+    // $ANTLR start "rule__XClosure__ExplicitSyntaxAssignment_1_0_1"
+    // InternalEntityMockDSL.g:30493:1: rule__XClosure__ExplicitSyntaxAssignment_1_0_1 : ( ( '|' ) ) ;
+    public final void rule__XClosure__ExplicitSyntaxAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30497:1: ( ( ( '|' ) ) )
+            // InternalEntityMockDSL.g:30498:2: ( ( '|' ) )
+            {
+            // InternalEntityMockDSL.g:30498:2: ( ( '|' ) )
+            // InternalEntityMockDSL.g:30499:3: ( '|' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30500:3: ( '|' )
+            // InternalEntityMockDSL.g:30501:4: '|'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
+            }
+            match(input,155,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__ExplicitSyntaxAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__XClosure__ExpressionAssignment_2"
+    // InternalEntityMockDSL.g:30512:1: rule__XClosure__ExpressionAssignment_2 : ( ruleXExpressionInClosure ) ;
+    public final void rule__XClosure__ExpressionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30516:1: ( ( ruleXExpressionInClosure ) )
+            // InternalEntityMockDSL.g:30517:2: ( ruleXExpressionInClosure )
+            {
+            // InternalEntityMockDSL.g:30517:2: ( ruleXExpressionInClosure )
+            // InternalEntityMockDSL.g:30518:3: ruleXExpressionInClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpressionInClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XClosure__ExpressionAssignment_2"
+
+
+    // $ANTLR start "rule__XExpressionInClosure__ExpressionsAssignment_1_0"
+    // InternalEntityMockDSL.g:30527:1: rule__XExpressionInClosure__ExpressionsAssignment_1_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    public final void rule__XExpressionInClosure__ExpressionsAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30531:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalEntityMockDSL.g:30532:2: ( ruleXExpressionOrVarDeclaration )
+            {
+            // InternalEntityMockDSL.g:30532:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalEntityMockDSL.g:30533:3: ruleXExpressionOrVarDeclaration
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XExpressionInClosure__ExpressionsAssignment_1_0"
+
+
+    // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0"
+    // InternalEntityMockDSL.g:30542:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30546:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30547:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30547:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30548:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0"
+
+
+    // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1"
+    // InternalEntityMockDSL.g:30557:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30561:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30562:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30562:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30563:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1"
+
+
+    // $ANTLR start "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2"
+    // InternalEntityMockDSL.g:30572:1: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 : ( ( '|' ) ) ;
+    public final void rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30576:1: ( ( ( '|' ) ) )
+            // InternalEntityMockDSL.g:30577:2: ( ( '|' ) )
+            {
+            // InternalEntityMockDSL.g:30577:2: ( ( '|' ) )
+            // InternalEntityMockDSL.g:30578:3: ( '|' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
+            }
+            // InternalEntityMockDSL.g:30579:3: ( '|' )
+            // InternalEntityMockDSL.g:30580:4: '|'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
+            }
+            match(input,155,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2"
+
+
+    // $ANTLR start "rule__XShortClosure__ExpressionAssignment_1"
+    // InternalEntityMockDSL.g:30591:1: rule__XShortClosure__ExpressionAssignment_1 : ( ruleXExpression ) ;
+    public final void rule__XShortClosure__ExpressionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30595:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30596:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30596:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30597:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XShortClosure__ExpressionAssignment_1"
+
+
+    // $ANTLR start "rule__XIfExpression__IfAssignment_3"
+    // InternalEntityMockDSL.g:30606:1: rule__XIfExpression__IfAssignment_3 : ( ruleXExpression ) ;
+    public final void rule__XIfExpression__IfAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30610:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30611:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30611:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30612:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__IfAssignment_3"
+
+
+    // $ANTLR start "rule__XIfExpression__ThenAssignment_5"
+    // InternalEntityMockDSL.g:30621:1: rule__XIfExpression__ThenAssignment_5 : ( ruleXExpression ) ;
+    public final void rule__XIfExpression__ThenAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30625:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30626:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30626:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30627:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__ThenAssignment_5"
+
+
+    // $ANTLR start "rule__XIfExpression__ElseAssignment_6_1"
+    // InternalEntityMockDSL.g:30636:1: rule__XIfExpression__ElseAssignment_6_1 : ( ruleXExpression ) ;
+    public final void rule__XIfExpression__ElseAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30640:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30641:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30641:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30642:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XIfExpression__ElseAssignment_6_1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1"
+    // InternalEntityMockDSL.g:30651:1: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30655:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30656:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30656:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30657:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_0_1"
+    // InternalEntityMockDSL.g:30666:1: rule__XSwitchExpression__SwitchAssignment_2_0_1 : ( ruleXExpression ) ;
+    public final void rule__XSwitchExpression__SwitchAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30670:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30671:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30671:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30672:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__SwitchAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0"
+    // InternalEntityMockDSL.g:30681:1: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30685:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30686:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30686:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30687:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0"
+
+
+    // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_1_1"
+    // InternalEntityMockDSL.g:30696:1: rule__XSwitchExpression__SwitchAssignment_2_1_1 : ( ruleXExpression ) ;
+    public final void rule__XSwitchExpression__SwitchAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30700:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30701:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30701:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30702:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__SwitchAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__XSwitchExpression__CasesAssignment_4"
+    // InternalEntityMockDSL.g:30711:1: rule__XSwitchExpression__CasesAssignment_4 : ( ruleXCasePart ) ;
+    public final void rule__XSwitchExpression__CasesAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30715:1: ( ( ruleXCasePart ) )
+            // InternalEntityMockDSL.g:30716:2: ( ruleXCasePart )
+            {
+            // InternalEntityMockDSL.g:30716:2: ( ruleXCasePart )
+            // InternalEntityMockDSL.g:30717:3: ruleXCasePart
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXCasePart();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__CasesAssignment_4"
+
+
+    // $ANTLR start "rule__XSwitchExpression__DefaultAssignment_5_2"
+    // InternalEntityMockDSL.g:30726:1: rule__XSwitchExpression__DefaultAssignment_5_2 : ( ruleXExpression ) ;
+    public final void rule__XSwitchExpression__DefaultAssignment_5_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30730:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30731:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30731:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30732:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSwitchExpression__DefaultAssignment_5_2"
+
+
+    // $ANTLR start "rule__XCasePart__TypeGuardAssignment_1"
+    // InternalEntityMockDSL.g:30741:1: rule__XCasePart__TypeGuardAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__XCasePart__TypeGuardAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30745:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:30746:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:30746:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:30747:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__TypeGuardAssignment_1"
+
+
+    // $ANTLR start "rule__XCasePart__CaseAssignment_2_1"
+    // InternalEntityMockDSL.g:30756:1: rule__XCasePart__CaseAssignment_2_1 : ( ruleXExpression ) ;
+    public final void rule__XCasePart__CaseAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30760:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30761:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30761:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30762:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__CaseAssignment_2_1"
+
+
+    // $ANTLR start "rule__XCasePart__ThenAssignment_3_0_1"
+    // InternalEntityMockDSL.g:30771:1: rule__XCasePart__ThenAssignment_3_0_1 : ( ruleXExpression ) ;
+    public final void rule__XCasePart__ThenAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30775:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30776:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30776:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30777:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__ThenAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__XCasePart__FallThroughAssignment_3_1"
+    // InternalEntityMockDSL.g:30786:1: rule__XCasePart__FallThroughAssignment_3_1 : ( ( ',' ) ) ;
+    public final void rule__XCasePart__FallThroughAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30790:1: ( ( ( ',' ) ) )
+            // InternalEntityMockDSL.g:30791:2: ( ( ',' ) )
+            {
+            // InternalEntityMockDSL.g:30791:2: ( ( ',' ) )
+            // InternalEntityMockDSL.g:30792:3: ( ',' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
+            }
+            // InternalEntityMockDSL.g:30793:3: ( ',' )
+            // InternalEntityMockDSL.g:30794:4: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCasePart__FallThroughAssignment_3_1"
+
+
+    // $ANTLR start "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3"
+    // InternalEntityMockDSL.g:30805:1: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 : ( ruleJvmFormalParameter ) ;
+    public final void rule__XForLoopExpression__DeclaredParamAssignment_0_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30809:1: ( ( ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:30810:2: ( ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:30810:2: ( ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:30811:3: ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3"
+
+
+    // $ANTLR start "rule__XForLoopExpression__ForExpressionAssignment_1"
+    // InternalEntityMockDSL.g:30820:1: rule__XForLoopExpression__ForExpressionAssignment_1 : ( ruleXExpression ) ;
+    public final void rule__XForLoopExpression__ForExpressionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30824:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30825:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30825:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30826:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__ForExpressionAssignment_1"
+
+
+    // $ANTLR start "rule__XForLoopExpression__EachExpressionAssignment_3"
+    // InternalEntityMockDSL.g:30835:1: rule__XForLoopExpression__EachExpressionAssignment_3 : ( ruleXExpression ) ;
+    public final void rule__XForLoopExpression__EachExpressionAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30839:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30840:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30840:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30841:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XForLoopExpression__EachExpressionAssignment_3"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0"
+    // InternalEntityMockDSL.g:30850:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30854:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalEntityMockDSL.g:30855:2: ( ruleXExpressionOrVarDeclaration )
+            {
+            // InternalEntityMockDSL.g:30855:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalEntityMockDSL.g:30856:3: ruleXExpressionOrVarDeclaration
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1"
+    // InternalEntityMockDSL.g:30865:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 : ( ruleXExpressionOrVarDeclaration ) ;
+    public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30869:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalEntityMockDSL.g:30870:2: ( ruleXExpressionOrVarDeclaration )
+            {
+            // InternalEntityMockDSL.g:30870:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalEntityMockDSL.g:30871:3: ruleXExpressionOrVarDeclaration
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__ExpressionAssignment_5"
+    // InternalEntityMockDSL.g:30880:1: rule__XBasicForLoopExpression__ExpressionAssignment_5 : ( ruleXExpression ) ;
+    public final void rule__XBasicForLoopExpression__ExpressionAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30884:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30885:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30885:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30886:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__ExpressionAssignment_5"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0"
+    // InternalEntityMockDSL.g:30895:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 : ( ruleXExpression ) ;
+    public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30899:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30900:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30900:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30901:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1"
+    // InternalEntityMockDSL.g:30910:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 : ( ruleXExpression ) ;
+    public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30914:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30915:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30915:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30916:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1"
+
+
+    // $ANTLR start "rule__XBasicForLoopExpression__EachExpressionAssignment_9"
+    // InternalEntityMockDSL.g:30925:1: rule__XBasicForLoopExpression__EachExpressionAssignment_9 : ( ruleXExpression ) ;
+    public final void rule__XBasicForLoopExpression__EachExpressionAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30929:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30930:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30930:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30931:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBasicForLoopExpression__EachExpressionAssignment_9"
+
+
+    // $ANTLR start "rule__XWhileExpression__PredicateAssignment_3"
+    // InternalEntityMockDSL.g:30940:1: rule__XWhileExpression__PredicateAssignment_3 : ( ruleXExpression ) ;
+    public final void rule__XWhileExpression__PredicateAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30944:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30945:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30945:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30946:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__PredicateAssignment_3"
+
+
+    // $ANTLR start "rule__XWhileExpression__BodyAssignment_5"
+    // InternalEntityMockDSL.g:30955:1: rule__XWhileExpression__BodyAssignment_5 : ( ruleXExpression ) ;
+    public final void rule__XWhileExpression__BodyAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30959:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30960:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30960:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30961:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XWhileExpression__BodyAssignment_5"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__BodyAssignment_2"
+    // InternalEntityMockDSL.g:30970:1: rule__XDoWhileExpression__BodyAssignment_2 : ( ruleXExpression ) ;
+    public final void rule__XDoWhileExpression__BodyAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30974:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30975:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30975:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30976:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__BodyAssignment_2"
+
+
+    // $ANTLR start "rule__XDoWhileExpression__PredicateAssignment_5"
+    // InternalEntityMockDSL.g:30985:1: rule__XDoWhileExpression__PredicateAssignment_5 : ( ruleXExpression ) ;
+    public final void rule__XDoWhileExpression__PredicateAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:30989:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:30990:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:30990:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:30991:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XDoWhileExpression__PredicateAssignment_5"
+
+
+    // $ANTLR start "rule__XBlockExpression__ExpressionsAssignment_2_0"
+    // InternalEntityMockDSL.g:31000:1: rule__XBlockExpression__ExpressionsAssignment_2_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    public final void rule__XBlockExpression__ExpressionsAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31004:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalEntityMockDSL.g:31005:2: ( ruleXExpressionOrVarDeclaration )
+            {
+            // InternalEntityMockDSL.g:31005:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalEntityMockDSL.g:31006:3: ruleXExpressionOrVarDeclaration
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBlockExpression__ExpressionsAssignment_2_0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__WriteableAssignment_1_0"
+    // InternalEntityMockDSL.g:31015:1: rule__XVariableDeclaration__WriteableAssignment_1_0 : ( ( 'var' ) ) ;
+    public final void rule__XVariableDeclaration__WriteableAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31019:1: ( ( ( 'var' ) ) )
+            // InternalEntityMockDSL.g:31020:2: ( ( 'var' ) )
+            {
+            // InternalEntityMockDSL.g:31020:2: ( ( 'var' ) )
+            // InternalEntityMockDSL.g:31021:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
+            }
+            // InternalEntityMockDSL.g:31022:3: ( 'var' )
+            // InternalEntityMockDSL.g:31023:4: 'var'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__WriteableAssignment_1_0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__TypeAssignment_2_0_0_0"
+    // InternalEntityMockDSL.g:31034:1: rule__XVariableDeclaration__TypeAssignment_2_0_0_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__XVariableDeclaration__TypeAssignment_2_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31038:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31039:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31039:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31040:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__TypeAssignment_2_0_0_0"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_0_0_1"
+    // InternalEntityMockDSL.g:31049:1: rule__XVariableDeclaration__NameAssignment_2_0_0_1 : ( ruleValidID ) ;
+    public final void rule__XVariableDeclaration__NameAssignment_2_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31053:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:31054:2: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:31054:2: ( ruleValidID )
+            // InternalEntityMockDSL.g:31055:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__NameAssignment_2_0_0_1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_1"
+    // InternalEntityMockDSL.g:31064:1: rule__XVariableDeclaration__NameAssignment_2_1 : ( ruleValidID ) ;
+    public final void rule__XVariableDeclaration__NameAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31068:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:31069:2: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:31069:2: ( ruleValidID )
+            // InternalEntityMockDSL.g:31070:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__NameAssignment_2_1"
+
+
+    // $ANTLR start "rule__XVariableDeclaration__RightAssignment_3_1"
+    // InternalEntityMockDSL.g:31079:1: rule__XVariableDeclaration__RightAssignment_3_1 : ( ruleXExpression ) ;
+    public final void rule__XVariableDeclaration__RightAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31083:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31084:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31084:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31085:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XVariableDeclaration__RightAssignment_3_1"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__ParameterTypeAssignment_0"
+    // InternalEntityMockDSL.g:31094:1: rule__JvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31098:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31099:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31099:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31100:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__ParameterTypeAssignment_0"
+
+
+    // $ANTLR start "rule__JvmFormalParameter__NameAssignment_1"
+    // InternalEntityMockDSL.g:31109:1: rule__JvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    public final void rule__JvmFormalParameter__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31113:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:31114:2: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:31114:2: ( ruleValidID )
+            // InternalEntityMockDSL.g:31115:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmFormalParameter__NameAssignment_1"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__ParameterTypeAssignment_0"
+    // InternalEntityMockDSL.g:31124:1: rule__FullJvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__FullJvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31128:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31129:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31129:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31130:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__ParameterTypeAssignment_0"
+
+
+    // $ANTLR start "rule__FullJvmFormalParameter__NameAssignment_1"
+    // InternalEntityMockDSL.g:31139:1: rule__FullJvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    public final void rule__FullJvmFormalParameter__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31143:1: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:31144:2: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:31144:2: ( ruleValidID )
+            // InternalEntityMockDSL.g:31145:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FullJvmFormalParameter__NameAssignment_1"
+
+
+    // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_1"
+    // InternalEntityMockDSL.g:31154:1: rule__XFeatureCall__TypeArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XFeatureCall__TypeArgumentsAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31158:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31159:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31159:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31160:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__TypeArgumentsAssignment_1_1"
+
+
+    // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1"
+    // InternalEntityMockDSL.g:31169:1: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XFeatureCall__TypeArgumentsAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31173:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31174:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31174:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31175:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__XFeatureCall__FeatureAssignment_2"
+    // InternalEntityMockDSL.g:31184:1: rule__XFeatureCall__FeatureAssignment_2 : ( ( ruleIdOrSuper ) ) ;
+    public final void rule__XFeatureCall__FeatureAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31188:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalEntityMockDSL.g:31189:2: ( ( ruleIdOrSuper ) )
+            {
+            // InternalEntityMockDSL.g:31189:2: ( ( ruleIdOrSuper ) )
+            // InternalEntityMockDSL.g:31190:3: ( ruleIdOrSuper )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:31191:3: ( ruleIdOrSuper )
+            // InternalEntityMockDSL.g:31192:4: ruleIdOrSuper
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__FeatureAssignment_2"
+
+
+    // $ANTLR start "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0"
+    // InternalEntityMockDSL.g:31203:1: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 : ( ( '(' ) ) ;
+    public final void rule__XFeatureCall__ExplicitOperationCallAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31207:1: ( ( ( '(' ) ) )
+            // InternalEntityMockDSL.g:31208:2: ( ( '(' ) )
+            {
+            // InternalEntityMockDSL.g:31208:2: ( ( '(' ) )
+            // InternalEntityMockDSL.g:31209:3: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
+            }
+            // InternalEntityMockDSL.g:31210:3: ( '(' )
+            // InternalEntityMockDSL.g:31211:4: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0"
+
+
+    // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0"
+    // InternalEntityMockDSL.g:31222:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 : ( ruleXShortClosure ) ;
+    public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31226:1: ( ( ruleXShortClosure ) )
+            // InternalEntityMockDSL.g:31227:2: ( ruleXShortClosure )
+            {
+            // InternalEntityMockDSL.g:31227:2: ( ruleXShortClosure )
+            // InternalEntityMockDSL.g:31228:3: ruleXShortClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXShortClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0"
+
+
+    // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0"
+    // InternalEntityMockDSL.g:31237:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 : ( ruleXExpression ) ;
+    public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31241:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31242:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31242:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31243:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0"
+
+
+    // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1"
+    // InternalEntityMockDSL.g:31252:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 : ( ruleXExpression ) ;
+    public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31256:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31257:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31257:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31258:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1"
+
+
+    // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_4"
+    // InternalEntityMockDSL.g:31267:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_4 : ( ruleXClosure ) ;
+    public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31271:1: ( ( ruleXClosure ) )
+            // InternalEntityMockDSL.g:31272:2: ( ruleXClosure )
+            {
+            // InternalEntityMockDSL.g:31272:2: ( ruleXClosure )
+            // InternalEntityMockDSL.g:31273:3: ruleXClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFeatureCall__FeatureCallArgumentsAssignment_4"
+
+
+    // $ANTLR start "rule__XConstructorCall__ConstructorAssignment_2"
+    // InternalEntityMockDSL.g:31282:1: rule__XConstructorCall__ConstructorAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__XConstructorCall__ConstructorAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31286:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:31287:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalEntityMockDSL.g:31287:2: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:31288:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); 
+            }
+            // InternalEntityMockDSL.g:31289:3: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:31290:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ConstructorAssignment_2"
+
+
+    // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_1"
+    // InternalEntityMockDSL.g:31301:1: rule__XConstructorCall__TypeArgumentsAssignment_3_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XConstructorCall__TypeArgumentsAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31305:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31306:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31306:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31307:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__TypeArgumentsAssignment_3_1"
+
+
+    // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1"
+    // InternalEntityMockDSL.g:31316:1: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__XConstructorCall__TypeArgumentsAssignment_3_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31320:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31321:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31321:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31322:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1"
+
+
+    // $ANTLR start "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0"
+    // InternalEntityMockDSL.g:31331:1: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 : ( ( '(' ) ) ;
+    public final void rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31335:1: ( ( ( '(' ) ) )
+            // InternalEntityMockDSL.g:31336:2: ( ( '(' ) )
+            {
+            // InternalEntityMockDSL.g:31336:2: ( ( '(' ) )
+            // InternalEntityMockDSL.g:31337:3: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
+            }
+            // InternalEntityMockDSL.g:31338:3: ( '(' )
+            // InternalEntityMockDSL.g:31339:4: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0"
+
+
+    // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_0"
+    // InternalEntityMockDSL.g:31350:1: rule__XConstructorCall__ArgumentsAssignment_4_1_0 : ( ruleXShortClosure ) ;
+    public final void rule__XConstructorCall__ArgumentsAssignment_4_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31354:1: ( ( ruleXShortClosure ) )
+            // InternalEntityMockDSL.g:31355:2: ( ruleXShortClosure )
+            {
+            // InternalEntityMockDSL.g:31355:2: ( ruleXShortClosure )
+            // InternalEntityMockDSL.g:31356:3: ruleXShortClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXShortClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ArgumentsAssignment_4_1_0"
+
+
+    // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0"
+    // InternalEntityMockDSL.g:31365:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 : ( ruleXExpression ) ;
+    public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31369:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31370:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31370:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31371:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0"
+
+
+    // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1"
+    // InternalEntityMockDSL.g:31380:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 : ( ruleXExpression ) ;
+    public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31384:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31385:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31385:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31386:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1"
+
+
+    // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_5"
+    // InternalEntityMockDSL.g:31395:1: rule__XConstructorCall__ArgumentsAssignment_5 : ( ruleXClosure ) ;
+    public final void rule__XConstructorCall__ArgumentsAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31399:1: ( ( ruleXClosure ) )
+            // InternalEntityMockDSL.g:31400:2: ( ruleXClosure )
+            {
+            // InternalEntityMockDSL.g:31400:2: ( ruleXClosure )
+            // InternalEntityMockDSL.g:31401:3: ruleXClosure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXClosure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XConstructorCall__ArgumentsAssignment_5"
+
+
+    // $ANTLR start "rule__XBooleanLiteral__IsTrueAssignment_1_1"
+    // InternalEntityMockDSL.g:31410:1: rule__XBooleanLiteral__IsTrueAssignment_1_1 : ( ( 'true' ) ) ;
+    public final void rule__XBooleanLiteral__IsTrueAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31414:1: ( ( ( 'true' ) ) )
+            // InternalEntityMockDSL.g:31415:2: ( ( 'true' ) )
+            {
+            // InternalEntityMockDSL.g:31415:2: ( ( 'true' ) )
+            // InternalEntityMockDSL.g:31416:3: ( 'true' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
+            }
+            // InternalEntityMockDSL.g:31417:3: ( 'true' )
+            // InternalEntityMockDSL.g:31418:4: 'true'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
+            }
+            match(input,156,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XBooleanLiteral__IsTrueAssignment_1_1"
+
+
+    // $ANTLR start "rule__XNumberLiteral__ValueAssignment_1"
+    // InternalEntityMockDSL.g:31429:1: rule__XNumberLiteral__ValueAssignment_1 : ( ruleNumber ) ;
+    public final void rule__XNumberLiteral__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31433:1: ( ( ruleNumber ) )
+            // InternalEntityMockDSL.g:31434:2: ( ruleNumber )
+            {
+            // InternalEntityMockDSL.g:31434:2: ( ruleNumber )
+            // InternalEntityMockDSL.g:31435:3: ruleNumber
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNumber();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XNumberLiteral__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__XStringLiteral__ValueAssignment_1"
+    // InternalEntityMockDSL.g:31444:1: rule__XStringLiteral__ValueAssignment_1 : ( RULE_STRING ) ;
+    public final void rule__XStringLiteral__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31448:1: ( ( RULE_STRING ) )
+            // InternalEntityMockDSL.g:31449:2: ( RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:31449:2: ( RULE_STRING )
+            // InternalEntityMockDSL.g:31450:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XStringLiteral__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__XTypeLiteral__TypeAssignment_3"
+    // InternalEntityMockDSL.g:31459:1: rule__XTypeLiteral__TypeAssignment_3 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__XTypeLiteral__TypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31463:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:31464:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalEntityMockDSL.g:31464:2: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:31465:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); 
+            }
+            // InternalEntityMockDSL.g:31466:3: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:31467:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__TypeAssignment_3"
+
+
+    // $ANTLR start "rule__XTypeLiteral__ArrayDimensionsAssignment_4"
+    // InternalEntityMockDSL.g:31478:1: rule__XTypeLiteral__ArrayDimensionsAssignment_4 : ( ruleArrayBrackets ) ;
+    public final void rule__XTypeLiteral__ArrayDimensionsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31482:1: ( ( ruleArrayBrackets ) )
+            // InternalEntityMockDSL.g:31483:2: ( ruleArrayBrackets )
+            {
+            // InternalEntityMockDSL.g:31483:2: ( ruleArrayBrackets )
+            // InternalEntityMockDSL.g:31484:3: ruleArrayBrackets
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTypeLiteral__ArrayDimensionsAssignment_4"
+
+
+    // $ANTLR start "rule__XThrowExpression__ExpressionAssignment_2"
+    // InternalEntityMockDSL.g:31493:1: rule__XThrowExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    public final void rule__XThrowExpression__ExpressionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31497:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31498:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31498:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31499:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XThrowExpression__ExpressionAssignment_2"
+
+
+    // $ANTLR start "rule__XReturnExpression__ExpressionAssignment_2"
+    // InternalEntityMockDSL.g:31508:1: rule__XReturnExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    public final void rule__XReturnExpression__ExpressionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31512:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31513:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31513:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31514:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XReturnExpression__ExpressionAssignment_2"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__ExpressionAssignment_2"
+    // InternalEntityMockDSL.g:31523:1: rule__XTryCatchFinallyExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    public final void rule__XTryCatchFinallyExpression__ExpressionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31527:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31528:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31528:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31529:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__ExpressionAssignment_2"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0"
+    // InternalEntityMockDSL.g:31538:1: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 : ( ruleXCatchClause ) ;
+    public final void rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31542:1: ( ( ruleXCatchClause ) )
+            // InternalEntityMockDSL.g:31543:2: ( ruleXCatchClause )
+            {
+            // InternalEntityMockDSL.g:31543:2: ( ruleXCatchClause )
+            // InternalEntityMockDSL.g:31544:3: ruleXCatchClause
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXCatchClause();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1"
+    // InternalEntityMockDSL.g:31553:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 : ( ruleXExpression ) ;
+    public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31557:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31558:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31558:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31559:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1"
+
+
+    // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1"
+    // InternalEntityMockDSL.g:31568:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 : ( ruleXExpression ) ;
+    public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31572:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31573:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31573:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31574:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__ParamAssignment_1"
+    // InternalEntityMockDSL.g:31583:1: rule__XSynchronizedExpression__ParamAssignment_1 : ( ruleXExpression ) ;
+    public final void rule__XSynchronizedExpression__ParamAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31587:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31588:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31588:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31589:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__ParamAssignment_1"
+
+
+    // $ANTLR start "rule__XSynchronizedExpression__ExpressionAssignment_3"
+    // InternalEntityMockDSL.g:31598:1: rule__XSynchronizedExpression__ExpressionAssignment_3 : ( ruleXExpression ) ;
+    public final void rule__XSynchronizedExpression__ExpressionAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31602:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31603:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31603:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31604:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XSynchronizedExpression__ExpressionAssignment_3"
+
+
+    // $ANTLR start "rule__XCatchClause__DeclaredParamAssignment_2"
+    // InternalEntityMockDSL.g:31613:1: rule__XCatchClause__DeclaredParamAssignment_2 : ( ruleFullJvmFormalParameter ) ;
+    public final void rule__XCatchClause__DeclaredParamAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31617:1: ( ( ruleFullJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:31618:2: ( ruleFullJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:31618:2: ( ruleFullJvmFormalParameter )
+            // InternalEntityMockDSL.g:31619:3: ruleFullJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleFullJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__DeclaredParamAssignment_2"
+
+
+    // $ANTLR start "rule__XCatchClause__ExpressionAssignment_4"
+    // InternalEntityMockDSL.g:31628:1: rule__XCatchClause__ExpressionAssignment_4 : ( ruleXExpression ) ;
+    public final void rule__XCatchClause__ExpressionAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31632:1: ( ( ruleXExpression ) )
+            // InternalEntityMockDSL.g:31633:2: ( ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:31633:2: ( ruleXExpression )
+            // InternalEntityMockDSL.g:31634:3: ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XCatchClause__ExpressionAssignment_4"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
+    // InternalEntityMockDSL.g:31643:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31647:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31648:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31648:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31649:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
+    // InternalEntityMockDSL.g:31658:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31662:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31663:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31663:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31664:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
+    // InternalEntityMockDSL.g:31673:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ReturnTypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31677:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31678:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31678:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31679:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_0"
+    // InternalEntityMockDSL.g:31688:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__JvmParameterizedTypeReference__TypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31692:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:31693:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalEntityMockDSL.g:31693:2: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:31694:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+            }
+            // InternalEntityMockDSL.g:31695:3: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:31696:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__TypeAssignment_0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
+    // InternalEntityMockDSL.g:31707:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31711:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31712:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31712:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31713:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
+    // InternalEntityMockDSL.g:31722:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31726:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31727:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31727:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31728:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
+    // InternalEntityMockDSL.g:31737:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
+    public final void rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31741:1: ( ( ( ruleValidID ) ) )
+            // InternalEntityMockDSL.g:31742:2: ( ( ruleValidID ) )
+            {
+            // InternalEntityMockDSL.g:31742:2: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:31743:3: ( ruleValidID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
+            }
+            // InternalEntityMockDSL.g:31744:3: ( ruleValidID )
+            // InternalEntityMockDSL.g:31745:4: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
+    // InternalEntityMockDSL.g:31756:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31760:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31761:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31761:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31762:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
+    // InternalEntityMockDSL.g:31771:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31775:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalEntityMockDSL.g:31776:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalEntityMockDSL.g:31776:2: ( ruleJvmArgumentTypeReference )
+            // InternalEntityMockDSL.g:31777:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
+    // InternalEntityMockDSL.g:31786:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31790:1: ( ( ruleJvmUpperBound ) )
+            // InternalEntityMockDSL.g:31791:2: ( ruleJvmUpperBound )
+            {
+            // InternalEntityMockDSL.g:31791:2: ( ruleJvmUpperBound )
+            // InternalEntityMockDSL.g:31792:3: ruleJvmUpperBound
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
+    // InternalEntityMockDSL.g:31801:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31805:1: ( ( ruleJvmUpperBoundAnded ) )
+            // InternalEntityMockDSL.g:31806:2: ( ruleJvmUpperBoundAnded )
+            {
+            // InternalEntityMockDSL.g:31806:2: ( ruleJvmUpperBoundAnded )
+            // InternalEntityMockDSL.g:31807:3: ruleJvmUpperBoundAnded
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
+    // InternalEntityMockDSL.g:31816:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31820:1: ( ( ruleJvmLowerBound ) )
+            // InternalEntityMockDSL.g:31821:2: ( ruleJvmLowerBound )
+            {
+            // InternalEntityMockDSL.g:31821:2: ( ruleJvmLowerBound )
+            // InternalEntityMockDSL.g:31822:3: ruleJvmLowerBound
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
+    // InternalEntityMockDSL.g:31831:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31835:1: ( ( ruleJvmLowerBoundAnded ) )
+            // InternalEntityMockDSL.g:31836:2: ( ruleJvmLowerBoundAnded )
+            {
+            // InternalEntityMockDSL.g:31836:2: ( ruleJvmLowerBoundAnded )
+            // InternalEntityMockDSL.g:31837:3: ruleJvmLowerBoundAnded
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__JvmUpperBound__TypeReferenceAssignment_1"
+    // InternalEntityMockDSL.g:31846:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmUpperBound__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31850:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31851:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31851:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31852:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
+    // InternalEntityMockDSL.g:31861:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmUpperBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31865:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31866:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31866:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31867:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmLowerBound__TypeReferenceAssignment_1"
+    // InternalEntityMockDSL.g:31876:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmLowerBound__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31880:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31881:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31881:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31882:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
+    // InternalEntityMockDSL.g:31891:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmLowerBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31895:1: ( ( ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:31896:2: ( ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:31896:2: ( ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:31897:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__XImportSection__ImportDeclarationsAssignment"
+    // InternalEntityMockDSL.g:31906:1: rule__XImportSection__ImportDeclarationsAssignment : ( ruleXImportDeclaration ) ;
+    public final void rule__XImportSection__ImportDeclarationsAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalEntityMockDSL.g:31910:1: ( ( ruleXImportDeclaration ) )
+            // InternalEntityMockDSL.g:31911:2: ( ruleXImportDeclaration )
+            {
+            // InternalEntityMockDSL.g:31911:2: ( ruleXImportDeclaration )
+            // InternalEntityMockDSL.g:31912:3: ruleXImportDeclaration
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportSection__ImportDeclarationsAssignment"
+
+    // $ANTLR start synpred45_InternalEntityMockDSL
+    public final void synpred45_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4096:2: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) )
+        // InternalEntityMockDSL.g:4096:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4096:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+        // InternalEntityMockDSL.g:4097:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
+        }
+        // InternalEntityMockDSL.g:4098:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        // InternalEntityMockDSL.g:4098:4: rule__XAnnotation__Group_3_1_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAnnotation__Group_3_1_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred45_InternalEntityMockDSL
+
+    // $ANTLR start synpred46_InternalEntityMockDSL
+    public final void synpred46_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4117:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) )
+        // InternalEntityMockDSL.g:4117:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4117:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+        // InternalEntityMockDSL.g:4118:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
+        }
+        // InternalEntityMockDSL.g:4119:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        // InternalEntityMockDSL.g:4119:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAnnotationElementValueOrCommaList__Group_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred46_InternalEntityMockDSL
+
+    // $ANTLR start synpred47_InternalEntityMockDSL
+    public final void synpred47_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4138:2: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) )
+        // InternalEntityMockDSL.g:4138:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4138:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+        // InternalEntityMockDSL.g:4139:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
+        }
+        // InternalEntityMockDSL.g:4140:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        // InternalEntityMockDSL.g:4140:4: rule__XAnnotationElementValue__Group_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAnnotationElementValue__Group_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred47_InternalEntityMockDSL
+
+    // $ANTLR start synpred72_InternalEntityMockDSL
+    public final void synpred72_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4423:2: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) )
+        // InternalEntityMockDSL.g:4423:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4423:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+        // InternalEntityMockDSL.g:4424:3: ( rule__OpOther__Group_6_1_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
+        }
+        // InternalEntityMockDSL.g:4425:3: ( rule__OpOther__Group_6_1_0__0 )
+        // InternalEntityMockDSL.g:4425:4: rule__OpOther__Group_6_1_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__OpOther__Group_6_1_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred72_InternalEntityMockDSL
+
+    // $ANTLR start synpred73_InternalEntityMockDSL
+    public final void synpred73_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4429:2: ( ( '<' ) )
+        // InternalEntityMockDSL.g:4429:2: ( '<' )
+        {
+        // InternalEntityMockDSL.g:4429:2: ( '<' )
+        // InternalEntityMockDSL.g:4430:3: '<'
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
+        }
+        match(input,28,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred73_InternalEntityMockDSL
+
+    // $ANTLR start synpred86_InternalEntityMockDSL
+    public final void synpred86_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4642:2: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) )
+        // InternalEntityMockDSL.g:4642:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+        {
+        // InternalEntityMockDSL.g:4642:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+        // InternalEntityMockDSL.g:4643:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
+        }
+        // InternalEntityMockDSL.g:4644:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        // InternalEntityMockDSL.g:4644:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred86_InternalEntityMockDSL
+
+    // $ANTLR start synpred94_InternalEntityMockDSL
+    public final void synpred94_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4705:2: ( ( ( ruleXForLoopExpression ) ) )
+        // InternalEntityMockDSL.g:4705:2: ( ( ruleXForLoopExpression ) )
+        {
+        // InternalEntityMockDSL.g:4705:2: ( ( ruleXForLoopExpression ) )
+        // InternalEntityMockDSL.g:4706:3: ( ruleXForLoopExpression )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
+        }
+        // InternalEntityMockDSL.g:4707:3: ( ruleXForLoopExpression )
+        // InternalEntityMockDSL.g:4707:4: ruleXForLoopExpression
+        {
+        pushFollow(FOLLOW_2);
+        ruleXForLoopExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred94_InternalEntityMockDSL
+
+    // $ANTLR start synpred95_InternalEntityMockDSL
+    public final void synpred95_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4711:2: ( ( ruleXBasicForLoopExpression ) )
+        // InternalEntityMockDSL.g:4711:2: ( ruleXBasicForLoopExpression )
+        {
+        // InternalEntityMockDSL.g:4711:2: ( ruleXBasicForLoopExpression )
+        // InternalEntityMockDSL.g:4712:3: ruleXBasicForLoopExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
+        }
+        pushFollow(FOLLOW_2);
+        ruleXBasicForLoopExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred95_InternalEntityMockDSL
+
+    // $ANTLR start synpred108_InternalEntityMockDSL
+    public final void synpred108_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4834:2: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) )
+        // InternalEntityMockDSL.g:4834:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4834:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+        // InternalEntityMockDSL.g:4835:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
+        }
+        // InternalEntityMockDSL.g:4836:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        // InternalEntityMockDSL.g:4836:4: rule__XSwitchExpression__Group_2_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XSwitchExpression__Group_2_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred108_InternalEntityMockDSL
+
+    // $ANTLR start synpred112_InternalEntityMockDSL
+    public final void synpred112_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4918:2: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) )
+        // InternalEntityMockDSL.g:4918:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+        {
+        // InternalEntityMockDSL.g:4918:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+        // InternalEntityMockDSL.g:4919:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
+        }
+        // InternalEntityMockDSL.g:4920:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        // InternalEntityMockDSL.g:4920:4: rule__XVariableDeclaration__Group_2_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XVariableDeclaration__Group_2_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred112_InternalEntityMockDSL
+
+    // $ANTLR start synpred113_InternalEntityMockDSL
+    public final void synpred113_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4939:2: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) )
+        // InternalEntityMockDSL.g:4939:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+        {
+        // InternalEntityMockDSL.g:4939:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+        // InternalEntityMockDSL.g:4940:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
+        }
+        // InternalEntityMockDSL.g:4941:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        // InternalEntityMockDSL.g:4941:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred113_InternalEntityMockDSL
+
+    // $ANTLR start synpred119_InternalEntityMockDSL
+    public final void synpred119_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5020:2: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) )
+        // InternalEntityMockDSL.g:5020:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+        {
+        // InternalEntityMockDSL.g:5020:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+        // InternalEntityMockDSL.g:5021:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
+        }
+        // InternalEntityMockDSL.g:5022:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        // InternalEntityMockDSL.g:5022:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XConstructorCall__ArgumentsAssignment_4_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred119_InternalEntityMockDSL
+
+    // $ANTLR start synpred204_InternalEntityMockDSL
+    public final void synpred204_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:15692:3: ( rule__XAssignment__Group_1_1__0 )
+        // InternalEntityMockDSL.g:15692:3: rule__XAssignment__Group_1_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAssignment__Group_1_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred204_InternalEntityMockDSL
+
+    // $ANTLR start synpred206_InternalEntityMockDSL
+    public final void synpred206_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:16043:3: ( rule__XOrExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:16043:3: rule__XOrExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XOrExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred206_InternalEntityMockDSL
+
+    // $ANTLR start synpred207_InternalEntityMockDSL
+    public final void synpred207_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:16232:3: ( rule__XAndExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:16232:3: rule__XAndExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAndExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred207_InternalEntityMockDSL
+
+    // $ANTLR start synpred208_InternalEntityMockDSL
+    public final void synpred208_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:16421:3: ( rule__XEqualityExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:16421:3: rule__XEqualityExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XEqualityExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred208_InternalEntityMockDSL
+
+    // $ANTLR start synpred209_InternalEntityMockDSL
+    public final void synpred209_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:16610:3: ( rule__XRelationalExpression__Alternatives_1 )
+        // InternalEntityMockDSL.g:16610:3: rule__XRelationalExpression__Alternatives_1
+        {
+        pushFollow(FOLLOW_2);
+        rule__XRelationalExpression__Alternatives_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred209_InternalEntityMockDSL
+
+    // $ANTLR start synpred210_InternalEntityMockDSL
+    public final void synpred210_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:16988:3: ( rule__XOtherOperatorExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:16988:3: rule__XOtherOperatorExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XOtherOperatorExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred210_InternalEntityMockDSL
+
+    // $ANTLR start synpred211_InternalEntityMockDSL
+    public final void synpred211_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:17501:3: ( rule__XAdditiveExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:17501:3: rule__XAdditiveExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAdditiveExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred211_InternalEntityMockDSL
+
+    // $ANTLR start synpred212_InternalEntityMockDSL
+    public final void synpred212_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:17690:3: ( rule__XMultiplicativeExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:17690:3: rule__XMultiplicativeExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMultiplicativeExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred212_InternalEntityMockDSL
+
+    // $ANTLR start synpred213_InternalEntityMockDSL
+    public final void synpred213_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:17960:3: ( rule__XCastedExpression__Group_1__0 )
+        // InternalEntityMockDSL.g:17960:3: rule__XCastedExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XCastedExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred213_InternalEntityMockDSL
+
+    // $ANTLR start synpred214_InternalEntityMockDSL
+    public final void synpred214_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:18149:3: ( rule__XPostfixOperation__Group_1__0 )
+        // InternalEntityMockDSL.g:18149:3: rule__XPostfixOperation__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XPostfixOperation__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred214_InternalEntityMockDSL
+
+    // $ANTLR start synpred215_InternalEntityMockDSL
+    public final void synpred215_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:18284:3: ( rule__XMemberFeatureCall__Alternatives_1 )
+        // InternalEntityMockDSL.g:18284:3: rule__XMemberFeatureCall__Alternatives_1
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__Alternatives_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred215_InternalEntityMockDSL
+
+    // $ANTLR start synpred217_InternalEntityMockDSL
+    public final void synpred217_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:18582:3: ( rule__XMemberFeatureCall__Group_1_1_3__0 )
+        // InternalEntityMockDSL.g:18582:3: rule__XMemberFeatureCall__Group_1_1_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__Group_1_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred217_InternalEntityMockDSL
+
+    // $ANTLR start synpred218_InternalEntityMockDSL
+    public final void synpred218_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:18608:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )
+        // InternalEntityMockDSL.g:18608:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred218_InternalEntityMockDSL
+
+    // $ANTLR start synpred226_InternalEntityMockDSL
+    public final void synpred226_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:19581:3: ( rule__XClosure__Group_1__0 )
+        // InternalEntityMockDSL.g:19581:3: rule__XClosure__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XClosure__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred226_InternalEntityMockDSL
+
+    // $ANTLR start synpred233_InternalEntityMockDSL
+    public final void synpred233_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:20552:3: ( rule__XIfExpression__Group_6__0 )
+        // InternalEntityMockDSL.g:20552:3: rule__XIfExpression__Group_6__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XIfExpression__Group_6__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred233_InternalEntityMockDSL
+
+    // $ANTLR start synpred236_InternalEntityMockDSL
+    public final void synpred236_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:21012:3: ( rule__XSwitchExpression__Group_2_1_0__0 )
+        // InternalEntityMockDSL.g:21012:3: rule__XSwitchExpression__Group_2_1_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XSwitchExpression__Group_2_1_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred236_InternalEntityMockDSL
+
+    // $ANTLR start synpred249_InternalEntityMockDSL
+    public final void synpred249_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:23145:3: ( rule__XFeatureCall__Group_3__0 )
+        // InternalEntityMockDSL.g:23145:3: rule__XFeatureCall__Group_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XFeatureCall__Group_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred249_InternalEntityMockDSL
+
+    // $ANTLR start synpred250_InternalEntityMockDSL
+    public final void synpred250_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:23171:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )
+        // InternalEntityMockDSL.g:23171:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+        {
+        pushFollow(FOLLOW_2);
+        rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred250_InternalEntityMockDSL
+
+    // $ANTLR start synpred254_InternalEntityMockDSL
+    public final void synpred254_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:23631:3: ( rule__XConstructorCall__Group_3__0 )
+        // InternalEntityMockDSL.g:23631:3: rule__XConstructorCall__Group_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XConstructorCall__Group_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred254_InternalEntityMockDSL
+
+    // $ANTLR start synpred255_InternalEntityMockDSL
+    public final void synpred255_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:23658:3: ( rule__XConstructorCall__Group_4__0 )
+        // InternalEntityMockDSL.g:23658:3: rule__XConstructorCall__Group_4__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XConstructorCall__Group_4__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred255_InternalEntityMockDSL
+
+    // $ANTLR start synpred256_InternalEntityMockDSL
+    public final void synpred256_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:23684:3: ( rule__XConstructorCall__ArgumentsAssignment_5 )
+        // InternalEntityMockDSL.g:23684:3: rule__XConstructorCall__ArgumentsAssignment_5
+        {
+        pushFollow(FOLLOW_2);
+        rule__XConstructorCall__ArgumentsAssignment_5();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred256_InternalEntityMockDSL
+
+    // $ANTLR start synpred261_InternalEntityMockDSL
+    public final void synpred261_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:24575:3: ( rule__XReturnExpression__ExpressionAssignment_2 )
+        // InternalEntityMockDSL.g:24575:3: rule__XReturnExpression__ExpressionAssignment_2
+        {
+        pushFollow(FOLLOW_2);
+        rule__XReturnExpression__ExpressionAssignment_2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred261_InternalEntityMockDSL
+
+    // $ANTLR start synpred262_InternalEntityMockDSL
+    public final void synpred262_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:24717:4: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+        // InternalEntityMockDSL.g:24717:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred262_InternalEntityMockDSL
+
+    // $ANTLR start synpred263_InternalEntityMockDSL
+    public final void synpred263_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:24744:3: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )
+        // InternalEntityMockDSL.g:24744:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XTryCatchFinallyExpression__Group_3_0_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred263_InternalEntityMockDSL
+
+    // $ANTLR start synpred264_InternalEntityMockDSL
+    public final void synpred264_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:25257:3: ( rule__QualifiedName__Group_1__0 )
+        // InternalEntityMockDSL.g:25257:3: rule__QualifiedName__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__QualifiedName__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred264_InternalEntityMockDSL
+
+    // $ANTLR start synpred266_InternalEntityMockDSL
+    public final void synpred266_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:25473:3: ( rule__JvmTypeReference__Group_0_1__0 )
+        // InternalEntityMockDSL.g:25473:3: rule__JvmTypeReference__Group_0_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmTypeReference__Group_0_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred266_InternalEntityMockDSL
+
+    // $ANTLR start synpred270_InternalEntityMockDSL
+    public final void synpred270_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:25932:3: ( rule__JvmParameterizedTypeReference__Group_1__0 )
+        // InternalEntityMockDSL.g:25932:3: rule__JvmParameterizedTypeReference__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmParameterizedTypeReference__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred270_InternalEntityMockDSL
+
+    // $ANTLR start synpred272_InternalEntityMockDSL
+    public final void synpred272_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:26067:3: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )
+        // InternalEntityMockDSL.g:26067:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmParameterizedTypeReference__Group_1_4__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred272_InternalEntityMockDSL
+
+    // $ANTLR start synpred273_InternalEntityMockDSL
+    public final void synpred273_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:26202:3: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )
+        // InternalEntityMockDSL.g:26202:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmParameterizedTypeReference__Group_1_4_2__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred273_InternalEntityMockDSL
+
+    // $ANTLR start synpred278_InternalEntityMockDSL
+    public final void synpred278_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27015:3: ( ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) ) )
+        // InternalEntityMockDSL.g:27015:3: ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) )
+        {
+        // InternalEntityMockDSL.g:27015:3: ({...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) ) )
+        // InternalEntityMockDSL.g:27016:4: {...}? => ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred278_InternalEntityMockDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0)");
+        }
+        // InternalEntityMockDSL.g:27016:108: ( ( ( rule__EntityMock__Group_4_1_0__0 ) ) )
+        // InternalEntityMockDSL.g:27017:5: ( ( rule__EntityMock__Group_4_1_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0);
+        // InternalEntityMockDSL.g:27023:5: ( ( rule__EntityMock__Group_4_1_0__0 ) )
+        // InternalEntityMockDSL.g:27024:6: ( rule__EntityMock__Group_4_1_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockAccess().getGroup_4_1_0()); 
+        }
+        // InternalEntityMockDSL.g:27025:6: ( rule__EntityMock__Group_4_1_0__0 )
+        // InternalEntityMockDSL.g:27025:7: rule__EntityMock__Group_4_1_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__Group_4_1_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred278_InternalEntityMockDSL
+
+    // $ANTLR start synpred279_InternalEntityMockDSL
+    public final void synpred279_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27030:3: ( ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) ) )
+        // InternalEntityMockDSL.g:27030:3: ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) )
+        {
+        // InternalEntityMockDSL.g:27030:3: ({...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) ) )
+        // InternalEntityMockDSL.g:27031:4: {...}? => ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred279_InternalEntityMockDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1)");
+        }
+        // InternalEntityMockDSL.g:27031:108: ( ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) ) )
+        // InternalEntityMockDSL.g:27032:5: ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1);
+        // InternalEntityMockDSL.g:27038:5: ( ( rule__EntityMock__DatainterchangesAssignment_4_1_1 ) )
+        // InternalEntityMockDSL.g:27039:6: ( rule__EntityMock__DatainterchangesAssignment_4_1_1 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockAccess().getDatainterchangesAssignment_4_1_1()); 
+        }
+        // InternalEntityMockDSL.g:27040:6: ( rule__EntityMock__DatainterchangesAssignment_4_1_1 )
+        // InternalEntityMockDSL.g:27040:7: rule__EntityMock__DatainterchangesAssignment_4_1_1
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__DatainterchangesAssignment_4_1_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred279_InternalEntityMockDSL
+
+    // $ANTLR start synpred280_InternalEntityMockDSL
+    public final void synpred280_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27045:3: ( ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) ) )
+        // InternalEntityMockDSL.g:27045:3: ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) )
+        {
+        // InternalEntityMockDSL.g:27045:3: ({...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) ) )
+        // InternalEntityMockDSL.g:27046:4: {...}? => ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred280_InternalEntityMockDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2)");
+        }
+        // InternalEntityMockDSL.g:27046:108: ( ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) ) )
+        // InternalEntityMockDSL.g:27047:5: ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2);
+        // InternalEntityMockDSL.g:27053:5: ( ( rule__EntityMock__ResourcesAssignment_4_1_2 ) )
+        // InternalEntityMockDSL.g:27054:6: ( rule__EntityMock__ResourcesAssignment_4_1_2 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockAccess().getResourcesAssignment_4_1_2()); 
+        }
+        // InternalEntityMockDSL.g:27055:6: ( rule__EntityMock__ResourcesAssignment_4_1_2 )
+        // InternalEntityMockDSL.g:27055:7: rule__EntityMock__ResourcesAssignment_4_1_2
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__ResourcesAssignment_4_1_2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred280_InternalEntityMockDSL
+
+    // $ANTLR start synpred281_InternalEntityMockDSL
+    public final void synpred281_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27060:3: ( ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) ) )
+        // InternalEntityMockDSL.g:27060:3: ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) )
+        {
+        // InternalEntityMockDSL.g:27060:3: ({...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) ) )
+        // InternalEntityMockDSL.g:27061:4: {...}? => ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred281_InternalEntityMockDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3)");
+        }
+        // InternalEntityMockDSL.g:27061:108: ( ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) ) )
+        // InternalEntityMockDSL.g:27062:5: ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3);
+        // InternalEntityMockDSL.g:27068:5: ( ( rule__EntityMock__ObjectsAssignment_4_1_3 ) )
+        // InternalEntityMockDSL.g:27069:6: ( rule__EntityMock__ObjectsAssignment_4_1_3 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockAccess().getObjectsAssignment_4_1_3()); 
+        }
+        // InternalEntityMockDSL.g:27070:6: ( rule__EntityMock__ObjectsAssignment_4_1_3 )
+        // InternalEntityMockDSL.g:27070:7: rule__EntityMock__ObjectsAssignment_4_1_3
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__ObjectsAssignment_4_1_3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred281_InternalEntityMockDSL
+
+    // $ANTLR start synpred282_InternalEntityMockDSL
+    public final void synpred282_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27104:2: ( rule__EntityMock__UnorderedGroup_4_1__1 )
+        // InternalEntityMockDSL.g:27104:2: rule__EntityMock__UnorderedGroup_4_1__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__UnorderedGroup_4_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred282_InternalEntityMockDSL
+
+    // $ANTLR start synpred283_InternalEntityMockDSL
+    public final void synpred283_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27116:2: ( rule__EntityMock__UnorderedGroup_4_1__2 )
+        // InternalEntityMockDSL.g:27116:2: rule__EntityMock__UnorderedGroup_4_1__2
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__UnorderedGroup_4_1__2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred283_InternalEntityMockDSL
+
+    // $ANTLR start synpred284_InternalEntityMockDSL
+    public final void synpred284_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27128:2: ( rule__EntityMock__UnorderedGroup_4_1__3 )
+        // InternalEntityMockDSL.g:27128:2: rule__EntityMock__UnorderedGroup_4_1__3
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__UnorderedGroup_4_1__3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred284_InternalEntityMockDSL
+
+    // $ANTLR start synpred285_InternalEntityMockDSL
+    public final void synpred285_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27140:2: ( rule__EntityMock__UnorderedGroup_4_1__4 )
+        // InternalEntityMockDSL.g:27140:2: rule__EntityMock__UnorderedGroup_4_1__4
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMock__UnorderedGroup_4_1__4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred285_InternalEntityMockDSL
+
+    // $ANTLR start synpred286_InternalEntityMockDSL
+    public final void synpred286_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27164:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__0 )
+        // InternalEntityMockDSL.g:27164:2: rule__EntityMockEntity__UnorderedGroup_4_1_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMockEntity__UnorderedGroup_4_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred286_InternalEntityMockDSL
+
+    // $ANTLR start synpred287_InternalEntityMockDSL
+    public final void synpred287_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27195:8: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )
+        // InternalEntityMockDSL.g:27195:9: rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred287_InternalEntityMockDSL
+
+    // $ANTLR start synpred288_InternalEntityMockDSL
+    public final void synpred288_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27179:3: ( ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) ) )
+        // InternalEntityMockDSL.g:27179:3: ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) )
+        {
+        // InternalEntityMockDSL.g:27179:3: ({...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) ) )
+        // InternalEntityMockDSL.g:27180:4: {...}? => ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred288_InternalEntityMockDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0)");
+        }
+        // InternalEntityMockDSL.g:27180:116: ( ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) ) )
+        // InternalEntityMockDSL.g:27181:5: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0);
+        // InternalEntityMockDSL.g:27187:5: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* ) )
+        // InternalEntityMockDSL.g:27188:6: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) ) ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* )
+        {
+        // InternalEntityMockDSL.g:27188:6: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 ) )
+        // InternalEntityMockDSL.g:27189:7: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+        }
+        // InternalEntityMockDSL.g:27190:7: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )
+        // InternalEntityMockDSL.g:27190:8: rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+        {
+        pushFollow(FOLLOW_36);
+        rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalEntityMockDSL.g:27193:6: ( ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )* )
+        // InternalEntityMockDSL.g:27194:7: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )*
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesAssignment_4_1_3_0()); 
+        }
+        // InternalEntityMockDSL.g:27195:7: ( ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )*
+        loop220:
+        do {
+            int alt220=2;
+            int LA220_0 = input.LA(1);
+
+            if ( (LA220_0==73) && (synpred287_InternalEntityMockDSL())) {
+                alt220=1;
+            }
+
+
+            switch (alt220) {
+        	case 1 :
+        	    // InternalEntityMockDSL.g:27195:8: ( rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0 )=> rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0
+        	    {
+        	    pushFollow(FOLLOW_36);
+        	    rule__EntityMockEntity__ByResourceAttributesAssignment_4_1_3_0();
+
+        	    state._fsp--;
+        	    if (state.failed) return ;
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop220;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred288_InternalEntityMockDSL
+
+    // $ANTLR start synpred289_InternalEntityMockDSL
+    public final void synpred289_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:27230:2: ( rule__EntityMockEntity__UnorderedGroup_4_1_3__1 )
+        // InternalEntityMockDSL.g:27230:2: rule__EntityMockEntity__UnorderedGroup_4_1_3__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__EntityMockEntity__UnorderedGroup_4_1_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred289_InternalEntityMockDSL
+
+    // Delegated rules
+
+    public final boolean synpred270_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred270_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred266_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred266_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred254_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred254_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred279_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred279_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred282_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred282_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred209_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred209_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred249_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred249_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred283_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred283_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred94_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred94_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred255_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred255_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred236_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred236_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred47_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred47_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred112_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred112_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred208_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred208_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred207_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred207_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred211_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred211_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred215_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred215_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred284_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred284_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred285_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred285_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred212_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred212_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred214_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred214_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred206_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred206_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred286_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred286_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred278_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred278_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred213_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred213_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred261_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred261_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred119_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred119_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred73_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred73_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred262_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred262_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred45_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred45_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred86_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred86_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred217_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred217_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred250_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred250_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred287_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred287_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred210_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred210_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred204_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred204_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred263_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred263_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred46_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred46_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred288_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred288_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred264_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred264_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred272_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred272_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred256_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred256_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred95_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred95_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred289_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred289_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred108_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred108_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred280_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred280_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred113_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred113_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred72_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred72_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred273_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred273_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred233_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred233_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred226_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred226_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred218_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred218_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred281_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred281_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA20 dfa20 = new DFA20(this);
+    protected DFA22 dfa22 = new DFA22(this);
+    protected DFA23 dfa23 = new DFA23(this);
+    protected DFA24 dfa24 = new DFA24(this);
+    protected DFA31 dfa31 = new DFA31(this);
+    protected DFA39 dfa39 = new DFA39(this);
+    protected DFA42 dfa42 = new DFA42(this);
+    protected DFA43 dfa43 = new DFA43(this);
+    protected DFA46 dfa46 = new DFA46(this);
+    protected DFA51 dfa51 = new DFA51(this);
+    protected DFA54 dfa54 = new DFA54(this);
+    protected DFA137 dfa137 = new DFA137(this);
+    protected DFA143 dfa143 = new DFA143(this);
+    protected DFA150 dfa150 = new DFA150(this);
+    protected DFA151 dfa151 = new DFA151(this);
+    protected DFA159 dfa159 = new DFA159(this);
+    protected DFA169 dfa169 = new DFA169(this);
+    protected DFA182 dfa182 = new DFA182(this);
+    protected DFA183 dfa183 = new DFA183(this);
+    protected DFA187 dfa187 = new DFA187(this);
+    protected DFA188 dfa188 = new DFA188(this);
+    protected DFA189 dfa189 = new DFA189(this);
+    protected DFA194 dfa194 = new DFA194(this);
+    protected DFA203 dfa203 = new DFA203(this);
+    protected DFA206 dfa206 = new DFA206(this);
+    static final String dfa_1s = "\10\uffff";
+    static final String dfa_2s = "\2\uffff\1\5\3\uffff\1\5\1\uffff";
+    static final String dfa_3s = "\1\4\1\uffff\1\54\1\uffff\1\4\1\uffff\1\54\1\uffff";
+    static final String dfa_4s = "\1\u0098\1\uffff\1\171\1\uffff\1\45\1\uffff\1\171\1\uffff";
+    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\uffff\1\3";
+    static final String dfa_6s = "\10\uffff}>";
+    static final String[] dfa_7s = {
+            "\1\2\52\uffff\1\1\150\uffff\1\3",
+            "",
+            "\1\4\3\uffff\1\5\7\uffff\1\5\100\uffff\1\5",
+            "",
+            "\1\6\40\uffff\1\7",
+            "",
+            "\1\4\3\uffff\1\5\7\uffff\1\5\100\uffff\1\5",
+            ""
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final short[] dfa_2 = DFA.unpackEncodedString(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final char[] dfa_4 = DFA.unpackEncodedStringToUnsignedChars(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
+    static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);
+
+    class DFA20 extends DFA {
+
+        public DFA20(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 20;
+            this.eot = dfa_1;
+            this.eof = dfa_2;
+            this.min = dfa_3;
+            this.max = dfa_4;
+            this.accept = dfa_5;
+            this.special = dfa_6;
+            this.transition = dfa_7;
+        }
+        public String getDescription() {
+            return "4037:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );";
+        }
+    }
+    static final String dfa_8s = "\43\uffff";
+    static final String dfa_9s = "\1\4\1\0\41\uffff";
+    static final String dfa_10s = "\1\u009c\1\0\41\uffff";
+    static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\1";
+    static final String dfa_12s = "\1\uffff\1\0\41\uffff}>";
+    static final String[] dfa_13s = {
+            "\1\1\4\2\23\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\5\uffff\1\2\12\uffff\1\2\65\uffff\1\2\1\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\14\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
+    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
+    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
+    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
+    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
+    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);
+
+    class DFA22 extends DFA {
+
+        public DFA22(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 22;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_9;
+            this.max = dfa_10;
+            this.accept = dfa_11;
+            this.special = dfa_12;
+            this.transition = dfa_13;
+        }
+        public String getDescription() {
+            return "4091:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA22_1 = input.LA(1);
+
+                         
+                        int index22_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred45_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index22_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 22, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_14s = {
+            "\5\2\23\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\5\uffff\1\2\12\uffff\1\2\65\uffff\1\2\1\uffff\1\1\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\14\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);
+
+    class DFA23 extends DFA {
+
+        public DFA23(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 23;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_9;
+            this.max = dfa_10;
+            this.accept = dfa_11;
+            this.special = dfa_12;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "4112:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA23_1 = input.LA(1);
+
+                         
+                        int index23_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred46_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index23_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 23, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA24 extends DFA {
+
+        public DFA24(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 24;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_9;
+            this.max = dfa_10;
+            this.accept = dfa_11;
+            this.special = dfa_12;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "4133:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA24_1 = input.LA(1);
+
+                         
+                        int index24_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred47_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index24_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 24, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_15s = "\13\uffff";
+    static final String dfa_16s = "\1\33\2\uffff\1\33\7\uffff";
+    static final String dfa_17s = "\1\42\2\uffff\1\37\7\uffff";
+    static final String dfa_18s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\6\1\3";
+    static final String dfa_19s = "\13\uffff}>";
+    static final String[] dfa_20s = {
+            "\1\3\1\6\1\1\1\2\1\4\1\5\1\7\1\10",
+            "",
+            "",
+            "\1\11\3\uffff\1\12",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_15 = DFA.unpackEncodedString(dfa_15s);
+    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
+    static final char[] dfa_17 = DFA.unpackEncodedStringToUnsignedChars(dfa_17s);
+    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
+    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
+    static final short[][] dfa_20 = unpackEncodedStringArray(dfa_20s);
+
+    class DFA31 extends DFA {
+
+        public DFA31(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 31;
+            this.eot = dfa_15;
+            this.eof = dfa_15;
+            this.min = dfa_16;
+            this.max = dfa_17;
+            this.accept = dfa_18;
+            this.special = dfa_19;
+            this.transition = dfa_20;
+        }
+        public String getDescription() {
+            return "4334:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
+        }
+    }
+    static final String dfa_21s = "\12\uffff";
+    static final String dfa_22s = "\4\uffff\5\3\1\uffff";
+    static final String dfa_23s = "\1\54\2\4\1\uffff\5\4\1\uffff";
+    static final String dfa_24s = "\1\u009a\2\62\1\uffff\5\u009c\1\uffff";
+    static final String dfa_25s = "\3\uffff\1\2\5\uffff\1\1";
+    static final String dfa_26s = "\12\uffff}>";
+    static final String[] dfa_27s = {
+            "\1\1\154\uffff\1\2\1\3",
+            "\1\4\27\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
+            "\1\4\27\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
+            "",
+            "\5\3\4\uffff\1\11\2\3\1\uffff\43\3\5\uffff\2\3\11\uffff\3\3\2\uffff\1\3\47\uffff\1\3\7\uffff\1\3\1\uffff\26\3\10\uffff\2\3\1\uffff\1\3",
+            "\5\3\4\uffff\1\11\2\3\1\uffff\43\3\5\uffff\2\3\11\uffff\3\3\2\uffff\1\3\47\uffff\1\3\7\uffff\1\3\1\uffff\26\3\10\uffff\2\3\1\uffff\1\3",
+            "\5\3\4\uffff\1\11\2\3\1\uffff\43\3\5\uffff\2\3\11\uffff\3\3\2\uffff\1\3\47\uffff\1\3\7\uffff\1\3\1\uffff\26\3\10\uffff\2\3\1\uffff\1\3",
+            "\5\3\4\uffff\1\11\2\3\1\uffff\43\3\5\uffff\2\3\11\uffff\3\3\2\uffff\1\3\47\uffff\1\3\7\uffff\1\3\1\uffff\26\3\10\uffff\2\3\1\uffff\1\3",
+            "\5\3\4\uffff\1\11\2\3\1\uffff\43\3\5\uffff\2\3\11\uffff\3\3\2\uffff\1\3\47\uffff\1\3\7\uffff\1\3\1\uffff\26\3\10\uffff\2\3\1\uffff\1\3",
+            ""
+    };
+
+    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
+    static final short[] dfa_22 = DFA.unpackEncodedString(dfa_22s);
+    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
+    static final char[] dfa_24 = DFA.unpackEncodedStringToUnsignedChars(dfa_24s);
+    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
+    static final short[] dfa_26 = DFA.unpackEncodedString(dfa_26s);
+    static final short[][] dfa_27 = unpackEncodedStringArray(dfa_27s);
+
+    class DFA39 extends DFA {
+
+        public DFA39(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 39;
+            this.eot = dfa_21;
+            this.eof = dfa_22;
+            this.min = dfa_23;
+            this.max = dfa_24;
+            this.accept = dfa_25;
+            this.special = dfa_26;
+            this.transition = dfa_27;
+        }
+        public String getDescription() {
+            return "4568:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
+        }
+    }
+    static final String dfa_28s = "\1\4\2\0\40\uffff";
+    static final String dfa_29s = "\1\u009c\2\0\40\uffff";
+    static final String dfa_30s = "\3\uffff\1\1\1\uffff\1\2\35\uffff";
+    static final String dfa_31s = "\1\uffff\1\0\1\1\40\uffff}>";
+    static final String[] dfa_32s = {
+            "\1\1\4\5\23\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4\uffff\6\5\5\uffff\1\5\12\uffff\1\2\67\uffff\2\5\1\uffff\1\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\13\uffff\1\3\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_28 = DFA.unpackEncodedStringToUnsignedChars(dfa_28s);
+    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
+    static final short[] dfa_30 = DFA.unpackEncodedString(dfa_30s);
+    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
+    static final short[][] dfa_32 = unpackEncodedStringArray(dfa_32s);
+
+    class DFA42 extends DFA {
+
+        public DFA42(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 42;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_28;
+            this.max = dfa_29;
+            this.accept = dfa_30;
+            this.special = dfa_31;
+            this.transition = dfa_32;
+        }
+        public String getDescription() {
+            return "4637:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA42_1 = input.LA(1);
+
+                         
+                        int index42_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred86_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index42_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA42_2 = input.LA(1);
+
+                         
+                        int index42_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred86_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index42_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 42, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_33s = "\40\uffff";
+    static final String dfa_34s = "\1\4\26\uffff\1\0\10\uffff";
+    static final String dfa_35s = "\1\u009c\26\uffff\1\0\10\uffff";
+    static final String dfa_36s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
+    static final String dfa_37s = "\27\uffff\1\0\10\uffff}>";
+    static final String[] dfa_38s = {
+            "\1\5\4\14\23\uffff\1\5\21\uffff\5\5\1\14\5\uffff\1\2\12\uffff\1\35\67\uffff\2\14\1\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1\30\1\31\1\1\2\14\1\32\1\33\1\34\1\uffff\1\4\14\uffff\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
+    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
+    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
+    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
+    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
+    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);
+
+    class DFA43 extends DFA {
+
+        public DFA43(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 43;
+            this.eot = dfa_33;
+            this.eof = dfa_33;
+            this.min = dfa_34;
+            this.max = dfa_35;
+            this.accept = dfa_36;
+            this.special = dfa_37;
+            this.transition = dfa_38;
+        }
+        public String getDescription() {
+            return "4658:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA43_23 = input.LA(1);
+
+                         
+                        int index43_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred94_InternalEntityMockDSL()) ) {s = 30;}
+
+                        else if ( (synpred95_InternalEntityMockDSL()) ) {s = 31;}
+
+                         
+                        input.seek(index43_23);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 43, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_39s = {
+            "\5\2\23\uffff\1\2\3\uffff\1\2\2\uffff\2\2\4\uffff\1\2\4\uffff\6\2\5\uffff\1\2\12\uffff\1\1\67\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\11\2\1\uffff\1\2\14\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_39 = unpackEncodedStringArray(dfa_39s);
+
+    class DFA46 extends DFA {
+
+        public DFA46(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 46;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_9;
+            this.max = dfa_10;
+            this.accept = dfa_11;
+            this.special = dfa_12;
+            this.transition = dfa_39;
+        }
+        public String getDescription() {
+            return "4829:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA46_1 = input.LA(1);
+
+                         
+                        int index46_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred108_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index46_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 46, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA51 extends DFA {
+
+        public DFA51(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 51;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_28;
+            this.max = dfa_29;
+            this.accept = dfa_30;
+            this.special = dfa_31;
+            this.transition = dfa_32;
+        }
+        public String getDescription() {
+            return "4934:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA51_1 = input.LA(1);
+
+                         
+                        int index51_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index51_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA51_2 = input.LA(1);
+
+                         
+                        int index51_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index51_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 51, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA54 extends DFA {
+
+        public DFA54(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 54;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_28;
+            this.max = dfa_29;
+            this.accept = dfa_30;
+            this.special = dfa_31;
+            this.transition = dfa_32;
+        }
+        public String getDescription() {
+            return "5015:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA54_1 = input.LA(1);
+
+                         
+                        int index54_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred119_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index54_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA54_2 = input.LA(1);
+
+                         
+                        int index54_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred119_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index54_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 54, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_40s = "\1\10\11\uffff";
+    static final String dfa_41s = "\1\4\7\0\2\uffff";
+    static final String dfa_42s = "\1\u009c\7\0\2\uffff";
+    static final String dfa_43s = "\10\uffff\1\2\1\1";
+    static final String dfa_44s = "\1\uffff\1\0\1\5\1\4\1\2\1\1\1\3\1\6\2\uffff}>";
+    static final String[] dfa_45s = {
+            "\5\10\5\uffff\2\10\1\uffff\1\1\1\2\1\3\1\4\1\5\5\10\1\7\1\6\27\10\5\uffff\2\10\11\uffff\3\10\2\uffff\1\10\47\uffff\1\10\7\uffff\1\10\1\uffff\26\10\10\uffff\2\10\1\uffff\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
+    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
+
+    class DFA137 extends DFA {
+
+        public DFA137(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 137;
+            this.eot = dfa_21;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "15692:2: ( rule__XAssignment__Group_1_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA137_1 = input.LA(1);
+
+                         
+                        int index137_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA137_5 = input.LA(1);
+
+                         
+                        int index137_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA137_4 = input.LA(1);
+
+                         
+                        int index137_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA137_6 = input.LA(1);
+
+                         
+                        int index137_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA137_3 = input.LA(1);
+
+                         
+                        int index137_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA137_2 = input.LA(1);
+
+                         
+                        int index137_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA137_7 = input.LA(1);
+
+                         
+                        int index137_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred204_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index137_7);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 137, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_46s = "\1\1\12\uffff";
+    static final String dfa_47s = "\1\4\1\uffff\10\0\1\uffff";
+    static final String dfa_48s = "\1\u009c\1\uffff\10\0\1\uffff";
+    static final String dfa_49s = "\1\uffff\1\2\10\uffff\1\1";
+    static final String dfa_50s = "\2\uffff\1\6\1\3\1\1\1\4\1\7\1\2\1\0\1\5\1\uffff}>";
+    static final String[] dfa_51s = {
+            "\5\1\5\uffff\2\1\1\uffff\12\1\1\3\1\2\1\4\1\5\1\6\1\7\1\10\1\11\21\1\5\uffff\2\1\11\uffff\3\1\2\uffff\1\1\47\uffff\1\1\7\uffff\1\1\1\uffff\26\1\10\uffff\2\1\1\uffff\1\1",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
+    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
+    static final char[] dfa_48 = DFA.unpackEncodedStringToUnsignedChars(dfa_48s);
+    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
+    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
+    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
+
+    class DFA143 extends DFA {
+
+        public DFA143(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 143;
+            this.eot = dfa_15;
+            this.eof = dfa_46;
+            this.min = dfa_47;
+            this.max = dfa_48;
+            this.accept = dfa_49;
+            this.special = dfa_50;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "()* loopback of 16988:2: ( rule__XOtherOperatorExpression__Group_1__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA143_8 = input.LA(1);
+
+                         
+                        int index143_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA143_4 = input.LA(1);
+
+                         
+                        int index143_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA143_7 = input.LA(1);
+
+                         
+                        int index143_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA143_3 = input.LA(1);
+
+                         
+                        int index143_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA143_5 = input.LA(1);
+
+                         
+                        int index143_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA143_9 = input.LA(1);
+
+                         
+                        int index143_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA143_2 = input.LA(1);
+
+                         
+                        int index143_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA143_6 = input.LA(1);
+
+                         
+                        int index143_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred210_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index143_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 143, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_52s = "\116\uffff";
+    static final String dfa_53s = "\1\2\115\uffff";
+    static final String dfa_54s = "\1\4\1\0\114\uffff";
+    static final String dfa_55s = "\1\u009c\1\0\114\uffff";
+    static final String dfa_56s = "\2\uffff\1\2\112\uffff\1\1";
+    static final String dfa_57s = "\1\uffff\1\0\114\uffff}>";
+    static final String[] dfa_58s = {
+            "\5\2\5\uffff\2\2\1\uffff\43\2\5\uffff\2\2\11\uffff\1\1\2\2\2\uffff\1\2\47\uffff\1\2\7\uffff\1\2\1\uffff\26\2\10\uffff\2\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
+    static final short[] dfa_53 = DFA.unpackEncodedString(dfa_53s);
+    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
+    static final char[] dfa_55 = DFA.unpackEncodedStringToUnsignedChars(dfa_55s);
+    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
+    static final short[] dfa_57 = DFA.unpackEncodedString(dfa_57s);
+    static final short[][] dfa_58 = unpackEncodedStringArray(dfa_58s);
+
+    class DFA150 extends DFA {
+
+        public DFA150(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 150;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_58;
+        }
+        public String getDescription() {
+            return "18582:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA150_1 = input.LA(1);
+
+                         
+                        int index150_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred217_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index150_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 150, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_59s = {
+            "\5\2\5\uffff\2\2\1\uffff\43\2\5\uffff\2\2\11\uffff\3\2\2\uffff\1\2\47\uffff\1\2\7\uffff\1\2\1\uffff\2\2\1\1\23\2\10\uffff\2\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_59 = unpackEncodedStringArray(dfa_59s);
+
+    class DFA151 extends DFA {
+
+        public DFA151(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 151;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_59;
+        }
+        public String getDescription() {
+            return "18608:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA151_1 = input.LA(1);
+
+                         
+                        int index151_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred218_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index151_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 151, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_60s = "\46\uffff";
+    static final String dfa_61s = "\1\4\2\0\43\uffff";
+    static final String dfa_62s = "\1\u009c\2\0\43\uffff";
+    static final String dfa_63s = "\3\uffff\1\1\1\uffff\1\2\40\uffff";
+    static final String dfa_64s = "\1\uffff\1\0\1\1\43\uffff}>";
+    static final String[] dfa_65s = {
+            "\1\1\4\5\23\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\3\uffff\7\5\5\uffff\1\5\12\uffff\1\2\4\uffff\1\5\61\uffff\3\5\1\uffff\1\5\1\uffff\1\5\3\uffff\11\5\1\uffff\1\5\13\uffff\1\3\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_60 = DFA.unpackEncodedString(dfa_60s);
+    static final char[] dfa_61 = DFA.unpackEncodedStringToUnsignedChars(dfa_61s);
+    static final char[] dfa_62 = DFA.unpackEncodedStringToUnsignedChars(dfa_62s);
+    static final short[] dfa_63 = DFA.unpackEncodedString(dfa_63s);
+    static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
+    static final short[][] dfa_65 = unpackEncodedStringArray(dfa_65s);
+
+    class DFA159 extends DFA {
+
+        public DFA159(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 159;
+            this.eot = dfa_60;
+            this.eof = dfa_60;
+            this.min = dfa_61;
+            this.max = dfa_62;
+            this.accept = dfa_63;
+            this.special = dfa_64;
+            this.transition = dfa_65;
+        }
+        public String getDescription() {
+            return "19581:2: ( rule__XClosure__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA159_1 = input.LA(1);
+
+                         
+                        int index159_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred226_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index159_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA159_2 = input.LA(1);
+
+                         
+                        int index159_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred226_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index159_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 159, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_66s = "\42\uffff";
+    static final String dfa_67s = "\1\4\2\0\37\uffff";
+    static final String dfa_68s = "\1\u009c\2\0\37\uffff";
+    static final String dfa_69s = "\3\uffff\1\1\1\2\35\uffff";
+    static final String dfa_70s = "\1\uffff\1\0\1\1\37\uffff}>";
+    static final String[] dfa_71s = {
+            "\1\1\4\4\23\uffff\1\4\3\uffff\1\3\2\uffff\2\4\4\uffff\1\4\4\uffff\6\4\5\uffff\1\4\12\uffff\1\2\67\uffff\2\4\1\uffff\1\4\1\uffff\1\4\3\uffff\11\4\1\uffff\1\4\14\uffff\1\4",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_66 = DFA.unpackEncodedString(dfa_66s);
+    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
+    static final char[] dfa_68 = DFA.unpackEncodedStringToUnsignedChars(dfa_68s);
+    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
+    static final short[] dfa_70 = DFA.unpackEncodedString(dfa_70s);
+    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
+
+    class DFA169 extends DFA {
+
+        public DFA169(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 169;
+            this.eot = dfa_66;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "21012:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA169_1 = input.LA(1);
+
+                         
+                        int index169_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred236_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index169_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA169_2 = input.LA(1);
+
+                         
+                        int index169_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred236_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index169_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 169, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA182 extends DFA {
+
+        public DFA182(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 182;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_58;
+        }
+        public String getDescription() {
+            return "23145:2: ( rule__XFeatureCall__Group_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA182_1 = input.LA(1);
+
+                         
+                        int index182_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred249_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index182_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 182, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA183 extends DFA {
+
+        public DFA183(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 183;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_59;
+        }
+        public String getDescription() {
+            return "23171:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA183_1 = input.LA(1);
+
+                         
+                        int index183_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred250_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index183_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 183, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_72s = {
+            "\5\2\5\uffff\2\2\1\uffff\13\2\1\1\27\2\5\uffff\2\2\11\uffff\3\2\2\uffff\1\2\47\uffff\1\2\7\uffff\1\2\1\uffff\26\2\10\uffff\2\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_72 = unpackEncodedStringArray(dfa_72s);
+
+    class DFA187 extends DFA {
+
+        public DFA187(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 187;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_72;
+        }
+        public String getDescription() {
+            return "23631:2: ( rule__XConstructorCall__Group_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA187_1 = input.LA(1);
+
+                         
+                        int index187_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred254_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index187_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 187, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA188 extends DFA {
+
+        public DFA188(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 188;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_58;
+        }
+        public String getDescription() {
+            return "23658:2: ( rule__XConstructorCall__Group_4__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA188_1 = input.LA(1);
+
+                         
+                        int index188_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred255_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index188_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 188, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA189 extends DFA {
+
+        public DFA189(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 189;
+            this.eot = dfa_52;
+            this.eof = dfa_53;
+            this.min = dfa_54;
+            this.max = dfa_55;
+            this.accept = dfa_56;
+            this.special = dfa_57;
+            this.transition = dfa_59;
+        }
+        public String getDescription() {
+            return "23684:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA189_1 = input.LA(1);
+
+                         
+                        int index189_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred256_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index189_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 189, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_73s = "\1\41\115\uffff";
+    static final String dfa_74s = "\1\4\40\0\55\uffff";
+    static final String dfa_75s = "\1\u009c\40\0\55\uffff";
+    static final String dfa_76s = "\41\uffff\1\2\53\uffff\1\1";
+    static final String dfa_77s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
+    static final String[] dfa_78s = {
+            "\1\1\1\23\1\24\1\25\1\27\5\uffff\2\41\1\uffff\13\41\1\15\6\41\1\10\1\7\4\41\1\6\4\41\1\2\1\3\1\4\1\5\1\16\1\21\5\uffff\1\12\1\41\11\uffff\1\40\2\41\2\uffff\1\41\47\uffff\1\41\7\uffff\1\41\1\uffff\1\41\1\17\1\20\1\41\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\11\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41\10\uffff\2\41\1\uffff\1\22",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_73 = DFA.unpackEncodedString(dfa_73s);
+    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
+    static final char[] dfa_75 = DFA.unpackEncodedStringToUnsignedChars(dfa_75s);
+    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
+    static final short[] dfa_77 = DFA.unpackEncodedString(dfa_77s);
+    static final short[][] dfa_78 = unpackEncodedStringArray(dfa_78s);
+
+    class DFA194 extends DFA {
+
+        public DFA194(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 194;
+            this.eot = dfa_52;
+            this.eof = dfa_73;
+            this.min = dfa_74;
+            this.max = dfa_75;
+            this.accept = dfa_76;
+            this.special = dfa_77;
+            this.transition = dfa_78;
+        }
+        public String getDescription() {
+            return "24575:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA194_1 = input.LA(1);
+
+                         
+                        int index194_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA194_2 = input.LA(1);
+
+                         
+                        int index194_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA194_3 = input.LA(1);
+
+                         
+                        int index194_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA194_4 = input.LA(1);
+
+                         
+                        int index194_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA194_5 = input.LA(1);
+
+                         
+                        int index194_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA194_6 = input.LA(1);
+
+                         
+                        int index194_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA194_7 = input.LA(1);
+
+                         
+                        int index194_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA194_8 = input.LA(1);
+
+                         
+                        int index194_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA194_9 = input.LA(1);
+
+                         
+                        int index194_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA194_10 = input.LA(1);
+
+                         
+                        int index194_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA194_11 = input.LA(1);
+
+                         
+                        int index194_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA194_12 = input.LA(1);
+
+                         
+                        int index194_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA194_13 = input.LA(1);
+
+                         
+                        int index194_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA194_14 = input.LA(1);
+
+                         
+                        int index194_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA194_15 = input.LA(1);
+
+                         
+                        int index194_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA194_16 = input.LA(1);
+
+                         
+                        int index194_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA194_17 = input.LA(1);
+
+                         
+                        int index194_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA194_18 = input.LA(1);
+
+                         
+                        int index194_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA194_19 = input.LA(1);
+
+                         
+                        int index194_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA194_20 = input.LA(1);
+
+                         
+                        int index194_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA194_21 = input.LA(1);
+
+                         
+                        int index194_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA194_22 = input.LA(1);
+
+                         
+                        int index194_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA194_23 = input.LA(1);
+
+                         
+                        int index194_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA194_24 = input.LA(1);
+
+                         
+                        int index194_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA194_25 = input.LA(1);
+
+                         
+                        int index194_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA194_26 = input.LA(1);
+
+                         
+                        int index194_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA194_27 = input.LA(1);
+
+                         
+                        int index194_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA194_28 = input.LA(1);
+
+                         
+                        int index194_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA194_29 = input.LA(1);
+
+                         
+                        int index194_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA194_30 = input.LA(1);
+
+                         
+                        int index194_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA194_31 = input.LA(1);
+
+                         
+                        int index194_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA194_32 = input.LA(1);
+
+                         
+                        int index194_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred261_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index194_32);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 194, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_79s = "\120\uffff";
+    static final String dfa_80s = "\1\2\117\uffff";
+    static final String dfa_81s = "\1\4\1\0\116\uffff";
+    static final String dfa_82s = "\1\u009c\1\0\116\uffff";
+    static final String dfa_83s = "\2\uffff\1\2\114\uffff\1\1";
+    static final String dfa_84s = "\1\uffff\1\0\116\uffff}>";
+    static final String[] dfa_85s = {
+            "\5\2\5\uffff\2\2\1\uffff\13\2\1\1\27\2\5\uffff\2\2\11\uffff\3\2\2\uffff\1\2\7\uffff\1\2\37\uffff\1\2\7\uffff\1\2\1\uffff\26\2\1\uffff\1\2\6\uffff\2\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
+    static final short[] dfa_80 = DFA.unpackEncodedString(dfa_80s);
+    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
+    static final char[] dfa_82 = DFA.unpackEncodedStringToUnsignedChars(dfa_82s);
+    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
+    static final short[] dfa_84 = DFA.unpackEncodedString(dfa_84s);
+    static final short[][] dfa_85 = unpackEncodedStringArray(dfa_85s);
+
+    class DFA203 extends DFA {
+
+        public DFA203(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 203;
+            this.eot = dfa_79;
+            this.eof = dfa_80;
+            this.min = dfa_81;
+            this.max = dfa_82;
+            this.accept = dfa_83;
+            this.special = dfa_84;
+            this.transition = dfa_85;
+        }
+        public String getDescription() {
+            return "25932:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA203_1 = input.LA(1);
+
+                         
+                        int index203_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred270_InternalEntityMockDSL()) ) {s = 79;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index203_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 203, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA206 extends DFA {
+
+        public DFA206(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 206;
+            this.eot = dfa_79;
+            this.eof = dfa_80;
+            this.min = dfa_81;
+            this.max = dfa_82;
+            this.accept = dfa_83;
+            this.special = dfa_84;
+            this.transition = dfa_85;
+        }
+        public String getDescription() {
+            return "26202:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA206_1 = input.LA(1);
+
+                         
+                        int index206_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred273_InternalEntityMockDSL()) ) {s = 79;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index206_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 206, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0001000000000002L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000000012L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0100000000000002L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0200000000000000L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0C00000000000000L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0800000000000002L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0800000000000000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0200000000000000L,0x0000000000000000L,0x0000000000080000L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x3000000000000000L,0x0000008000000081L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0400000000000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x2000000000000000L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x4400000000000000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x4000000000000002L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x8000000000000000L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0400000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000002L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000000000L,0x000000000000000CL});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0400000000000010L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000020L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000100L,0x0000000000000020L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000102L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0400000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0400000000000000L,0x0000000000004200L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000200L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000000002L,0x0000000000004200L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000100000000000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0400000000000000L,0x0000000000002000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000002L,0x0000000000002000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000100000010L,0x0000000000000030L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000040L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000100000010L,0x0000000000000010L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000007FF2780000L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0080000000000000L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000000200000L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000001000000040L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000001000000050L,0x0000000001000800L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000001000000050L,0x0000000001000000L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000001000000050L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000001000000042L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000001000000050L,0x0000000009000000L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000050L,0x0000000009000000L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000050L,0x0000000001000000L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000050L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000042L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0400000000000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000002L,0x0000010000000000L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000000L,0x0000140000000002L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0400000000000000L,0x0064000000000200L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000002L,0x0004000000000000L});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000002L,0x0060000000000200L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L,0x0000000000100000L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000A00000000000L});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000E00000L});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000000L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x00F0000000000000L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000001000000000L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0008000000000000L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000100000000010L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000100000000012L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000010010L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000000L,0x0100000000000000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0001000000000000L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000800000000010L,0x0000000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0200000000000000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0002000000000010L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000002000000010L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0400000000000000L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x020FC218100001F0L,0xB400000000000030L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x020FC218100001F0L,0xB400000000000010L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x020FC218100001F0L,0xBC00000000000010L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
+    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
+    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0003C00000000010L});
+    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x00000000183E0000L});
+    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x000000000C000000L});
+    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000004002L});
+    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000008002L});
+    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000003C00000L});
+    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000003C00002L});
+    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x000000001C000000L,0x4000000000000000L});
+    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x000000001C000002L,0x4000000000000000L});
+    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
+    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x00000007F8000000L});
+    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x00000007F8000002L});
+    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000110000000L});
+    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000001800000000L});
+    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000001800000002L});
+    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x000001E000000000L});
+    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x000001E000000002L});
+    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000021800000000L});
+    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000002L,0x0002000000000000L});
+    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x00000C0000000000L});
+    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000100000000000L,0x0000000000000000L,0x0000000006000000L});
+    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000100000000002L,0x0000000000000000L,0x0000000006000000L});
+    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000100000000000L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0007C00010000010L});
+    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000010L});
+    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000100000010L,0x0000000000000010L,0x0000000000020000L});
+    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000008000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x020FC219100001F0L,0xB400000000000030L,0x000000001800BFE2L});
+    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x060FC218100001F0L,0xB400000000000010L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x020FE219100001F0L,0xB400000000000210L,0x000000001800BFE2L});
+    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
+    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000100000010L,0x0000000000000010L,0x0000000008000000L});
+    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x020FE218100001F2L,0xB400000000000210L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x020FC219100001F0L,0xB400000000000010L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0400000100000010L,0x0000000000000050L,0x000000000000001CL});
+    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000100000012L,0x0000000000000050L,0x0000000000000014L});
+    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000000100000010L,0x0000000000000050L,0x0000000000000014L});
+    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x020FE218100001F0L,0xB600000000000210L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x020FC218100001F0L,0xB600000000000010L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x020FE218100001F0L,0xB400000000000210L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x060FE218100001F0L,0xB400000000000210L,0x000000001000BFE2L});
+    public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000200000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x0000000010000000L,0x2000000000000010L});
+    public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0008000000000000L,0x0000000000000000L,0x0000000010000000L});
+    public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x00000000000000E0L});
+    public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x00080000000001E0L,0x3000000000000000L,0x0000000010000600L});
+    public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000020L});
+    public static final BitSet FOLLOW_172 = new BitSet(new long[]{0x0000000000000002L,0x2000000000000000L});
+    public static final BitSet FOLLOW_173 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_174 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_175 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000002000L});
+    public static final BitSet FOLLOW_176 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000014000L});
+    public static final BitSet FOLLOW_177 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_178 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000010000L});
+    public static final BitSet FOLLOW_179 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+    public static final BitSet FOLLOW_180 = new BitSet(new long[]{0x0000100000000002L});
+    public static final BitSet FOLLOW_181 = new BitSet(new long[]{0x00000000000000C0L});
+    public static final BitSet FOLLOW_182 = new BitSet(new long[]{0x0004400000000000L});
+    public static final BitSet FOLLOW_183 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+    public static final BitSet FOLLOW_184 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000040000L});
+    public static final BitSet FOLLOW_185 = new BitSet(new long[]{0x0000002000000000L});
+    public static final BitSet FOLLOW_186 = new BitSet(new long[]{0x3000000000000002L,0x0000008000000081L});
+    public static final BitSet FOLLOW_187 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000200L,0x0000000000100000L});
+
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeModule.java b/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeModule.java
new file mode 100644
index 0000000..0aeda4c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeModule.java
@@ -0,0 +1,11 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.entitymock.ide;
+
+
+/**
+ * Use this class to register ide components.
+ */
+public class EntityMockDSLIdeModule extends AbstractEntityMockDSLIdeModule {
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeSetup.java b/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeSetup.java
new file mode 100644
index 0000000..0dcacef
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ide/src/org/eclipse/osbp/xtext/entitymock/ide/EntityMockDSLIdeSetup.java
@@ -0,0 +1,22 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.entitymock.ide;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLRuntimeModule;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLStandaloneSetup;
+import org.eclipse.xtext.util.Modules2;
+
+/**
+ * Initialization support for running Xtext languages as language servers.
+ */
+public class EntityMockDSLIdeSetup extends EntityMockDSLStandaloneSetup {
+
+	@Override
+	public Injector createInjector() {
+		return Guice.createInjector(Modules2.mixin(new EntityMockDSLRuntimeModule(), new EntityMockDSLIdeModule()));
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.classpath b/org.eclipse.osbp.xtext.entitymock.tests/.classpath
new file mode 100644
index 0000000..4ff52d4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.gitignore b/org.eclipse.osbp.xtext.entitymock.tests/.gitignore
new file mode 100644
index 0000000..09e3bc9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.entitymock.tests/META-INF/MANIFEST.MF
index ed66c7d..f7c0531 100644
--- a/org.eclipse.osbp.xtext.entitymock.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.entitymock.tests/META-INF/MANIFEST.MF
@@ -7,13 +7,15 @@
 Bundle-ActivationPolicy: lazy
 Require-Bundle: com.google.inject;bundle-version="3.0.0",
  org.eclipse.core.runtime,
- org.eclipse.xtext.junit4;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.junit4;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.ui.workbench;resolution:=optional,
  org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
  org.eclipse.osbp.xtext.entitymock;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.entitymock.ui;bundle-version="[0.9.0,0.10.0)"
-Import-Package: com.google.inject;version="1.4.0",
- org.apache.log4j,
+ org.eclipse.osbp.xtext.entitymock.ui;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtext.xbase.lib,
+ org.eclipse.xtext.testing,
+ org.eclipse.xtext.xbase.testing
+Import-Package: org.apache.log4j,
  org.hamcrest.core,
  org.junit;version="4.5.0",
  org.junit.runner;version="4.5.0",
@@ -22,4 +24,4 @@
  org.junit.runners;version="4.5.0",
  org.junit.runners.model;version="4.5.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.osbp.xtext.entitymock;version="0.9.0"
+Export-Package: org.eclipse.osbp.xtext.entitymock.tests;x-internal=true
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/src-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLInjectorProvider.java b/org.eclipse.osbp.xtext.entitymock.tests/src-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLInjectorProvider.java
new file mode 100644
index 0000000..04eda7c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/src-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLInjectorProvider.java
@@ -0,0 +1,79 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.tests;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLRuntimeModule;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLStandaloneSetup;
+import org.eclipse.xtext.testing.GlobalRegistries;
+import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.testing.IInjectorProvider;
+import org.eclipse.xtext.testing.IRegistryConfigurator;
+
+public class EntityMockDSLInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+
+	protected GlobalStateMemento stateBeforeInjectorCreation;
+	protected GlobalStateMemento stateAfterInjectorCreation;
+	protected Injector injector;
+
+	static {
+		GlobalRegistries.initializeDefaults();
+	}
+
+	@Override
+	public Injector getInjector() {
+		if (injector == null) {
+			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+			this.injector = internalCreateInjector();
+			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+		}
+		return injector;
+	}
+
+	protected Injector internalCreateInjector() {
+		return new EntityMockDSLStandaloneSetup() {
+			@Override
+			public Injector createInjector() {
+				return Guice.createInjector(createRuntimeModule());
+			}
+		}.createInjectorAndDoEMFRegistration();
+	}
+
+	protected EntityMockDSLRuntimeModule createRuntimeModule() {
+		// make it work also with Maven/Tycho and OSGI
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=493672
+		return new EntityMockDSLRuntimeModule() {
+			@Override
+			public ClassLoader bindClassLoaderToInstance() {
+				return EntityMockDSLInjectorProvider.class
+						.getClassLoader();
+			}
+		};
+	}
+
+	@Override
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	@Override
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/src/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.xtend b/org.eclipse.osbp.xtext.entitymock.tests/src/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.xtend
new file mode 100644
index 0000000..3563e9e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/src/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.xtend
@@ -0,0 +1,29 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.entitymock.tests
+
+import com.google.inject.Inject
+import org.eclipse.osbp.xtext.entitymock.EntityMockModel
+import org.eclipse.xtext.testing.InjectWith
+import org.eclipse.xtext.testing.XtextRunner
+import org.eclipse.xtext.testing.util.ParseHelper
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(XtextRunner)
+@InjectWith(EntityMockDSLInjectorProvider)
+class EntityMockDSLParsingTest {
+	@Inject
+	ParseHelper<EntityMockModel> parseHelper
+	
+	@Test
+	def void loadModel() {
+		val result = parseHelper.parse('''
+			Hello Xtext!
+		''')
+		Assert.assertNotNull(result)
+		Assert.assertTrue(result.eResource.errors.isEmpty)
+	}
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.tests/xtend-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.java b/org.eclipse.osbp.xtext.entitymock.tests/xtend-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.java
new file mode 100644
index 0000000..bc434b0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.tests/xtend-gen/org/eclipse/osbp/xtext/entitymock/tests/EntityMockDSLParsingTest.java
@@ -0,0 +1,43 @@
+/**
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.entitymock.tests;
+
+import com.google.inject.Inject;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
+import org.eclipse.osbp.xtext.entitymock.tests.EntityMockDSLInjectorProvider;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtext.testing.InjectWith;
+import org.eclipse.xtext.testing.XtextRunner;
+import org.eclipse.xtext.testing.util.ParseHelper;
+import org.eclipse.xtext.xbase.lib.Exceptions;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(XtextRunner.class)
+@InjectWith(EntityMockDSLInjectorProvider.class)
+@SuppressWarnings("all")
+public class EntityMockDSLParsingTest {
+  @Inject
+  private ParseHelper<EntityMockModel> parseHelper;
+  
+  @Test
+  public void loadModel() {
+    try {
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("Hello Xtext!");
+      _builder.newLine();
+      final EntityMockModel result = this.parseHelper.parse(_builder);
+      Assert.assertNotNull(result);
+      Resource _eResource = result.eResource();
+      EList<Resource.Diagnostic> _errors = _eResource.getErrors();
+      boolean _isEmpty = _errors.isEmpty();
+      Assert.assertTrue(_isEmpty);
+    } catch (Throwable _e) {
+      throw Exceptions.sneakyThrow(_e);
+    }
+  }
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.classpath b/org.eclipse.osbp.xtext.entitymock.ui/.classpath
new file mode 100644
index 0000000..0377d77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/.gitignore
new file mode 100644
index 0000000..fa635ba
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.gitignore
@@ -0,0 +1,8 @@
+/bin/
+#/emf-gen/
+#/xtend-gen/
+# exclude everything inside /src-gen except README.txt
+# see http://git-scm.com/docs/gitignore
+!/src-gen
+#/src-gen/*
+!/src-gen/README.txt
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.entitymock.ui/META-INF/MANIFEST.MF
index 076ee80..545e87a 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.entitymock.ui/META-INF/MANIFEST.MF
@@ -10,15 +10,14 @@
  org.eclipse.ui,
  org.eclipse.ui.editors;bundle-version="3.5.0",
  org.eclipse.ui.ide;bundle-version="3.5.0",
- javax.annotation;bundle-version="[1.1.0,1.2.0)",
  com.google.inject;bundle-version="3.0.0",
- org.eclipse.xtext.common.types.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.ui.shared;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.ui.codetemplates.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.builder;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.common.types.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui.shared;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.ui.codetemplates.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase.ui;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.builder;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
  org.eclipse.jdt.debug.ui,
  org.eclipse.compare,
@@ -27,20 +26,23 @@
  org.eclipse.osbp.preferences;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.common.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.basic.ui;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.entitymock;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.datainterchange;bundle-version="0.9.0"
-Import-Package: org.apache.log4j,
+ org.eclipse.osbp.xtext.entitymock.ide;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.datainterchange;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.oxtype.ui;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtend.lib;resolution:=optional,
+ org.eclipse.osbp.xtext.entitymock;bundle-version="0.9.0"
+Import-Package: javax.annotation,
+ org.apache.log4j,
  org.eclipse.osbp.ui.api.datamart;version="0.9.0",
- org.eclipse.osbp.utils.fillertext;version="0.9.0"
+ org.eclipse.osbp.utils.entityhelper;version="0.9.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.xtext.entitymock.ui;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.ui.contentassist;version="0.9.0",
- org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr;version="0.9.0",
- org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.internal;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.ui.internal;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.ui.labeling;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.ui.outline;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.ui.quickfix;version="0.9.0"
-Bundle-Activator: org.eclipse.osbp.xtext.entitymock.ui.internal.EntityMockDSLActivator
+Bundle-Activator: org.eclipse.osbp.xtext.entitymock.ui.internal.EntitymockActivator
+Bundle-ClassPath: src/,src-gen/,xtend-gen/,.
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/build.properties b/org.eclipse.osbp.xtext.entitymock.ui/build.properties
index 7f5d08f..b24e7df 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/build.properties
+++ b/org.eclipse.osbp.xtext.entitymock.ui/build.properties
@@ -1,7 +1,11 @@
 source.. = src/,\
           src-gen/,\
           xtend-gen/
-bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+bin.includes = about.properties,\
+               about.mappings,\
+               about.ini,\
+               about.html,\
+               META-INF/,\
                .,\
                .settings/,\
                plugin.xml,\
@@ -10,7 +14,10 @@
                license.html,\
                LICENSE.txt,\
                epl-v10.html,\
-               icons/
+               icons/,\
+               src/,\
+               src-gen/,\
+               xtend-gen/
 src.includes = about.properties,  about.mappings,  about.ini,  about.html,  templates/,\
                i18n/,\
                license.html,\
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml b/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml
index 0632d39..720d1b4 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml
+++ b/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml
@@ -567,4 +567,34 @@
     </provider>
   </extension>
 
+    <!-- Organize imports  -->
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.osbp.xtext.oxtype.ui.imports.OXTypeOrganizeImportsHandler"
+            commandId="org.eclipse.xtext.xbase.ui.organizeImports">
+               <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>
+
+ <extension point="org.eclipse.ui.menus">
+        <menuContribution
+            locationURI="menu:#xtext.ui.SourceMenu?after=xtext.ui.ImportsSeparator">
+             <command
+                 commandId="org.eclipse.xtext.xbase.ui.organizeImports"
+                 style="push"
+                 tooltip="Organize Imports">
+                <visibleWhen checkEnabled="false">
+                    <reference
+                        definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+                    </reference>
+                </visibleWhen>
+            </command>  
+        </menuContribution>
+    </extension>
+
 </plugin>
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml_gen b/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml_gen
index bbeefb6..094b124 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml_gen
+++ b/org.eclipse.osbp.xtext.entitymock.ui/plugin.xml_gen
@@ -1,215 +1,211 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
-
 <plugin>
-
-    <extension
-            point="org.eclipse.ui.editors">
-        <editor
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
-            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
-            default="true"
-            extensions="entitymock"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            matchingStrategy="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
-            name="EntityMockDSL Editor">
-        </editor>
-    </extension>
-    <extension
-        point="org.eclipse.ui.handlers">
-        <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
-            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
-            commandId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate">
-         <activeWhen>
-            <reference
-                    definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-            </reference>
-         </activeWhen>
-      	</handler>
-      	<!-- copy qualified name -->
-        <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
-            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
-            <activeWhen>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="entitymock"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			matchingStrategy="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.editor.JavaEditorInputMatcher"
+			name="EntityMockDSL Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
 				<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
-            </activeWhen>
-        </handler>
-        <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
-            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
-            <activeWhen>
-            	<and>
-            		<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened" />
-	                <iterate>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened" />
+					<iterate>
 						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
 					</iterate>
 				</and>
-            </activeWhen>
-        </handler>
-    </extension>
-    <extension point="org.eclipse.core.expressions.definitions">
-        <definition id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-            <and>
-                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.xtext.entitymock.EntityMockDSL" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-        <definition id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened">
-            <and>
-                <reference definitionId="isXtextEditorActive"/>
-                <with variable="activeEditor">
-                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
-                        value="org.eclipse.osbp.xtext.entitymock.EntityMockDSL" 
-                        forcePluginActivation="true"/>
-                </with>        
-            </and>
-        </definition>
-    </extension>
-    <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            name="EntityMockDSL">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.coloring"
-            name="Syntax Coloring">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-        </page>
-        <page
-            category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.templates"
-            name="Templates">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            name="EntityMockDSL">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+		<definition id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			name="EntityMockDSL">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+		</page>
+		<page
+			category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			name="EntityMockDSL">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
 			</enabledWhen>
-	        <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
-        </page>
-    </extension>
-    <extension
-        point="org.eclipse.ui.keywords">
-        <keyword
-            id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"
-            label="EntityMockDSL"/>
-    </extension>
-    <extension
-         point="org.eclipse.ui.commands">
-      <command
-            description="Trigger expensive validation"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate"
-            name="Validate">
-      </command>
-      <!-- copy qualified name -->
-      <command
-            id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
-            categoryId="org.eclipse.ui.category.edit"
-            description="Copy the qualified name for the selected element"
-            name="Copy Qualified Name">
-      </command>
-      <command
-            id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
-            categoryId="org.eclipse.ui.category.edit"
-            description="Copy the qualified name for the selected element"
-            name="Copy Qualified Name">
-      </command>
-    </extension>
-    <extension point="org.eclipse.ui.menus">
-        <menuContribution
-            locationURI="popup:#TextEditorContext?after=group.edit">
-             <command
-                 commandId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate"
-                 style="push"
-                 tooltip="Trigger expensive validation">
-            <visibleWhen checkEnabled="false">
-                <reference
-                    definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-                </reference>
-            </visibleWhen>
-         </command>  
-         </menuContribution>
-         <!-- copy qualified name -->
-         <menuContribution locationURI="popup:#TextEditorContext?after=copy">
-         	<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
-         		style="push" tooltip="Copy Qualified Name">
-            	<visibleWhen checkEnabled="false">
-                	<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
-            	</visibleWhen>
-         	</command>  
-         </menuContribution>
-         <menuContribution locationURI="menu:edit?after=copy">
-         	<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
-            	style="push" tooltip="Copy Qualified Name">
-            	<visibleWhen checkEnabled="false">
-                	<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
-            	</visibleWhen>
-         	</command>  
-         </menuContribution>
-         <menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
-			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"
+			label="EntityMockDSL"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
 				style="push" tooltip="Copy Qualified Name">
-         		<visibleWhen checkEnabled="false">
-	            	<and>
-	            		<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened" />
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.XtextEditor.opened" />
 						<iterate>
 							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
 						</iterate>
 					</and>
 				</visibleWhen>
 			</command>
-         </menuContribution>
-    </extension>
-    <extension point="org.eclipse.ui.menus">
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
 		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
 			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
 				<visibleWhen checkEnabled="false">
-                	<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-                	</reference>
-            	</visibleWhen>
+					<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+					</reference>
+				</visibleWhen>
 			</command>
 		</menuContribution>
 	</extension>
 	<extension point="org.eclipse.ui.handlers">
-	    <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
-            commandId="org.eclipse.xtext.ui.editor.FindReferences">
-            <activeWhen>
-                <reference
-                    definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-                </reference>
-            </activeWhen>
-        </handler>
-    </extension>   
-
-<!-- adding resource factories -->
-
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
 	<extension
 		point="org.eclipse.emf.ecore.extension_parser">
 		<parser
@@ -218,69 +214,81 @@
 		</parser>
 	</extension>
 	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
-        <resourceServiceProvider
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
-            uriExtension="entitymock">
-        </resourceServiceProvider>
-    </extension>
-
-
+		<resourceServiceProvider
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="entitymock">
+		</resourceServiceProvider>
+	</extension>
 	<!-- marker definitions for org.eclipse.osbp.xtext.entitymock.EntityMockDSL -->
 	<extension
-	        id="entitymockdsl.check.fast"
-	        name="EntityMockDSL Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.fast"/>
-	    <persistent value="true"/>
+			id="entitymockdsl.check.fast"
+			name="EntityMockDSL Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="entitymockdsl.check.normal"
-	        name="EntityMockDSL Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.normal"/>
-	    <persistent value="true"/>
+			id="entitymockdsl.check.normal"
+			name="EntityMockDSL Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
 	</extension>
 	<extension
-	        id="entitymockdsl.check.expensive"
-	        name="EntityMockDSL Problem"
-	        point="org.eclipse.core.resources.markers">
-	    <super type="org.eclipse.xtext.ui.check.expensive"/>
-	    <persistent value="true"/>
+			id="entitymockdsl.check.expensive"
+			name="EntityMockDSL Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
 	</extension>
-
-   <extension
-         point="org.eclipse.xtext.builder.participant">
-      <participant
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
-            fileExtensions="entitymock"
-            >
-      </participant>
-   </extension>
-   <extension
-            point="org.eclipse.ui.preferencePages">
-        <page
-            category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compiler.preferencePage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-        </page>
-    </extension>
-    <extension
-            point="org.eclipse.ui.propertyPages">
-        <page
-            category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compiler.propertyPage"
-            name="Compiler">
-            <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-            <enabledWhen>
-	            <adapt type="org.eclipse.core.resources.IProject"/>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="entitymock"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
 			</enabledWhen>
-	        <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
-        </page>
-    </extension>
-
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
 	<!-- Quick Outline -->
 	<extension
 		point="org.eclipse.ui.handlers">
@@ -314,35 +322,35 @@
 			</command>
 		</menuContribution>
 	</extension>
-    <!-- quickfix marker resolution generator for org.eclipse.osbp.xtext.entitymock.EntityMockDSL -->
-    <extension
-            point="org.eclipse.ui.ide.markerResolution">
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.fast">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.normal">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-        <markerResolutionGenerator
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
-            markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.expensive">
-            <attribute
-                name="FIXABLE_KEY"
-                value="true">
-            </attribute>
-        </markerResolutionGenerator>
-    </extension>
-   	<!-- Rename Refactoring -->
+	<!-- quickfix marker resolution generator for org.eclipse.osbp.xtext.entitymock.EntityMockDSL -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.osbp.xtext.entitymock.ui.entitymockdsl.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
@@ -354,32 +362,30 @@
 			</activeWhen>
 		</handler>
 	</extension>
-    <extension point="org.eclipse.ui.menus">
-         <menuContribution
-            locationURI="popup:#TextEditorContext?after=group.edit">
-         <command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
-               style="push">
-            <visibleWhen checkEnabled="false">
-               <reference
-                     definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension point="org.eclipse.ui.preferencePages">
-	    <page
-	        category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
-	        class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
-	        id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.refactoring"
-	        name="Refactoring">
-	        <keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
-	    </page>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
 	</extension>
-
-<!-- Type Hierarchy  -->
-	<extension
-		point="org.eclipse.ui.handlers">
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.osbp.xtext.entitymock.ui.keyword_EntityMockDSL"/>
+		</page>
+	</extension>
+	<!-- Type Hierarchy  -->
+	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchyHandler"
 			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy">
@@ -398,9 +404,31 @@
 				</reference>
 			</activeWhen>
 		</handler>
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.imports.OrganizeImportsHandler"
+			commandId="org.eclipse.xtext.xbase.ui.organizeImports">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
 	</extension>
 	<extension point="org.eclipse.ui.menus">
 		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.xtext.xbase.ui.organizeImports"
+				 style="push"
+				 tooltip="Organize Imports">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution
 			locationURI="popup:#TextEditorContext?after=group.open">
 			<command commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenTypeHierarchy"
 				style="push"
@@ -422,8 +450,7 @@
 		</menuContribution>
 	</extension>
 	<!-- Call Hierachy -->
-	<extension
-		point="org.eclipse.ui.handlers">
+	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierachyHandler"
 			commandId="org.eclipse.xtext.xbase.ui.hierarchy.OpenCallHierarchy">
@@ -434,7 +461,6 @@
 			</activeWhen>
 		</handler>
 	</extension>
-	
 	<extension point="org.eclipse.ui.menus">
 		<menuContribution
 			locationURI="popup:#TextEditorContext?after=group.open">
@@ -447,50 +473,49 @@
 			</command>
 		</menuContribution>
 	</extension>
-	<extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.smap.StratumBreakpointAdapterFactory"
-         adaptableType="org.eclipse.xtext.ui.editor.XtextEditor">
-         <adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
-      </factory> 
-   </extension>
-   <extension point="org.eclipse.ui.editorActions">
-      <editorContribution targetID="org.eclipse.osbp.xtext.entitymock.EntityMockDSL" 
-                          id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerActions">
-	     <action
-	             label="Not Used"
-	             class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-	             style="push"
-	             actionID="RulerDoubleClick"
-	             id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.doubleClickBreakpointAction"/>
-	  </editorContribution>
-   </extension>
-   <extension point="org.eclipse.ui.popupMenus">
-      <viewerContribution
-         targetID="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RulerContext"
-         id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RulerPopupActions">
-         <action
-            label="Toggle Breakpoint"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.toggleBreakpointAction">
-         </action>
-         <action
-            label="Not used"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
-            menubarPath="debug"
-            id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.enableDisableBreakpointAction">
-         </action>
-         <action
-           label="Breakpoint Properties"
-           helpContextId="breakpoint_properties_action_context"
-           class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
-           menubarPath="group.properties"
-           id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.openBreapointPropertiesAction">
-         </action>
-      </viewerContribution>
-   </extension>
-    <!-- Introduce Local Variable Refactoring -->
+	<extension point="org.eclipse.core.runtime.adapters">
+		<factory class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.builder.smap.StratumBreakpointAdapterFactory"
+			adaptableType="org.eclipse.xtext.ui.editor.XtextEditor">
+			<adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
+		</factory> 
+	</extension>
+	<extension point="org.eclipse.ui.editorActions">
+		<editorContribution targetID="org.eclipse.osbp.xtext.entitymock.EntityMockDSL" 
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerActions">
+			<action
+				label="Not Used"
+	 			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				style="push"
+				actionID="RulerDoubleClick"
+				id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.doubleClickBreakpointAction"/>
+		</editorContribution>
+	</extension>
+	<extension point="org.eclipse.ui.popupMenus">
+		<viewerContribution
+			targetID="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RulerContext"
+			id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RulerPopupActions">
+			<action
+				label="Toggle Breakpoint"
+				class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.toggleBreakpointAction">
+			</action>
+			<action
+				label="Not used"
+				class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.debug.ui.actions.RulerEnableDisableBreakpointActionDelegate"
+				menubarPath="debug"
+				id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.enableDisableBreakpointAction">
+			</action>
+			<action
+				label="Breakpoint Properties"
+				helpContextId="breakpoint_properties_action_context"
+				class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.jdt.debug.ui.actions.JavaBreakpointPropertiesRulerActionDelegate"
+				menubarPath="group.properties"
+				id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.rulerContextMenu.openBreapointPropertiesAction">
+			</action>
+		</viewerContribution>
+	</extension>
+	<!-- Introduce Local Variable Refactoring -->
 	<extension point="org.eclipse.ui.handlers">
 		<handler 
 			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.refactoring.ExtractVariableHandler"
@@ -502,61 +527,65 @@
 			</activeWhen>
 		</handler>
 	</extension>
-    <extension point="org.eclipse.ui.menus">
-         <menuContribution
-            locationURI="popup:#TextEditorContext?after=group.edit">
-         <command commandId="org.eclipse.xtext.xbase.ui.refactoring.ExtractLocalVariable"
-               style="push">
-            <visibleWhen checkEnabled="false">
-               <reference
-                     definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-               </reference>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>  
-   <!-- Open implementation -->
-   <extension point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.navigation.OpenImplementationHandler"
-            commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
-            <activeWhen>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.xbase.ui.refactoring.ExtractLocalVariable"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- Open implementation -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.xbase.ui.navigation.OpenImplementationHandler"
+			commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+			<activeWhen>
 				<reference
 					definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
 				</reference>
 			</activeWhen>
-      </handler>
-   </extension>
- <extension point="org.eclipse.ui.menus">
-       <menuContribution
-            locationURI="menu:navigate?after=open.ext4">
-         <command commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
-		<visibleWhen checkEnabled="false">
-              <reference
-                 definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
-              </reference>
-		</visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-
-  <extension point="org.eclipse.compare.contentViewers">
-    <viewer id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compare.contentViewers"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="entitymock">
-    </viewer>
-  </extension>
-  <extension point="org.eclipse.compare.contentMergeViewers">
-    <viewer id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compare.contentMergeViewers"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
-            extensions="entitymock" label="EntityMockDSL Compare">
-     </viewer>
-  </extension>
-  <extension point="org.eclipse.ui.editors.documentProviders">
-    <provider id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.editors.documentProviders"
-            class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
-            extensions="entitymock">
-    </provider>
-  </extension>
-
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="menu:navigate?after=open.ext4">
+			<command commandId="org.eclipse.xtext.xbase.ui.OpenImplementationCommand">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compare.contentViewers"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="entitymock">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.compare.contentMergeViewers"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="entitymock" label="EntityMockDSL Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.osbp.xtext.entitymock.EntityMockDSL.editors.documentProviders"
+			class="org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="entitymock">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="entitymock"
+			type="text">
+		</fileTypes>
+	</extension>
 </plugin>
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/AbstractEntityMockDSLUiModule.java b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/AbstractEntityMockDSLUiModule.java
index a330e32..2a5491e 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/AbstractEntityMockDSLUiModule.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/AbstractEntityMockDSLUiModule.java
@@ -10,366 +10,399 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.ui;
 
-import org.eclipse.xtext.ui.DefaultUiModule;
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.EntityMockDSLParser;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.PartialEntityMockDSLContentAssistParser;
+import org.eclipse.osbp.xtext.entitymock.ide.contentassist.antlr.internal.InternalEntityMockDSLLexer;
+import org.eclipse.osbp.xtext.entitymock.ui.contentassist.EntityMockDSLProposalProvider;
+import org.eclipse.osbp.xtext.entitymock.ui.labeling.EntityMockDSLDescriptionLabelProvider;
+import org.eclipse.osbp.xtext.entitymock.ui.labeling.EntityMockDSLLabelProvider;
+import org.eclipse.osbp.xtext.entitymock.ui.outline.EntityMockDSLOutlineTreeProvider;
+import org.eclipse.osbp.xtext.entitymock.ui.quickfix.EntityMockDSLQuickfixProvider;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.builder.BuilderParticipant;
+import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider;
+import org.eclipse.xtext.builder.IXtextBuilderParticipant;
+import org.eclipse.xtext.builder.builderState.IBuilderState;
+import org.eclipse.xtext.builder.clustering.CurrentDescriptions;
+import org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource;
+import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
+import org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess;
+import org.eclipse.xtext.common.types.ui.navigation.GlobalDerivedMemberAwareURIEditorOpener;
+import org.eclipse.xtext.common.types.ui.navigation.IDerivedMemberAwareEditorOpener;
+import org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation;
+import org.eclipse.xtext.common.types.ui.refactoring.JdtRenameSupport;
+import org.eclipse.xtext.common.types.ui.refactoring.participant.JdtRenameParticipant;
+import org.eclipse.xtext.common.types.ui.refactoring.participant.JvmMemberRenameStrategy;
+import org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider;
+import org.eclipse.xtext.generator.IContextualOutputConfigurationProvider;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.ui.LanguageSpecific;
+import org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.PartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry;
+import org.eclipse.xtext.ui.compare.DefaultViewerCreator;
+import org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource;
+import org.eclipse.xtext.ui.editor.GlobalURIEditorOpener;
+import org.eclipse.xtext.ui.editor.IURIEditorOpener;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.DelegatingContentAssistContextFactory;
+import org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler;
+import org.eclipse.xtext.ui.editor.findrefs.ReferenceQueryExecutor;
+import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
+import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.OutlineNodeElementOpener;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplateContextType;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+import org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler;
+import org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.IReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.IRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategyProvider;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameContextFactory;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences;
+import org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider;
+import org.eclipse.xtext.ui.shared.Access;
+import org.eclipse.xtext.xbase.annotations.ui.DefaultXbaseWithAnnotationsUiModule;
+import org.eclipse.xtext.xbase.imports.IUnresolvedTypeResolver;
+import org.eclipse.xtext.xbase.ui.contentassist.ImportingTypesProposalProvider;
+import org.eclipse.xtext.xbase.ui.editor.XbaseDocumentProvider;
+import org.eclipse.xtext.xbase.ui.editor.XbaseEditor;
+import org.eclipse.xtext.xbase.ui.generator.trace.XbaseOpenGeneratedFileHandler;
+import org.eclipse.xtext.xbase.ui.imports.InteractiveUnresolvedTypeResolver;
+import org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelFindReferenceHandler;
+import org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelReferenceQueryExecutor;
+import org.eclipse.xtext.xbase.ui.jvmmodel.navigation.DerivedMemberAwareEditorOpener;
+import org.eclipse.xtext.xbase.ui.jvmmodel.outline.JvmOutlineNodeElementOpener;
+import org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.DefaultJvmModelRenameStrategy;
+import org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelDependentElementsCalculator;
+import org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelJdtRenameParticipantContext;
+import org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameContextFactory;
+import org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameRefactoringProvider;
+import org.eclipse.xtext.xbase.ui.refactoring.XbaseReferenceUpdater;
+import org.eclipse.xtext.xbase.ui.templates.XbaseTemplateContextType;
 
 /**
- * Manual modifications go to {org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLUiModule}
+ * Manual modifications go to {@link EntityMockDSLUiModule}.
  */
 @SuppressWarnings("all")
-public abstract class AbstractEntityMockDSLUiModule extends DefaultUiModule {
-	
+public abstract class AbstractEntityMockDSLUiModule extends DefaultXbaseWithAnnotationsUiModule {
+
 	public AbstractEntityMockDSLUiModule(AbstractUIPlugin plugin) {
 		super(plugin);
 	}
 	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Provider<? extends IAllContainersState> provideIAllContainersState() {
+		return Access.getJavaProjectsState();
+	}
 	
-	// contributed by org.eclipse.xtext.ui.generator.ImplicitUiFragment
-	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
-		return org.eclipse.xtext.ui.shared.Access.getJavaProjectsState();
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Class<? extends XtextEditor> bindXtextEditor() {
+		return XbaseEditor.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.ImplicitUiFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.XtextEditor> bindXtextEditor() {
-		return org.eclipse.xtext.xbase.ui.editor.XbaseEditor.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() {
+		return XbaseDocumentProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.ImplicitUiFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.model.XtextDocumentProvider> bindXtextDocumentProvider() {
-		return org.eclipse.xtext.xbase.ui.editor.XbaseDocumentProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Class<? extends OpenGeneratedFileHandler> bindOpenGeneratedFileHandler() {
+		return XbaseOpenGeneratedFileHandler.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() {
-		return org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public void configureHighlightingLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalEntityMockDSLLexer.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public void configureHighlightingTokenDefProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.parser.antlr.ITokenDefProvider.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingLexer(Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public void configureIResourceDescriptionsBuilderScope(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(org.eclipse.xtext.builder.clustering.CurrentDescriptions.ResourceSetAware.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingTokenDefProvider(Binder binder) {
+		binder.bind(ITokenDefProvider.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(AntlrTokenDefProvider.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.IXtextEditorCallback> bindIXtextEditorCallback() {
-		return org.eclipse.xtext.builder.nature.NatureAddingEditorCallback.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+		return DelegatingContentAssistContextFactory.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public void configureIResourceDescriptionsPersisted(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(org.eclipse.xtext.builder.builderState.IBuilderState.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return EntityMockDSLParser.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
-		return org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexerProvider(Binder binder) {
+		binder.bind(InternalEntityMockDSLLexer.class).toProvider(LexerProvider.create(InternalEntityMockDSLLexer.class));
 	}
-
-	// contributed by org.eclipse.xtext.generator.generator.GeneratorFragment
-	public Class<? extends org.eclipse.xtext.builder.IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
-		return org.eclipse.xtext.builder.BuilderParticipant.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsBuilderScope(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(CurrentDescriptions.ResourceSetAware.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.generator.GeneratorFragment
-	public org.eclipse.core.resources.IWorkspaceRoot bindIWorkspaceRootToInstance() {
-		return org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot();
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+		return NatureAddingEditorCallback.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.generator.GeneratorFragment
-	public void configureBuilderPreferenceStoreInitializer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer.class).annotatedWith(com.google.inject.name.Names.named("builderPreferenceInitializer")).to(org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess.Initializer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+		return EclipseOutputConfigurationProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.labeling.LabelProviderFragment
-	public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() {
-		return org.eclipse.osbp.xtext.entitymock.ui.labeling.EntityMockDSLLabelProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(IBuilderState.class);
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.labeling.LabelProviderFragment
-	public void configureResourceUIServiceLabelProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.jface.viewers.ILabelProvider.class).annotatedWith(org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider.class).to(org.eclipse.osbp.xtext.entitymock.ui.labeling.EntityMockDSLDescriptionLabelProvider.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+		return PersistentDataAwareDirtyResource.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.outline.OutlineTreeProviderFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider> bindIOutlineTreeProvider() {
-		return org.eclipse.osbp.xtext.entitymock.ui.outline.EntityMockDSLOutlineTreeProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+		return BuilderParticipant.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.outline.OutlineTreeProviderFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
-		return org.eclipse.osbp.xtext.entitymock.ui.outline.EntityMockDSLOutlineTreeProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+		return ResourcesPlugin.getWorkspace().getRoot();
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.quickfix.QuickfixProviderFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider> bindIssueResolutionProvider() {
-		return org.eclipse.osbp.xtext.entitymock.ui.quickfix.EntityMockDSLQuickfixProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public void configureBuilderPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("builderPreferenceInitializer"))
+			.to(BuilderPreferenceAccess.Initializer.class);
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.contentAssist.ContentAssistFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() {
-		return org.eclipse.osbp.xtext.entitymock.ui.contentassist.EntityMockDSLProposalProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return EntityMockDSLLabelProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext.Factory> bindContentAssistContext$Factory() {
-		return org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public void configureResourceUIServiceLabelProvider(Binder binder) {
+		binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(EntityMockDSLDescriptionLabelProvider.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.antlr.IContentAssistParser> bindIContentAssistParser() {
-		return org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.EntityMockDSLParser.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return EntityMockDSLOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.internal.InternalEntityMockDSLLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.internal.InternalEntityMockDSLLexer.class));
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return EntityMockDSLOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.CONTENT_ASSIST)).to(org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.internal.InternalEntityMockDSLLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return EntityMockDSLQuickfixProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public void configureIPreferenceStoreInitializer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer.class).annotatedWith(com.google.inject.name.Names.named("RefactoringPreferences")).to(org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences.Initializer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+	public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+		return EntityMockDSLProposalProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.ui.IRenameSupport.Factory> bindIRenameSupport$Factory() {
-		return org.eclipse.xtext.common.types.ui.refactoring.JdtRenameSupport.Factory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public void configureIPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("RefactoringPreferences"))
+			.to(RefactoringPreferences.Initializer.class);
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameStrategy.Provider> bindIRenameStrategy$Provider() {
-		return org.eclipse.xtext.common.types.ui.refactoring.participant.JvmMemberRenameStrategy.Provider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return JdtRenameSupport.Factory.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public void configureJvmMemberRenameStrategy$Provider$Delegate(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.ui.refactoring.IRenameStrategy.Provider.class).annotatedWith(org.eclipse.xtext.common.types.ui.refactoring.participant.JvmMemberRenameStrategy.Provider.Delegate.class).to(org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategyProvider.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameStrategy.Provider> bindIRenameStrategy$Provider() {
+		return JvmMemberRenameStrategy.Provider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public java.lang.ClassLoader bindClassLoaderToInstance() {
-		return getClass().getClassLoader();
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public void configureJvmMemberRenameStrategy$Provider$Delegate(Binder binder) {
+		binder.bind(IRenameStrategy.Provider.class).annotatedWith(JvmMemberRenameStrategy.Provider.Delegate.class).to(DefaultRenameStrategyProvider.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
-		return org.eclipse.xtext.common.types.access.jdt.JdtTypeProviderFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.types.TypesGeneratorFragment2
+	public Class<? extends PrefixMatcher> bindPrefixMatcher() {
+		return FQNPrefixMatcher.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider> bindAbstractTypeScopeProvider() {
-		return org.eclipse.xtext.common.types.xtext.ui.JdtBasedSimpleTypeScopeProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends FindReferencesHandler> bindFindReferencesHandler() {
+		return JvmModelFindReferenceHandler.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider> bindITypesProposalProvider() {
-		return org.eclipse.xtext.common.types.xtext.ui.JdtTypesProposalProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider> bindIJavaProjectProvider() {
-		return org.eclipse.xtext.common.types.xtext.ui.XtextResourceSetBasedProjectProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher> bindPrefixMatcher() {
-		return org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.IValidationJobScheduler> bindIValidationJobScheduler() {
-		return org.eclipse.xtext.common.types.xtext.ui.JdtValidationJobScheduler.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.impl.RefactoringResourceSetProvider> bindRefactoringResourceSetProvider() {
-		return org.eclipse.xtext.common.types.ui.refactoring.JvmRefactoringResourceSetProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.AbstractAntlrTokenToAttributeIdMapper> bindAbstractAntlrTokenToAttributeIdMapper() {
-		return org.eclipse.xtext.xbase.ui.syntaxcoloring.XbaseTokenToAttributeIdMapper.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.ReferenceProposalCreator> bindAbstractJavaBasedContentProposalProvider$ReferenceProposalCreator() {
-		return org.eclipse.xtext.xbase.ui.contentassist.XbaseReferenceProposalCreator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.jface.text.contentassist.IContentAssistProcessor> bindIContentAssistProcessor() {
-		return org.eclipse.xtext.ui.editor.contentassist.RepeatedContentAssistProcessor.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
-		return org.eclipse.xtext.xbase.ui.highlighting.XbaseHighlightingCalculator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration> bindIHighlightingConfiguration() {
-		return org.eclipse.xtext.xbase.ui.highlighting.XbaseHighlightingConfiguration.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider> bindIEObjectHoverProvider() {
-		return org.eclipse.xtext.xbase.ui.hover.XbaseHoverProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.hover.IEObjectHover> bindIEObjectHover() {
-		return org.eclipse.xtext.xbase.ui.hover.XbaseDispatchingEObjectTextHover.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
-		return org.eclipse.xtext.xbase.ui.hover.XbaseHoverDocumentationProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider.CrossRefResolutionConverter> bindDefaultQuickfixProvider$CrossRefResolutionConverter() {
-		return org.eclipse.xtext.xbase.ui.quickfix.XbaseCrossRefResolutionConverter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.xtext.xbase.ui.validation.XbaseUIValidator> bindXbaseUIValidator() {
-		return org.eclipse.xtext.xbase.ui.validation.XbaseUIValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper> bindIHyperlinkHelper() {
-		return org.eclipse.xtext.xbase.ui.navigation.TypeLiteralAwareHyperlinkHelper.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.IFeatureScopeTracker.Provider> bindIFeatureScopeTracker$Provider() {
-		return org.eclipse.xtext.xbase.typesystem.internal.OptimizingFeatureScopeTrackerProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler> bindFindReferencesHandler() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelFindReferenceHandler.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ReferenceQueryExecutor> bindReferenceQueryExecutor() {
+		return JvmModelReferenceQueryExecutor.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.findrefs.ReferenceQueryExecutor> bindReferenceQueryExecutor() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.findrefs.JvmModelReferenceQueryExecutor.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return JvmModelDependentElementsCalculator.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator> bindIDependentElementsCalculator() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelDependentElementsCalculator.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return CombinedJvmJdtRenameRefactoringProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameRefactoringProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+		return XbaseReferenceUpdater.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IReferenceUpdater> bindIReferenceUpdater() {
-		return org.eclipse.xtext.xbase.ui.refactoring.XbaseReferenceUpdater.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IRenameContextFactory> bindIRenameContextFactory() {
+		return CombinedJvmJdtRenameContextFactory.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.ui.IRenameContextFactory> bindIRenameContextFactory() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.jdt.CombinedJvmJdtRenameContextFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+		return DefaultJvmModelRenameStrategy.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.ui.refactoring.participant.JdtRenameParticipant.ContextFactory> bindJdtRenameParticipant$ContextFactory() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.JvmModelJdtRenameParticipantContext.ContextFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends JdtRenameParticipant.ContextFactory> bindJdtRenameParticipant$ContextFactory() {
+		return JvmModelJdtRenameParticipantContext.ContextFactory.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameStrategy> bindIRenameStrategy() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.refactoring.DefaultJvmModelRenameStrategy.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends OutlineNodeElementOpener> bindOutlineNodeElementOpener() {
+		return JvmOutlineNodeElementOpener.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.outline.impl.OutlineNodeElementOpener> bindOutlineNodeElementOpener() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.outline.JvmOutlineNodeElementOpener.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends GlobalURIEditorOpener> bindGlobalURIEditorOpener() {
+		return GlobalDerivedMemberAwareURIEditorOpener.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.GlobalURIEditorOpener> bindGlobalURIEditorOpener() {
-		return org.eclipse.xtext.common.types.ui.navigation.GlobalDerivedMemberAwareURIEditorOpener.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IJavaSearchParticipation> bindIJavaSearchParticipation() {
+		return IJavaSearchParticipation.No.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.occurrences.IOccurrenceComputer> bindIOccurrenceComputer() {
-		return org.eclipse.xtext.xbase.ui.jvmmodel.occurrence.JvmModelOccurrenceComputer.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public void configureLanguageSpecificURIEditorOpener(Binder binder) {
+		if (PlatformUI.isWorkbenchRunning()) {
+			binder.bind(IURIEditorOpener.class).annotatedWith(LanguageSpecific.class).to(DerivedMemberAwareEditorOpener.class);
+			binder.bind(IDerivedMemberAwareEditorOpener.class).to(DerivedMemberAwareEditorOpener.class);
+		}
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation> bindIJavaSearchParticipation() {
-		return org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation.No.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IUnresolvedTypeResolver> bindIUnresolvedTypeResolver() {
+		return InteractiveUnresolvedTypeResolver.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public void configureLanguageSpecificURIEditorOpener(com.google.inject.Binder binder) {
-		if (org.eclipse.ui.PlatformUI.isWorkbenchRunning()) { 
-			binder.bind(org.eclipse.xtext.ui.editor.IURIEditorOpener.class).annotatedWith(org.eclipse.xtext.ui.LanguageSpecific.class).to(org.eclipse.xtext.xbase.ui.jvmmodel.navigation.DerivedMemberAwareEditorOpener.class); 
-			binder.bind(org.eclipse.xtext.common.types.ui.navigation.IDerivedMemberAwareEditorOpener.class).to(org.eclipse.xtext.xbase.ui.jvmmodel.navigation.DerivedMemberAwareEditorOpener.class); 
-		};
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ITypesProposalProvider> bindITypesProposalProvider() {
+		return ImportingTypesProposalProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.jface.text.hyperlink.IHyperlinkDetector> bindIHyperlinkDetector() {
-		return org.eclipse.xtext.xbase.ui.navigation.XbaseHyperlinkDetector.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends XtextTemplateContextType> bindXtextTemplateContextType() {
+		return XbaseTemplateContextType.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixes> bindJavaTypeQuickfixes() {
-		return org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixesNoImportSection.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<? extends TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+		return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.templates.CodetemplatesGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
-		return org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<? extends LanguageRegistry> provideLanguageRegistry() {
+		return AccessibleCodetemplatesActivator.getLanguageRegistry();
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.templates.CodetemplatesGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry> provideLanguageRegistry() {
-		return org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator.getLanguageRegistry();
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+		return LanguageRegistrar.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.templates.CodetemplatesGeneratorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar> bindLanguageRegistrar() {
-		return org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+		return AdvancedTemplatesPreferencePage.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.templates.CodetemplatesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
-		return org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+		return PartialEntityMockDSLContentAssistParser.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.templates.CodetemplatesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser> bindIPartialContentAssistParser() {
-		return org.eclipse.osbp.xtext.entitymock.ui.contentassist.antlr.PartialEntityMockDSLContentAssistParser.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+		return PartialEditingContentAssistContextFactory.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.compare.CompareFragment
-	public Class<? extends org.eclipse.compare.IViewerCreator> bindIViewerCreator() {
-		return org.eclipse.xtext.ui.compare.DefaultViewerCreator.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+	public Class<? extends IViewerCreator> bindIViewerCreator() {
+		return DefaultViewerCreator.class;
 	}
-
-
+	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLExecutableExtensionFactory.java b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLExecutableExtensionFactory.java
index 6936631..ea3b035 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLExecutableExtensionFactory.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLExecutableExtensionFactory.java
@@ -10,17 +10,17 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.ui;
 
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.entitymock.ui.internal.EntitymockActivator;
 import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
 import org.osgi.framework.Bundle;
 
-import com.google.inject.Injector;
-
-import org.eclipse.osbp.xtext.entitymock.ui.internal.EntityMockDSLActivator;
-
 /**
  * This class was generated. Customizations should only happen in a newly
  * introduced subclass. 
@@ -29,12 +29,12 @@
 
 	@Override
 	protected Bundle getBundle() {
-		return EntityMockDSLActivator.getInstance().getBundle();
+		return EntitymockActivator.getInstance().getBundle();
 	}
 	
 	@Override
 	protected Injector getInjector() {
-		return EntityMockDSLActivator.getInstance().getInjector(EntityMockDSLActivator.ORG_ECLIPSE_OSBP_XTEXT_ENTITYMOCK_ENTITYMOCKDSL);
+		return EntitymockActivator.getInstance().getInjector(EntitymockActivator.ORG_ECLIPSE_OSBP_XTEXT_ENTITYMOCK_ENTITYMOCKDSL);
 	}
 	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/AbstractEntityMockDSLProposalProvider.java b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/AbstractEntityMockDSLProposalProvider.java
index 905c519..fb479ea 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/AbstractEntityMockDSLProposalProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/AbstractEntityMockDSLProposalProvider.java
@@ -10,48 +10,61 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.ui.contentassist;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.*;
-import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import org.eclipse.osbp.xtext.oxtype.ui.contentassist.OXtypeProposalProvider;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.RuleCall;
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
 
 /**
- * Represents a generated, default implementation of superclass {@link org.eclipse.xtext.xbase.annotations.ui.contentassist.XbaseWithAnnotationsProposalProvider}.
+ * Represents a generated, default implementation of superclass {@link OXtypeProposalProvider}.
  * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
  * with a more concrete subtype. 
  */
-@SuppressWarnings("all")
-public class AbstractEntityMockDSLProposalProvider extends org.eclipse.xtext.xbase.annotations.ui.contentassist.XbaseWithAnnotationsProposalProvider {
-		
+public abstract class AbstractEntityMockDSLProposalProvider extends OXtypeProposalProvider {
+
+	public void completeEntityMockModel_ImportSection(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeEntityMockModel_Packages(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Imports(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockPackage_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_RunPriority(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockPackage_Mocks(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Datainterchanges(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Resources(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeEntityMock_DescriptionValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Objects(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_RunPriority(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Datatypes(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_Datainterchanges(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockPackage_Entities(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_Resources(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityModelImport_ImportedNamespace(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMock_Objects(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEntityMock_Entities(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeRunningDataInterchanges_Datainterchanges(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -105,9 +118,6 @@
 	public void completeEntityMockObjectEnum_UsingResource(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockDataTypes_Datatypes(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
 	public void completeEntityMockObjectPlainValue_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -270,9 +280,6 @@
 	public void completePropertyFillerUnsignedIntegerRandom_Items(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockDataType_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
 	public void completeEntityMockEntities_Entities(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -288,7 +295,7 @@
 	public void completeEntityMockEntity_MaxRows(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockEntity_Temporaries(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockEntity_Templates(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeEntityMockEntity_Attributes(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -357,10 +364,10 @@
 	public void completeEntityMockByResourceAttribute_ResourceAttribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockTemporary_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockTemplate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockTemporary_Object(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockTemplate_Object(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeEntityMockEntityFunction_AttributeRef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -375,13 +382,16 @@
 	public void completeEntityMockEntityFunctionParameter_AttributeRef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockEntityFunctionParameter_ReferencePaths(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockEntityFunctionParameter_NestedAttribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEntityMockEntityNestedAttribute_Reference(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockEntityFunctionParameter_ReferenceRef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockEntityNestedAttribute_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeEntityMockReferencedObjectAttribute_Temporary(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeEntityMockReferencedObjectAttribute_Template(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeEntityMockReferencedObjectAttribute_Embedded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -417,17 +427,14 @@
 	public void completeEntityMockAttributeByReference_OptionalFor(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-    
+
 	public void complete_EntityMockModel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
 	public void complete_EntityMockPackage(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_EntityModelImport(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void complete_EntityMockQualifiedNameWithWildCard(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void complete_EntityMock(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
 	public void complete_RunningDataInterchanges(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -457,9 +464,6 @@
 	public void complete_EntityMockObjectEnum(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_EntityMockDataTypes(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_IEntityMockObjectUsable(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -541,9 +545,6 @@
 	public void complete_PropertyFillerUnsignedIntegerRandom(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_EntityMockDataType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_EntityMockEntities(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -568,7 +569,7 @@
 	public void complete_EntityMockByResourceAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_EntityMockTemporary(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void complete_EntityMockTemplate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
 	public void complete_IEntityMockEntityUsable(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -583,6 +584,9 @@
 	public void complete_EntityMockEntityFunctionParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_EntityMockEntityNestedAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_EntityMockReferencedObjectAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -604,13 +608,4 @@
 	public void complete_SINT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void complete_ValidID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/internal/EntitymockActivator.java b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/internal/EntitymockActivator.java
new file mode 100644
index 0000000..f7bcf07
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src-gen/org/eclipse/osbp/xtext/entitymock/ui/internal/EntitymockActivator.java
@@ -0,0 +1,106 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.ui.internal;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLRuntimeModule;
+import org.eclipse.osbp.xtext.entitymock.ui.EntityMockDSLUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class EntitymockActivator extends AbstractUIPlugin {
+
+	public static final String ORG_ECLIPSE_OSBP_XTEXT_ENTITYMOCK_ENTITYMOCKDSL = "org.eclipse.osbp.xtext.entitymock.EntityMockDSL";
+	
+	private static final Logger logger = Logger.getLogger(EntitymockActivator.class);
+	
+	private static EntitymockActivator INSTANCE;
+	
+	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+	}
+	
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		injectors.clear();
+		INSTANCE = null;
+		super.stop(context);
+	}
+	
+	public static EntitymockActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	public Injector getInjector(String language) {
+		synchronized (injectors) {
+			Injector injector = injectors.get(language);
+			if (injector == null) {
+				injectors.put(language, injector = createInjector(language));
+			}
+			return injector;
+		}
+	}
+	
+	protected Injector createInjector(String language) {
+		try {
+			Module runtimeModule = getRuntimeModule(language);
+			Module sharedStateModule = getSharedStateModule();
+			Module uiModule = getUiModule(language);
+			Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+			return Guice.createInjector(mergedModule);
+		} catch (Exception e) {
+			logger.error("Failed to create injector for " + language);
+			logger.error(e.getMessage(), e);
+			throw new RuntimeException("Failed to create injector for " + language, e);
+		}
+	}
+	
+	protected Module getRuntimeModule(String grammar) {
+		if (ORG_ECLIPSE_OSBP_XTEXT_ENTITYMOCK_ENTITYMOCKDSL.equals(grammar)) {
+			return new EntityMockDSLRuntimeModule();
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getUiModule(String grammar) {
+		if (ORG_ECLIPSE_OSBP_XTEXT_ENTITYMOCK_ENTITYMOCKDSL.equals(grammar)) {
+			return new EntityMockDSLUiModule(this);
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiDocumentationTranslator.java b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiDocumentationTranslator.java
index 97bf858..1e88ad0 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiDocumentationTranslator.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiDocumentationTranslator.java
@@ -14,7 +14,6 @@
 
 import java.util.ResourceBundle;
 
-import org.eclipse.osbp.utils.constants.GeneratorConstants;
 import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
 
 
@@ -35,6 +34,6 @@
     
     @Override
     protected ResourceBundle getResourceBundle() {
-        return java.util.ResourceBundle.getBundle(GeneratorConstants.I18N_RESOURCE_FULL_BUNDLE_NAME, getLocale(), getClass().getClassLoader());
+        return java.util.ResourceBundle.getBundle("i18n.I18N", getLocale(), getClass().getClassLoader());
     }
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiModule.java b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiModule.java
index ffe10c7..21e4d63 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiModule.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/EntityMockDSLUiModule.java
@@ -12,39 +12,67 @@
  */
 package org.eclipse.osbp.xtext.entitymock.ui;
 
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLUiModuleHelper;
+import org.eclipse.osbp.xtext.oxtype.imports.IUnresolvedEObjectResolver;
+import org.eclipse.osbp.xtext.oxtype.ui.contentassist.OXTypeReplacingAppendable;
+import org.eclipse.osbp.xtext.oxtype.ui.contentassist.OXtypeProposalProvider;
+import org.eclipse.osbp.xtext.oxtype.ui.imports.InteractiveUnresolvedEClassResolver;
+import org.eclipse.osbp.xtext.oxtype.ui.quickfix.CustomJavaTypeQuickfixes;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider;
 import org.eclipse.xtext.ui.editor.hover.IEObjectHover;
 import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
 import org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider;
+import org.eclipse.xtext.xbase.ui.contentassist.ReplacingAppendable;
+import org.eclipse.xtext.xbase.ui.quickfix.JavaTypeQuickfixes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.eclipse.osbp.xtext.basic.ui.BasicDSLUiModuleHelper;
-
 /**
  * Use this class to register components to be used within the IDE.
  */
-public class EntityMockDSLUiModule extends org.eclipse.osbp.xtext.entitymock.ui.AbstractEntityMockDSLUiModule {
-	
-    private static Logger LOGGER = LoggerFactory.getLogger(EntityMockDSLUiModule.class);
-	
+public class EntityMockDSLUiModule extends
+		org.eclipse.osbp.xtext.entitymock.ui.AbstractEntityMockDSLUiModule {
+
+	private static Logger LOGGER = LoggerFactory
+			.getLogger(EntityMockDSLUiModule.class);
+
 	public EntityMockDSLUiModule(AbstractUIPlugin plugin) {
 		super(plugin);
 		BasicDSLUiModuleHelper.unitTestTemplates(plugin, LOGGER);
 	}
+	
+	@Override
+	public Class<? extends AbstractJavaBasedContentProposalProvider.ReferenceProposalCreator> bindAbstractJavaBasedContentProposalProvider$ReferenceProposalCreator() {
+		return OXtypeProposalProvider.CustomReferenceProposalCreator.class;
+	}
 
-    @Override
-    public Class<? extends IEObjectHover> bindIEObjectHover() {
-        return EntityMockDSLEObjectHover.class;
-    }
+	@Override
+	public Class<? extends IEObjectHover> bindIEObjectHover() {
+		return EntityMockDSLEObjectHover.class;
+	}
 
-    @Override
-    public Class<? extends IEObjectHoverProvider> bindIEObjectHoverProvider() {
-        return EntityMockDSLEObjectHoverProvider.class;
-    }
-     
-    @Override
-    public Class<? extends IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
-        return EntityMockDSLEObjectHoverDocumentationProvider.class;
-    }
+	@Override
+	public Class<? extends IEObjectHoverProvider> bindIEObjectHoverProvider() {
+		return EntityMockDSLEObjectHoverProvider.class;
+	}
+
+	@Override
+	public Class<? extends IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
+		return EntityMockDSLEObjectHoverDocumentationProvider.class;
+	}
+
+	@SuppressWarnings("restriction")
+	public Class<? extends ReplacingAppendable.Factory> bindReplacingAppendable$Factory() {
+		return OXTypeReplacingAppendable.Factory.class;
+	}
+
+	public Class<? extends IUnresolvedEObjectResolver> bindIUnresolvedEObjectResolver() {
+		return InteractiveUnresolvedEClassResolver.class;
+	}
+
+	public Class<? extends JavaTypeQuickfixes> bindJavaTypeQuickfixes() {
+		return CustomJavaTypeQuickfixes.class;
+	}
+
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.xtend b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.xtend
index d811ab4..bd9bb75 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.xtend
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.xtend
@@ -20,6 +20,9 @@
 import com.google.inject.Inject
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.jface.viewers.StyledString
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
+import org.eclipse.osbp.ui.api.datamart.IDataMart
+import org.eclipse.osbp.utils.entityhelper.DataType
 import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller
@@ -51,8 +54,6 @@
 import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
 import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
-import org.eclipse.osbp.utils.entityhelper.DataType
-import org.eclipse.osbp.ui.api.datamart.IDataMart
 
 /**
  * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
@@ -61,6 +62,7 @@
 	
 	@Inject DataType dtType
 	@Inject TerminalsProposalProvider provider
+	@Inject BasicDSLProposalProviderHelper providerHelper
 
     /**
      * @see BasicDSLProposalProviderHelper#getKeywordDisplayString(Keyword, BasicDSLUiTranslator)
@@ -108,18 +110,18 @@
     }
 
     /**
-     * propose all temporary mock object variables defined previously in this mock entity
+     * propose all template mock object variables defined previously in this mock entity
      */
-    override public void completeEntityMockReferencedObjectAttribute_Temporary(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-        for (temporary : ((model as EntityMockAttributeByObject).eContainer as EntityMockEntity).temporaries) {
+    override public void completeEntityMockReferencedObjectAttribute_Template(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+        for (template : ((model as EntityMockAttributeByObject).eContainer as EntityMockEntity).templates) {
             acceptor.accept(
-                createCompletionProposal(temporary.name, temporary.name, null, context)
+                createCompletionProposal(template.name, template.name, null, context)
             )
         }
     }
 
     /**
-     * propose all embedded mock objects inside the referenced temporary mock object
+     * propose all embedded mock objects inside the referenced template mock object
      */    
     override public void completeEntityMockReferencedObjectAttribute_Embedded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
         var emroa = null as EntityMockReferencedObjectAttribute
@@ -129,7 +131,7 @@
         if  (model instanceof EntityMockAttributeByObject) {
             emroa = model.reference
         }
-        var mockObject = emroa.temporary.object
+        var mockObject = emroa.template.object
         if  (!emroa.embedded.isEmpty) {
             mockObject = emroa.embedded.last.object
         }
@@ -167,7 +169,7 @@
         if  (model instanceof EntityMockAttributeByObject) {
             emroa = model.reference
         }
-        var mockObject = emroa.temporary.object
+        var mockObject = emroa.template.object
         if  (!emroa.embedded.isEmpty) {
             mockObject = emroa.embedded.last.object
         }
@@ -236,7 +238,7 @@
         if  (keyword.isKeywordInsideParserRule(PropertyFillerTextSentences)) return IDataMart.EType.STRING
         if  (keyword.isKeywordInsideParserRule(PropertyFillerTextWords)) return IDataMart.EType.STRING
         
-        return IDataMart.EType.none
+        return IDataMart.EType.NONE
     }
 
     /**
@@ -249,7 +251,7 @@
         var currentModel = context.getCurrentModel();
         if  (currentModel instanceof EntityMockAttributeFiller) {
             var attributeByObject = currentModel as EntityMockAttributeFiller
-            var attributeRef = attributeByObject.attributeRef
+            var LEntityAttribute attributeRef = attributeByObject.attributeRef as LEntityAttribute
             return dtType.canBeCastFrom(attributeRef, keyword.propertyFillerType)
         }
         return true
@@ -270,10 +272,40 @@
             }
         }
     }
-    	// ------------------------ delegates to TerminalsProposalProvider -----------------
+    
+    
+    // ------------------------ delegates to TerminalsProposalProvider -----------------
+	override public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		provider.complete_ID(model, ruleCall, context, acceptor)
+	}
+    
 	override public void complete_STRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
 		ICompletionProposalAcceptor acceptor) {
 		provider.complete_STRING(model, ruleCall, context, acceptor)
 	}
     
+	override public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		provider.complete_INT(model, ruleCall, context, acceptor)
+	}
+	
+	override public void complete_SINT(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		provider.complete_INT(model, ruleCall, context, acceptor)
+	}
+	
+    // ------------------------ delegates to BasicDSLProposalProviderHelper providerHelper -----------------
+	override public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
+	}
+
+	override public void complete_UnsignedNumber(EObject model, RuleCall ruleCall, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		providerHelper.createNumberProposal(context, acceptor, ruleCall, this)
+	}
+
+	
+    
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.xtend b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.xtend
index accf85d..3b05da8 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.xtend
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.xtend
@@ -32,7 +32,6 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjects
 import org.eclipse.osbp.xtext.entitymock.EntityMockPackage
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary
 import org.eclipse.osbp.dsl.semantic.common.types.LImport
 import org.eclipse.xtext.Keyword
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference
@@ -63,6 +62,7 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate
 
 /**
  * Provides labels for a EObjects.
@@ -94,7 +94,7 @@
 			EntityMockObjects					: 'mock objects'
 			EntityMockPackage					: 'mocked	entity model'
 			EntityMockReferencedObjectAttribute : {
-				var r = o.temporary.name
+				var r = o.template.name
 				for (e : o.embedded) {
 					r = '''«r».«e.name»'''
 				}
@@ -103,7 +103,7 @@
 			EntityMockResource					: generateText( o, 'resource'              , o.name               )
 			EntityMockResources					: 'mock resources'
 			EntityMockResourceDataRow			: generateText( o, 'data row'              , o.name               )
-			EntityMockTemporary					: generateText( o, 'temporary'             , o.name               )
+			EntityMockTemplate					: generateText( o, 'template'             , o.name               )
 			DateIterate							: generateText( o, 'date iterate'          , (o.eContainer as EntityMockEntity)?.iterator?.name )
 			LImport								: generateText( o, 'import'                , o.importedNamespace  )
 			PropertyFillerDateFuture			: '''between now and «o.dateFutureYears» years into the future'''
@@ -154,7 +154,7 @@
 			EntityMockReferencedObjectAttribute	: getInternalImage( 'private_field.png' , class )
 			EntityMockResourceDataRow			: getInternalImage( 'enum_alt_obj.gif'  , class )
 			EntityMockResources					: getInternalImage( 'enum_alt_obj.gif'  , class )
-			EntityMockTemporary					: getInternalImage( 'private_method.png', class )
+			EntityMockTemplate					: getInternalImage( 'private_method.png', class )
 			DateIterate							: getInternalImage( 'date-iterate.png'  , class )
 			Keyword								: null
 			LImport								: getInternalImage( 'class.gif'         , class )
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.xtend b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.xtend
index 162458f..eb12d42 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.xtend
+++ b/org.eclipse.osbp.xtext.entitymock.ui/src/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.xtend
@@ -14,27 +14,26 @@
  *  This copyright notice shows up in the generated Java code
  *
  */
- 
 package org.eclipse.osbp.xtext.entitymock.ui.quickfix
 
+import org.eclipse.osbp.xtext.oxtype.ui.quickfix.OXtypeQuickfixProvider
+
 //import org.eclipse.xtext.ui.editor.quickfix.Fix
 //import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor
 //import org.eclipse.xtext.validation.Issue
-
 /**
  * Custom quickfixes.
  *
  * see http://www.eclipse.org/Xtext/documentation.html#quickfixes
  */
-class EntityMockDSLQuickfixProvider extends org.eclipse.xtext.xbase.annotations.ui.quickfix.XbaseWithAnnotationsQuickfixProvider {
-
-//	@Fix(MyDslValidator::INVALID_NAME)
-//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
-//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
-//			context |
-//			val xtextDocument = context.xtextDocument
-//			val firstLetter = xtextDocument.get(issue.offset, 1)
-//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
-//		]
-//	}
+class EntityMockDSLQuickfixProvider extends OXtypeQuickfixProvider {
+	//	@Fix(MyDslValidator::INVALID_NAME)
+	//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+	//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+	//			context |
+	//			val xtextDocument = context.xtextDocument
+	//			val firstLetter = xtextDocument.get(issue.offset, 1)
+	//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+	//		]
+	//	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/.gitignore
new file mode 100644
index 0000000..0ae5696
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/.gitignore
@@ -0,0 +1,5 @@
+/.EntityMockDSLDescriptionLabelProvider.xtendbin
+/.EntityMockDSLLabelProvider.xtendbin
+/.EntityMockDSLOutlineTreeProvider.xtendbin
+/.EntityMockDSLProposalProvider.xtendbin
+/.EntityMockDSLQuickfixProvider.xtendbin
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/.gitignore
new file mode 100644
index 0000000..89b1c6d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLProposalProvider.java
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.java b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.java
index 48ed704..5805552 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/contentassist/EntityMockDSLProposalProvider.java
@@ -19,15 +19,12 @@
 import java.util.List;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jface.viewers.StyledString;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
-import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
 import org.eclipse.osbp.utils.entityhelper.DataType;
-import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
 import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
@@ -40,7 +37,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast;
@@ -79,19 +76,23 @@
   @Inject
   private TerminalsProposalProvider provider;
   
+  @Inject
+  private BasicDSLProposalProviderHelper providerHelper;
+  
   /**
    * @see BasicDSLProposalProviderHelper#getKeywordDisplayString(Keyword, BasicDSLUiTranslator)
    * @param keyword the keyword to get the displayed string for
    * @return the displayed string
    */
+  @Override
   protected StyledString getKeywordDisplayString(final Keyword keyword) {
-    BasicDSLDocumentationTranslator _instance = EntityMockDSLUiDocumentationTranslator.instance();
-    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, _instance);
+    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, EntityMockDSLUiDocumentationTranslator.instance());
   }
   
   /**
    * This override will enable 1 length non letter characters as keyword.
    */
+  @Override
   protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
     return true;
   }
@@ -99,99 +100,82 @@
   /**
    * propose all available enumeration values for the referenced enumeration
    */
+  @Override
   public void completeEntityMockObjectItemValue_Datarow(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     EObject mockValueItem = model;
     while (((!(mockValueItem instanceof EntityMockObjectArrayValue)) && (!Objects.equal(mockValueItem, null)))) {
-      EObject _eContainer = mockValueItem.eContainer();
-      mockValueItem = _eContainer;
+      mockValueItem = mockValueItem.eContainer();
     }
     if ((mockValueItem instanceof EntityMockObjectArrayValue)) {
-      EntityMockObjectEnum _enumeration = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-      LEnum _usingResource = _enumeration.getUsingResource();
+      LEnum _usingResource = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
       if ((_usingResource instanceof EntityMockResource)) {
-        EntityMockObjectEnum _enumeration_1 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-        LEnum _usingResource_1 = _enumeration_1.getUsingResource();
+        LEnum _usingResource_1 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
         final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
         EList<EntityMockResourceDataRow> _datarows = resource.getDatarows();
         for (final EntityMockResourceDataRow datarow : _datarows) {
-          String _name = datarow.getName();
-          String _name_1 = datarow.getName();
-          ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_name, _name_1, null, context);
-          acceptor.accept(_createCompletionProposal);
+          acceptor.accept(
+            this.createCompletionProposal(datarow.getName(), datarow.getName(), null, context));
         }
       } else {
-        EntityMockObjectEnum _enumeration_2 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-        final LEnum lenum = _enumeration_2.getUsingResource();
+        final LEnum lenum = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
         EList<LEnumLiteral> _literals = lenum.getLiterals();
         for (final LEnumLiteral datarow_1 : _literals) {
-          String _name_2 = datarow_1.getName();
-          String _name_3 = datarow_1.getName();
-          ICompletionProposal _createCompletionProposal_1 = this.createCompletionProposal(_name_2, _name_3, null, context);
-          acceptor.accept(_createCompletionProposal_1);
+          acceptor.accept(
+            this.createCompletionProposal(datarow_1.getName(), datarow_1.getName(), null, context));
         }
       }
     }
   }
   
   /**
-   * propose all temporary mock object variables defined previously in this mock entity
+   * propose all template mock object variables defined previously in this mock entity
    */
-  public void completeEntityMockReferencedObjectAttribute_Temporary(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+  @Override
+  public void completeEntityMockReferencedObjectAttribute_Template(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     EObject _eContainer = ((EntityMockAttributeByObject) model).eContainer();
-    EList<EntityMockTemporary> _temporaries = ((EntityMockEntity) _eContainer).getTemporaries();
-    for (final EntityMockTemporary temporary : _temporaries) {
-      String _name = temporary.getName();
-      String _name_1 = temporary.getName();
-      ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_name, _name_1, null, context);
-      acceptor.accept(_createCompletionProposal);
+    EList<EntityMockTemplate> _templates = ((EntityMockEntity) _eContainer).getTemplates();
+    for (final EntityMockTemplate template : _templates) {
+      acceptor.accept(
+        this.createCompletionProposal(template.getName(), template.getName(), null, context));
     }
   }
   
   /**
-   * propose all embedded mock objects inside the referenced temporary mock object
+   * propose all embedded mock objects inside the referenced template mock object
    */
+  @Override
   public void completeEntityMockReferencedObjectAttribute_Embedded(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     EntityMockReferencedObjectAttribute emroa = ((EntityMockReferencedObjectAttribute) null);
     if ((model instanceof EntityMockReferencedObjectAttribute)) {
       emroa = ((EntityMockReferencedObjectAttribute)model);
     }
     if ((model instanceof EntityMockAttributeByObject)) {
-      EntityMockReferencedObjectAttribute _reference = ((EntityMockAttributeByObject)model).getReference();
-      emroa = _reference;
+      emroa = ((EntityMockAttributeByObject)model).getReference();
     }
-    EntityMockTemporary _temporary = emroa.getTemporary();
-    EntityMockObject mockObject = _temporary.getObject();
-    EList<EntityMockObjectEmbed> _embedded = emroa.getEmbedded();
-    boolean _isEmpty = _embedded.isEmpty();
+    EntityMockObject mockObject = emroa.getTemplate().getObject();
+    boolean _isEmpty = emroa.getEmbedded().isEmpty();
     boolean _not = (!_isEmpty);
     if (_not) {
-      EList<EntityMockObjectEmbed> _embedded_1 = emroa.getEmbedded();
-      EntityMockObjectEmbed _last = IterableExtensions.<EntityMockObjectEmbed>last(_embedded_1);
-      EntityMockObject _object = _last.getObject();
-      mockObject = _object;
+      mockObject = IterableExtensions.<EntityMockObjectEmbed>last(emroa.getEmbedded()).getObject();
     }
     EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
     for (final IEntityMockObjectAttribute attribute : _attributes) {
       if ((attribute instanceof EntityMockObjectEmbed)) {
-        String _name = ((EntityMockObjectEmbed)attribute).getName();
-        String _name_1 = ((EntityMockObjectEmbed)attribute).getName();
-        ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_name, _name_1, null, context);
-        acceptor.accept(_createCompletionProposal);
+        acceptor.accept(
+          this.createCompletionProposal(((EntityMockObjectEmbed)attribute).getName(), ((EntityMockObjectEmbed)attribute).getName(), null, context));
       }
     }
   }
   
+  @Override
   public void completeEntityMockEntityFunction_AttributeRef(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     EObject _eContainer = model.eContainer();
     if ((_eContainer instanceof EntityMockEntity)) {
       EObject _eContainer_1 = model.eContainer();
-      LEntity _entityRef = ((EntityMockEntity) _eContainer_1).getEntityRef();
-      List<LEntityAttribute> _allAttributes = _entityRef.getAllAttributes();
+      List<LEntityAttribute> _allAttributes = ((EntityMockEntity) _eContainer_1).getEntityRef().getAllAttributes();
       for (final LEntityAttribute attribute : _allAttributes) {
-        String _name = attribute.getName();
-        String _name_1 = attribute.getName();
-        ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_name, _name_1, null, context);
-        acceptor.accept(_createCompletionProposal);
+        acceptor.accept(
+          this.createCompletionProposal(attribute.getName(), attribute.getName(), null, context));
       }
     } else {
       super.completeEntityMockEntityFunction_AttributeRef(model, assignment, context, acceptor);
@@ -201,48 +185,37 @@
   /**
    * propose all enumerations and attributes of the referenced (may be embedded) mock object
    */
+  @Override
   public void completeEntityMockReferencedObjectAttribute_Attribute(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     EntityMockReferencedObjectAttribute emroa = ((EntityMockReferencedObjectAttribute) null);
     if ((model instanceof EntityMockReferencedObjectAttribute)) {
       emroa = ((EntityMockReferencedObjectAttribute)model);
     }
     if ((model instanceof EntityMockAttributeByObject)) {
-      EntityMockReferencedObjectAttribute _reference = ((EntityMockAttributeByObject)model).getReference();
-      emroa = _reference;
+      emroa = ((EntityMockAttributeByObject)model).getReference();
     }
-    EntityMockTemporary _temporary = emroa.getTemporary();
-    EntityMockObject mockObject = _temporary.getObject();
-    EList<EntityMockObjectEmbed> _embedded = emroa.getEmbedded();
-    boolean _isEmpty = _embedded.isEmpty();
+    EntityMockObject mockObject = emroa.getTemplate().getObject();
+    boolean _isEmpty = emroa.getEmbedded().isEmpty();
     boolean _not = (!_isEmpty);
     if (_not) {
-      EList<EntityMockObjectEmbed> _embedded_1 = emroa.getEmbedded();
-      EntityMockObjectEmbed _last = IterableExtensions.<EntityMockObjectEmbed>last(_embedded_1);
-      EntityMockObject _object = _last.getObject();
-      mockObject = _object;
+      mockObject = IterableExtensions.<EntityMockObjectEmbed>last(emroa.getEmbedded()).getObject();
     }
     EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
     for (final EntityMockObjectEnum enumeration : _enumerations) {
-      String _name = enumeration.getName();
-      String _name_1 = enumeration.getName();
-      ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_name, _name_1, null, context);
-      acceptor.accept(_createCompletionProposal);
+      acceptor.accept(
+        this.createCompletionProposal(enumeration.getName(), enumeration.getName(), null, context));
     }
     EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
     for (final IEntityMockObjectAttribute attribute : _attributes) {
       if ((!(attribute instanceof EntityMockObjectEmbed))) {
-        String _name_2 = attribute.getName();
-        String _name_3 = attribute.getName();
-        ICompletionProposal _createCompletionProposal_1 = this.createCompletionProposal(_name_2, _name_3, null, context);
-        acceptor.accept(_createCompletionProposal_1);
+        acceptor.accept(
+          this.createCompletionProposal(attribute.getName(), attribute.getName(), null, context));
       }
     }
     EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
     for (final EntityMockObjectFunction calculation : _calculations) {
-      String _name_4 = calculation.getName();
-      String _name_5 = calculation.getName();
-      ICompletionProposal _createCompletionProposal_2 = this.createCompletionProposal(_name_4, _name_5, null, context);
-      acceptor.accept(_createCompletionProposal_2);
+      acceptor.accept(
+        this.createCompletionProposal(calculation.getName(), calculation.getName(), null, context));
     }
   }
   
@@ -253,12 +226,10 @@
     String retcode = ((String) null);
     EObject parserRule = object;
     while (((!Objects.equal(parserRule, null)) && (!(parserRule instanceof ParserRule)))) {
-      EObject _eContainer = parserRule.eContainer();
-      parserRule = _eContainer;
+      parserRule = parserRule.eContainer();
     }
     if ((parserRule instanceof ParserRule)) {
-      String _name = ((ParserRule)parserRule).getName();
-      retcode = _name;
+      retcode = ((ParserRule)parserRule).getName();
     }
     return retcode;
   }
@@ -268,8 +239,7 @@
    */
   protected boolean isKeywordInsideParserRule(final Keyword keyword, final Class<?> eClass) {
     String className = eClass.getCanonicalName();
-    String _parserRuleName = this.getParserRuleName(keyword);
-    return className.endsWith(_parserRuleName);
+    return className.endsWith(this.getParserRuleName(keyword));
   }
   
   /**
@@ -336,12 +306,13 @@
     if (_isKeywordInsideParserRule_14) {
       return IDataMart.EType.STRING;
     }
-    return IDataMart.EType.none;
+    return IDataMart.EType.NONE;
   }
   
   /**
    * checks if the given Keyword is allowed for the given entity attribute type
    */
+  @Override
   protected boolean isKeywordWorthyToPropose(final Keyword keyword, final ContentAssistContext context) {
     boolean _isKeywordWorthyToPropose = super.isKeywordWorthyToPropose(keyword, context);
     boolean _not = (!_isKeywordWorthyToPropose);
@@ -351,13 +322,14 @@
     EObject currentModel = context.getCurrentModel();
     if ((currentModel instanceof EntityMockAttributeFiller)) {
       EntityMockAttributeFiller attributeByObject = ((EntityMockAttributeFiller) currentModel);
-      LEntityAttribute attributeRef = attributeByObject.getAttributeRef();
-      IDataMart.EType _propertyFillerType = this.getPropertyFillerType(keyword);
-      return this.dtType.canBeCastFrom(attributeRef, _propertyFillerType);
+      LEntityAttribute _attributeRef = attributeByObject.getAttributeRef();
+      LEntityAttribute attributeRef = ((LEntityAttribute) _attributeRef);
+      return this.dtType.canBeCastFrom(attributeRef, this.getPropertyFillerType(keyword));
     }
     return true;
   }
   
+  @Override
   protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
     boolean _isValidProposal = super.isValidProposal(proposal, prefix, context);
     boolean _not = (!_isValidProposal);
@@ -366,17 +338,41 @@
     } else {
       EObject currentModel = context.getCurrentModel();
       boolean _matched = false;
-      if (!_matched) {
-        if (currentModel instanceof EntityMockObjectArrayValue) {
-          _matched=true;
-          return true;
-        }
+      if (currentModel instanceof EntityMockObjectArrayValue) {
+        _matched=true;
+        return true;
       }
       return true;
     }
   }
   
+  @Override
+  public void complete_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.provider.complete_ID(model, ruleCall, context, acceptor);
+  }
+  
+  @Override
   public void complete_STRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     this.provider.complete_STRING(model, ruleCall, context, acceptor);
   }
+  
+  @Override
+  public void complete_INT(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.provider.complete_INT(model, ruleCall, context, acceptor);
+  }
+  
+  @Override
+  public void complete_SINT(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.provider.complete_INT(model, ruleCall, context, acceptor);
+  }
+  
+  @Override
+  public void complete_QualifiedName(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
+  }
+  
+  @Override
+  public void complete_UnsignedNumber(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.providerHelper.createNumberProposal(context, acceptor, ruleCall, this);
+  }
 }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/.gitignore
new file mode 100644
index 0000000..48669bb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/.gitignore
@@ -0,0 +1,2 @@
+/EntityMockDSLDescriptionLabelProvider.java
+/EntityMockDSLLabelProvider.java
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.java b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.java
index afc64ca..3287b90 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/labeling/EntityMockDSLLabelProvider.java
@@ -19,11 +19,8 @@
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
 import org.eclipse.osbp.dsl.semantic.common.types.LImport;
-import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
-import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
 import org.eclipse.osbp.xtext.basic.ui.labeling.BasicDSLLabelProvider;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFile;
@@ -51,8 +48,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
-import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange;
@@ -64,7 +60,6 @@
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords;
-import org.eclipse.osbp.xtext.entitymock.PropertyFillerType;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom;
@@ -87,31 +82,24 @@
     super(delegate);
   }
   
+  @Override
   public Object text(final Object o) {
     Object _switchResult = null;
     boolean _matched = false;
-    if (!_matched) {
-      if (o instanceof EntityMockAttributeByObject) {
-        _matched=true;
-        LEntityAttribute _attributeRef = ((EntityMockAttributeByObject)o).getAttributeRef();
-        String _name = _attributeRef.getName();
-        _switchResult = this.generateText(o, "attribute by object", _name);
-      }
+    if (o instanceof EntityMockAttributeByObject) {
+      _matched=true;
+      _switchResult = this.generateText(o, "attribute by object", ((EntityMockAttributeByObject)o).getAttributeRef().getName());
     }
     if (!_matched) {
       if (o instanceof EntityMockAttributeByReference) {
         _matched=true;
-        LEntityReference _attributeRef = ((EntityMockAttributeByReference)o).getAttributeRef();
-        String _name = _attributeRef.getName();
-        _switchResult = this.generateText(o, "attribute by reference", _name);
+        _switchResult = this.generateText(o, "attribute by reference", ((EntityMockAttributeByReference)o).getAttributeRef().getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockAttributeFiller) {
         _matched=true;
-        LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)o).getAttributeRef();
-        String _name = _attributeRef.getName();
-        _switchResult = this.generateText(o, "attribute filler", _name);
+        _switchResult = this.generateText(o, "attribute filler", ((EntityMockAttributeFiller)o).getAttributeRef().getName());
       }
     }
     if (!_matched) {
@@ -123,9 +111,7 @@
     if (!_matched) {
       if (o instanceof EntityMockEntity) {
         _matched=true;
-        LEntity _entityRef = ((EntityMockEntity)o).getEntityRef();
-        String _name = _entityRef.getName();
-        _switchResult = this.generateText(o, "entity", _name);
+        _switchResult = this.generateText(o, "entity", ((EntityMockEntity)o).getEntityRef().getName());
       }
     }
     if (!_matched) {
@@ -142,51 +128,43 @@
     if (!_matched) {
       if (o instanceof EntityMockObject) {
         _matched=true;
-        String _name = ((EntityMockObject)o).getName();
-        _switchResult = this.generateText(o, "object", _name);
+        _switchResult = this.generateText(o, "object", ((EntityMockObject)o).getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectArrayValue) {
         _matched=true;
-        String _name = ((EntityMockObjectArrayValue)o).getName();
-        _switchResult = this.generateText(o, "array value", _name);
+        _switchResult = this.generateText(o, "array value", ((EntityMockObjectArrayValue)o).getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectEmbed) {
         _matched=true;
-        String _name = ((EntityMockObjectEmbed)o).getName();
-        _switchResult = this.generateText(o, "object embed", _name);
+        _switchResult = this.generateText(o, "object embed", ((EntityMockObjectEmbed)o).getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectEnum) {
         _matched=true;
-        String _name = ((EntityMockObjectEnum)o).getName();
-        _switchResult = this.generateText(o, "object enum", _name);
+        _switchResult = this.generateText(o, "object enum", ((EntityMockObjectEnum)o).getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectFill) {
         _matched=true;
-        String _name = ((EntityMockObjectFill)o).getName();
-        _switchResult = this.generateText(o, "object fill", _name);
+        _switchResult = this.generateText(o, "object fill", ((EntityMockObjectFill)o).getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectItemValue) {
         _matched=true;
-        LEnumLiteral _datarow = ((EntityMockObjectItemValue)o).getDatarow();
-        String _name = _datarow.getName();
-        _switchResult = this.generateText(o, "item value", _name);
+        _switchResult = this.generateText(o, "item value", ((EntityMockObjectItemValue)o).getDatarow().getName());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectPlainValue) {
         _matched=true;
-        String _name = ((EntityMockObjectPlainValue)o).getName();
-        _switchResult = this.generateText(o, "plain value", _name);
+        _switchResult = this.generateText(o, "plain value", ((EntityMockObjectPlainValue)o).getName());
       }
     }
     if (!_matched) {
@@ -206,23 +184,21 @@
         _matched=true;
         String _xblockexpression = null;
         {
-          EntityMockTemporary _temporary = ((EntityMockReferencedObjectAttribute)o).getTemporary();
-          String r = _temporary.getName();
+          String r = ((EntityMockReferencedObjectAttribute)o).getTemplate().getName();
           EList<EntityMockObjectEmbed> _embedded = ((EntityMockReferencedObjectAttribute)o).getEmbedded();
           for (final EntityMockObjectEmbed e : _embedded) {
             StringConcatenation _builder = new StringConcatenation();
-            _builder.append(r, "");
+            _builder.append(r);
             _builder.append(".");
             String _name = e.getName();
-            _builder.append(_name, "");
+            _builder.append(_name);
             r = _builder.toString();
           }
           StringConcatenation _builder_1 = new StringConcatenation();
-          _builder_1.append(r, "");
+          _builder_1.append(r);
           _builder_1.append(".");
-          IEntityMockObjectUsable _attribute = ((EntityMockReferencedObjectAttribute)o).getAttribute();
-          String _text = this.getText(_attribute);
-          _builder_1.append(_text, "");
+          String _text = this.getText(((EntityMockReferencedObjectAttribute)o).getAttribute());
+          _builder_1.append(_text);
           _xblockexpression = _builder_1.toString();
         }
         _switchResult = _xblockexpression;
@@ -231,8 +207,7 @@
     if (!_matched) {
       if (o instanceof EntityMockResource) {
         _matched=true;
-        String _name = ((EntityMockResource)o).getName();
-        _switchResult = this.generateText(o, "resource", _name);
+        _switchResult = this.generateText(o, "resource", ((EntityMockResource)o).getName());
       }
     }
     if (!_matched) {
@@ -244,15 +219,13 @@
     if (!_matched) {
       if (o instanceof EntityMockResourceDataRow) {
         _matched=true;
-        String _name = ((EntityMockResourceDataRow)o).getName();
-        _switchResult = this.generateText(o, "data row", _name);
+        _switchResult = this.generateText(o, "data row", ((EntityMockResourceDataRow)o).getName());
       }
     }
     if (!_matched) {
-      if (o instanceof EntityMockTemporary) {
+      if (o instanceof EntityMockTemplate) {
         _matched=true;
-        String _name = ((EntityMockTemporary)o).getName();
-        _switchResult = this.generateText(o, "temporary", _name);
+        _switchResult = this.generateText(o, "template", ((EntityMockTemplate)o).getName());
       }
     }
     if (!_matched) {
@@ -273,8 +246,7 @@
     if (!_matched) {
       if (o instanceof LImport) {
         _matched=true;
-        String _importedNamespace = ((LImport)o).getImportedNamespace();
-        _switchResult = this.generateText(o, "import", _importedNamespace);
+        _switchResult = this.generateText(o, "import", ((LImport)o).getImportedNamespace());
       }
     }
     if (!_matched) {
@@ -283,7 +255,7 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("between now and ");
         int _dateFutureYears = ((PropertyFillerDateFuture)o).getDateFutureYears();
-        _builder.append(_dateFutureYears, "");
+        _builder.append(_dateFutureYears);
         _builder.append(" years into the future");
         _switchResult = _builder;
       }
@@ -294,7 +266,7 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("between ");
         int _datePastYears = ((PropertyFillerDatePast)o).getDatePastYears();
-        _builder.append(_datePastYears, "");
+        _builder.append(_datePastYears);
         _builder.append(" years in the past and now");
         _switchResult = _builder;
       }
@@ -305,10 +277,10 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("between ");
         int _dateBeginYears = ((PropertyFillerDateRange)o).getDateBeginYears();
-        _builder.append(_dateBeginYears, "");
+        _builder.append(_dateBeginYears);
         _builder.append(" and ");
         int _dateEndYears = ((PropertyFillerDateRange)o).getDateEndYears();
-        _builder.append(_dateEndYears, "");
+        _builder.append(_dateEndYears);
         _builder.append(" from now");
         _switchResult = _builder;
       }
@@ -327,13 +299,13 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("singned double between ");
         double _beginRange = ((PropertyFillerSignedDoubleRange)o).getBeginRange();
-        _builder.append(_beginRange, "");
+        _builder.append(_beginRange);
         _builder.append(" and ");
         double _endRange = ((PropertyFillerSignedDoubleRange)o).getEndRange();
-        _builder.append(_endRange, "");
+        _builder.append(_endRange);
         _builder.append(" with ");
         int _decimals = ((PropertyFillerSignedDoubleRange)o).getDecimals();
-        _builder.append(_decimals, "");
+        _builder.append(_decimals);
         _builder.append(" decimals");
         _switchResult = _builder;
       }
@@ -352,10 +324,10 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("singned integer between ");
         int _beginRange = ((PropertyFillerSignedIntegerRange)o).getBeginRange();
-        _builder.append(_beginRange, "");
+        _builder.append(_beginRange);
         _builder.append(" and ");
         int _endRange = ((PropertyFillerSignedIntegerRange)o).getEndRange();
-        _builder.append(_endRange, "");
+        _builder.append(_endRange);
         _switchResult = _builder;
       }
     }
@@ -364,7 +336,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         int _count = ((PropertyFillerTextParagraphs)o).getCount();
-        _builder.append(_count, "");
+        _builder.append(_count);
         _builder.append(" paragraph(s)");
         _switchResult = _builder;
       }
@@ -380,7 +352,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         int _count = ((PropertyFillerTextSentences)o).getCount();
-        _builder.append(_count, "");
+        _builder.append(_count);
         _builder.append(" sentence(s)");
         _switchResult = _builder;
       }
@@ -390,7 +362,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         int _count = ((PropertyFillerTextWords)o).getCount();
-        _builder.append(_count, "");
+        _builder.append(_count);
         _builder.append(" word(s)");
         _switchResult = _builder;
       }
@@ -409,13 +381,13 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("unsingned double between ");
         double _beginRange = ((PropertyFillerUnsignedDoubleRange)o).getBeginRange();
-        _builder.append(_beginRange, "");
+        _builder.append(_beginRange);
         _builder.append(" and ");
         double _endRange = ((PropertyFillerUnsignedDoubleRange)o).getEndRange();
-        _builder.append(_endRange, "");
+        _builder.append(_endRange);
         _builder.append(" with ");
         int _decimals = ((PropertyFillerUnsignedDoubleRange)o).getDecimals();
-        _builder.append(_decimals, "");
+        _builder.append(_decimals);
         _builder.append(" decimals");
         _switchResult = _builder;
       }
@@ -434,19 +406,17 @@
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("unsingned integer between ");
         int _beginRange = ((PropertyFillerUnsignedIntegerRange)o).getBeginRange();
-        _builder.append(_beginRange, "");
+        _builder.append(_beginRange);
         _builder.append(" and ");
         int _endRange = ((PropertyFillerUnsignedIntegerRange)o).getEndRange();
-        _builder.append(_endRange, "");
+        _builder.append(_endRange);
         _switchResult = _builder;
       }
     }
     if (!_matched) {
       if (o instanceof RunningDataInterchange) {
         _matched=true;
-        DataInterchange _datainterchangeRef = ((RunningDataInterchange)o).getDatainterchangeRef();
-        String _name = _datainterchangeRef.getName();
-        _switchResult = this.generateText(o, "data interchange", _name);
+        _switchResult = this.generateText(o, "data interchange", ((RunningDataInterchange)o).getDatainterchangeRef().getName());
       }
     }
     if (!_matched) {
@@ -463,9 +433,8 @@
         if (_equals) {
           StringConcatenation _builder = new StringConcatenation();
           _builder.append("text  for ");
-          Class<?> _class = o.getClass();
-          String _canonicalName = _class.getCanonicalName();
-          _builder.append(_canonicalName, "");
+          String _canonicalName = o.getClass().getCanonicalName();
+          _builder.append(_canonicalName);
           System.err.println(_builder);
         }
         _xblockexpression = r;
@@ -475,154 +444,132 @@
     return _switchResult;
   }
   
+  @Override
   public Object image(final Object o) {
     Image _switchResult = null;
     boolean _matched = false;
-    if (!_matched) {
-      if (o instanceof EntityMockAttributeByObject) {
-        _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_field.png", _class);
-      }
+    if (o instanceof EntityMockAttributeByObject) {
+      _matched=true;
+      _switchResult = this.getInternalImage("private_field.png", this.getClass());
     }
     if (!_matched) {
       if (o instanceof EntityMockAttributeByReference) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("class.gif", _class);
+        _switchResult = this.getInternalImage("class.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockAttributeFiller) {
         _matched=true;
-        PropertyFillerType _fillerType = ((EntityMockAttributeFiller)o).getFillerType();
-        _switchResult = this.getImage(_fillerType);
+        _switchResult = this.getImage(((EntityMockAttributeFiller)o).getFillerType());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockEntities) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("dice-16.gif", _class);
+        _switchResult = this.getInternalImage("dice-16.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockEntity) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("dice-16.gif", _class);
+        _switchResult = this.getInternalImage("dice-16.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockEntityFunction) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("function.gif", _class);
+        _switchResult = this.getInternalImage("function.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockModel) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("dice-16.gif", _class);
+        _switchResult = this.getInternalImage("dice-16.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObject) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_method.png", _class);
+        _switchResult = this.getInternalImage("private_method.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectArrayValue) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("enum.gif", _class);
+        _switchResult = this.getInternalImage("enum.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectEmbed) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_field.png", _class);
+        _switchResult = this.getInternalImage("private_field.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectEnum) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("enum_obj.gif", _class);
+        _switchResult = this.getInternalImage("enum_obj.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectFill) {
         _matched=true;
-        PropertyFillerType _fillerType = ((EntityMockObjectFill)o).getFillerType();
-        _switchResult = this.getImage(_fillerType);
+        _switchResult = this.getImage(((EntityMockObjectFill)o).getFillerType());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectItemValue) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("array.png", _class);
+        _switchResult = this.getInternalImage("array.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjectPlainValue) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("array.png", _class);
+        _switchResult = this.getInternalImage("array.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockObjects) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_method.png", _class);
+        _switchResult = this.getInternalImage("private_method.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockPackage) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("package.gif", _class);
+        _switchResult = this.getInternalImage("package.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockReferencedObjectAttribute) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_field.png", _class);
+        _switchResult = this.getInternalImage("private_field.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockResourceDataRow) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("enum_alt_obj.gif", _class);
+        _switchResult = this.getInternalImage("enum_alt_obj.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof EntityMockResources) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("enum_alt_obj.gif", _class);
+        _switchResult = this.getInternalImage("enum_alt_obj.gif", this.getClass());
       }
     }
     if (!_matched) {
-      if (o instanceof EntityMockTemporary) {
+      if (o instanceof EntityMockTemplate) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("private_method.png", _class);
+        _switchResult = this.getInternalImage("private_method.png", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof DateIterate) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("date-iterate.png", _class);
+        _switchResult = this.getInternalImage("date-iterate.png", this.getClass());
       }
     }
     if (!_matched) {
@@ -634,113 +581,97 @@
     if (!_matched) {
       if (o instanceof LImport) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("class.gif", _class);
+        _switchResult = this.getInternalImage("class.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerDateFuture) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("calendar-small.gif", _class);
+        _switchResult = this.getInternalImage("calendar-small.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerDatePast) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("calendar-small.gif", _class);
+        _switchResult = this.getInternalImage("calendar-small.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerDateRange) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("calendar-small.gif", _class);
+        _switchResult = this.getInternalImage("calendar-small.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerSignedDoubleRandom) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("double.gif", _class);
+        _switchResult = this.getInternalImage("double.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerSignedDoubleRange) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("double.gif", _class);
+        _switchResult = this.getInternalImage("double.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerSignedIntegerRandom) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("int.gif", _class);
+        _switchResult = this.getInternalImage("int.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerSignedIntegerRange) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("int.gif", _class);
+        _switchResult = this.getInternalImage("int.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerTextParagraphs) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("var_string.gif", _class);
+        _switchResult = this.getInternalImage("var_string.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerTextRandom) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("var_string.gif", _class);
+        _switchResult = this.getInternalImage("var_string.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerTextSentences) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("var_string.gif", _class);
+        _switchResult = this.getInternalImage("var_string.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerTextWords) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("var_string.gif", _class);
+        _switchResult = this.getInternalImage("var_string.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerUnsignedDoubleRandom) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("double.gif", _class);
+        _switchResult = this.getInternalImage("double.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerUnsignedDoubleRange) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("double.gif", _class);
+        _switchResult = this.getInternalImage("double.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerUnsignedIntegerRandom) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("int.gif", _class);
+        _switchResult = this.getInternalImage("int.gif", this.getClass());
       }
     }
     if (!_matched) {
       if (o instanceof PropertyFillerUnsignedIntegerRange) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("int.gif", _class);
+        _switchResult = this.getInternalImage("int.gif", this.getClass());
       }
     }
     if (!_matched) {
@@ -753,8 +684,7 @@
           _fileEndpoint=_datainterchangeRef.getFileEndpoint();
         }
         if ((_fileEndpoint instanceof DataInterchangeFileCSV)) {
-          Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-          _xifexpression = this.getInternalImage("csv.png", _class);
+          _xifexpression = this.getInternalImage("csv.png", this.getClass());
         } else {
           Image _xifexpression_1 = null;
           DataInterchange _datainterchangeRef_1 = ((RunningDataInterchange)o).getDatainterchangeRef();
@@ -763,8 +693,7 @@
             _fileEndpoint_1=_datainterchangeRef_1.getFileEndpoint();
           }
           if ((_fileEndpoint_1 instanceof DataInterchangeFileEDI)) {
-            Class<? extends EntityMockDSLLabelProvider> _class_1 = this.getClass();
-            _xifexpression_1 = this.getInternalImage("edi.png", _class_1);
+            _xifexpression_1 = this.getInternalImage("edi.png", this.getClass());
           } else {
             Image _xifexpression_2 = null;
             DataInterchange _datainterchangeRef_2 = ((RunningDataInterchange)o).getDatainterchangeRef();
@@ -773,11 +702,9 @@
               _fileEndpoint_2=_datainterchangeRef_2.getFileEndpoint();
             }
             if ((_fileEndpoint_2 instanceof DataInterchangeFileXML)) {
-              Class<? extends EntityMockDSLLabelProvider> _class_2 = this.getClass();
-              _xifexpression_2 = this.getInternalImage("xml.png", _class_2);
+              _xifexpression_2 = this.getInternalImage("xml.png", this.getClass());
             } else {
-              Class<? extends EntityMockDSLLabelProvider> _class_3 = this.getClass();
-              _xifexpression_2 = this.getInternalImage("data_interchange.png", _class_3);
+              _xifexpression_2 = this.getInternalImage("data_interchange.png", this.getClass());
             }
             _xifexpression_1 = _xifexpression_2;
           }
@@ -789,8 +716,7 @@
     if (!_matched) {
       if (o instanceof RunningDataInterchanges) {
         _matched=true;
-        Class<? extends EntityMockDSLLabelProvider> _class = this.getClass();
-        _switchResult = this.getInternalImage("dsl_datainterchange.png", _class);
+        _switchResult = this.getInternalImage("dsl_datainterchange.png", this.getClass());
       }
     }
     if (!_matched) {
@@ -798,9 +724,8 @@
       {
         StringConcatenation _builder = new StringConcatenation();
         _builder.append("image for ");
-        Class<?> _class = o.getClass();
-        String _canonicalName = _class.getCanonicalName();
-        _builder.append(_canonicalName, "");
+        String _canonicalName = o.getClass().getCanonicalName();
+        _builder.append(_canonicalName);
         System.err.println(_builder);
         _xblockexpression = null;
       }
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/outline/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/outline/.gitignore
new file mode 100644
index 0000000..be43df9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/outline/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLOutlineTreeProvider.java
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/.gitignore b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/.gitignore
new file mode 100644
index 0000000..0d70280
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLQuickfixProvider.java
diff --git a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.java b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.java
index 0314de7..e894311 100644
--- a/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock.ui/xtend-gen/org/eclipse/osbp/xtext/entitymock/ui/quickfix/EntityMockDSLQuickfixProvider.java
@@ -14,7 +14,7 @@
  */
 package org.eclipse.osbp.xtext.entitymock.ui.quickfix;
 
-import org.eclipse.xtext.xbase.annotations.ui.quickfix.XbaseWithAnnotationsQuickfixProvider;
+import org.eclipse.osbp.xtext.oxtype.ui.quickfix.OXtypeQuickfixProvider;
 
 /**
  * Custom quickfixes.
@@ -22,5 +22,5 @@
  * see http://www.eclipse.org/Xtext/documentation.html#quickfixes
  */
 @SuppressWarnings("all")
-public class EntityMockDSLQuickfixProvider extends XbaseWithAnnotationsQuickfixProvider {
+public class EntityMockDSLQuickfixProvider extends OXtypeQuickfixProvider {
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/.classpath b/org.eclipse.osbp.xtext.entitymock/.classpath
new file mode 100644
index 0000000..7ce5543
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="emf-gen/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.entitymock/.gitignore b/org.eclipse.osbp.xtext.entitymock/.gitignore
new file mode 100644
index 0000000..fa635ba
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.gitignore
@@ -0,0 +1,8 @@
+/bin/
+#/emf-gen/
+#/xtend-gen/
+# exclude everything inside /src-gen except README.txt
+# see http://git-scm.com/docs/gitignore
+!/src-gen
+#/src-gen/*
+!/src-gen/README.txt
diff --git a/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.emf.ecore.xcore.Xcore.prefs b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.emf.ecore.xcore.Xcore.prefs
new file mode 100644
index 0000000..5e53854
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.emf.ecore.xcore.Xcore.prefs
@@ -0,0 +1,12 @@
+autobuilding=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.cleanDirectory=false
+outlet.DEFAULT_OUTPUT.cleanupDerived=true
+outlet.DEFAULT_OUTPUT.createDirectory=true
+outlet.DEFAULT_OUTPUT.derived=true
+outlet.DEFAULT_OUTPUT.directory=./emf-gen
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.keepLocalHistory=true
+outlet.DEFAULT_OUTPUT.override=true
diff --git a/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.entitymock/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.entitymock/META-INF/MANIFEST.MF
index fdff553..61a18b7 100644
--- a/org.eclipse.osbp.xtext.entitymock/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.entitymock/META-INF/MANIFEST.MF
@@ -22,46 +22,52 @@
  org.eclipse.emf.ecore.xcore.lib,
  org.eclipse.emf.codegen.ecore;resolution:=optional,
  org.eclipse.emf.mwe.utils;resolution:=optional,
- org.eclipse.xtend.lib;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)";visibility:=reexport,
- org.eclipse.xtext.xbase;bundle-version="[2.7.3,2.8.0)";visibility:=reexport,
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.generator;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
- org.eclipse.xtext.util;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtend.lib;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)";visibility:=reexport,
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.generator;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
+ org.eclipse.xtext.util;bundle-version="[2.11.0,2.12.0)",
  org.junit;bundle-version="4.10.0",
  org.objectweb.asm;bundle-version="[5.0.1,6.0.0)",
- org.eclipse.osbp.dsl.xtext.lazyresolver;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.dsl.xtext.lazyresolver.api;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.common.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.entity.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.utils.blob;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.i18n;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.basic;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.xtext.datainterchange;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.dsl.mwe;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
- org.eclipse.emf.mwe2.launch;bundle-version="2.7.1";resolution:=optional,
+ org.eclipse.emf.mwe2.launch;bundle-version="[2.9.0,2.10.0)";resolution:=optional,
  org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.persistence;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.xtext.addons;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.bundles;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.loader.api;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.types.loader.runtime;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.builder.xbase.setups;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osgi.services;bundle-version="3.4.0"
+ org.eclipse.osgi.services;bundle-version="3.4.0",
+ org.eclipse.osbp.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.entitymock.common;bundle-version="0.9.0",
+ org.eclipse.osbp.preferences;bundle-version="0.9.0",
+ org.eclipse.osbp.blob;bundle-version="0.9.0"
 Import-Package: javax.validation,
  javax.validation.constraints,
  org.apache.log4j,
+ org.eclipse.osbp.core.api.persistence;version="0.9.0",
+ org.eclipse.osbp.datainterchange.api,
+ org.eclipse.osbp.ui.api.customfields;version="0.9.0",
  org.eclipse.osbp.ui.api.datamart;version="0.9.0",
- org.eclipse.osbp.ui.initialization;version="0.9.0"
+ org.eclipse.osbp.ui.initialization;version="0.9.0",
+ org.eclipse.osbp.utils.annotation;version="0.9.0",
+ org.eclipse.osbp.utils.common;version="0.9.0",
+ org.eclipse.osbp.utils.entityhelper;version="0.9.0"
 Export-Package: org.eclipse.osbp.xtext.entitymock;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.formatting;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.impl;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.jvmmodel;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.parser.antlr;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.parser.antlr.internal;version="0.9.0",
+ org.eclipse.osbp.xtext.entitymock.scoping;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.serializer;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.services;version="0.9.0",
  org.eclipse.osbp.xtext.entitymock.util;version="0.9.0",
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/Date.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/Date.java
index d5718aa..9111d47 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/Date.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/Date.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.Date#isYesterday <em>Yesterday</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.Date#isToday <em>Today</em>}</li>
@@ -32,7 +33,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.Date#getMonth <em>Month</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.Date#getDay <em>Day</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getDate()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/DateIterate.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/DateIterate.java
index 3d89d76..09c2919 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/DateIterate.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/DateIterate.java
@@ -21,13 +21,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getFrom <em>From</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getUntil <em>Until</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getStepCount <em>Step Count</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getStepType <em>Step Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getDateIterate()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EDateStepType.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EDateStepType.java
index e104889..e4c4010 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EDateStepType.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EDateStepType.java
@@ -155,6 +155,8 @@
 	 * Returns the '<em><b>EDate Step Type</b></em>' literal with the specified literal value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
 	public static EDateStepType get(String literal) {
@@ -171,6 +173,8 @@
 	 * Returns the '<em><b>EDate Step Type</b></em>' literal with the specified name.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
 	public static EDateStepType getByName(String name) {
@@ -187,6 +191,8 @@
 	 * Returns the '<em><b>EDate Step Type</b></em>' literal with the specified integer value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
 	public static EDateStepType get(int value) {
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMock.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMock.java
new file mode 100644
index 0000000..27429bf
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMock.java
@@ -0,0 +1,250 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Entity Mock</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue <em>Description Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority <em>Run Priority</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges <em>Datainterchanges</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getResources <em>Resources</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects <em>Objects</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities <em>Entities</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock()
+ * @model
+ * @generated
+ */
+public interface EntityMock extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Name()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(boolean)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Description()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isDescription();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #isDescription()
+	 * @generated
+	 */
+	void setDescription(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Description Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description Value</em>' attribute.
+	 * @see #setDescriptionValue(String)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_DescriptionValue()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getDescriptionValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description Value</em>' attribute.
+	 * @see #getDescriptionValue()
+	 * @generated
+	 */
+	void setDescriptionValue(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Run Priority</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Run Priority</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Run Priority</em>' attribute.
+	 * @see #setRunPriority(int)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_RunPriority()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getRunPriority();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority <em>Run Priority</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Run Priority</em>' attribute.
+	 * @see #getRunPriority()
+	 * @generated
+	 */
+	void setRunPriority(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Datainterchanges</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Datainterchanges</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Datainterchanges</em>' containment reference.
+	 * @see #setDatainterchanges(RunningDataInterchanges)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Datainterchanges()
+	 * @model containment="true"
+	 * @generated
+	 */
+	RunningDataInterchanges getDatainterchanges();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges <em>Datainterchanges</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Datainterchanges</em>' containment reference.
+	 * @see #getDatainterchanges()
+	 * @generated
+	 */
+	void setDatainterchanges(RunningDataInterchanges value);
+
+	/**
+	 * Returns the value of the '<em><b>Resources</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Resources</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Resources</em>' containment reference.
+	 * @see #setResources(EntityMockResources)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Resources()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EntityMockResources getResources();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getResources <em>Resources</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Resources</em>' containment reference.
+	 * @see #getResources()
+	 * @generated
+	 */
+	void setResources(EntityMockResources value);
+
+	/**
+	 * Returns the value of the '<em><b>Objects</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Objects</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Objects</em>' containment reference.
+	 * @see #setObjects(EntityMockObjects)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Objects()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EntityMockObjects getObjects();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects <em>Objects</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Objects</em>' containment reference.
+	 * @see #getObjects()
+	 * @generated
+	 */
+	void setObjects(EntityMockObjects value);
+
+	/**
+	 * Returns the value of the '<em><b>Entities</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Entities</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Entities</em>' containment reference.
+	 * @see #setEntities(EntityMockEntities)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMock_Entities()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EntityMockEntities getEntities();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities <em>Entities</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Entities</em>' containment reference.
+	 * @see #getEntities()
+	 * @generated
+	 */
+	void setEntities(EntityMockEntities value);
+
+} // EntityMock
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByObject.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByObject.java
index 90a5780..b9f9300 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByObject.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByObject.java
@@ -22,13 +22,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getReference <em>Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceEnum <em>Resource Enum</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockAttributeByObject()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByReference.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByReference.java
index 19cce76..3d5aa26 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByReference.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeByReference.java
@@ -22,12 +22,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getMockedEntity <em>Mocked Entity</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getOptionalFor <em>Optional For</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockAttributeByReference()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeFiller.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeFiller.java
index ebac5cd..244e750 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeFiller.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockAttributeFiller.java
@@ -22,11 +22,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getFillerType <em>Filler Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockAttributeFiller()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockByResourceAttribute.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockByResourceAttribute.java
index b1b2edc..b4aeed5 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockByResourceAttribute.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockByResourceAttribute.java
@@ -24,11 +24,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockByResourceAttribute()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLFactory.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLFactory.java
index 49cff62..2c5e4d8 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLFactory.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLFactory.java
@@ -42,6 +42,15 @@
 	EntityMockModel createEntityMockModel();
 
 	/**
+	 * Returns a new object of class '<em>Entity Mock Lazy Resolver</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Entity Mock Lazy Resolver</em>'.
+	 * @generated
+	 */
+	EntityMockLazyResolver createEntityMockLazyResolver();
+
+	/**
 	 * Returns a new object of class '<em>Entity Mock Package</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -51,6 +60,15 @@
 	EntityMockPackage createEntityMockPackage();
 
 	/**
+	 * Returns a new object of class '<em>Entity Mock</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Entity Mock</em>'.
+	 * @generated
+	 */
+	EntityMock createEntityMock();
+
+	/**
 	 * Returns a new object of class '<em>Running Data Interchanges</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -69,15 +87,6 @@
 	RunningDataInterchange createRunningDataInterchange();
 
 	/**
-	 * Returns a new object of class '<em>Entity Mock Lazy Resolver</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Mock Lazy Resolver</em>'.
-	 * @generated
-	 */
-	EntityMockLazyResolver createEntityMockLazyResolver();
-
-	/**
 	 * Returns a new object of class '<em>Entity Mock Resources</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -411,24 +420,6 @@
 	PropertyFillerUnsignedIntegerRandom createPropertyFillerUnsignedIntegerRandom();
 
 	/**
-	 * Returns a new object of class '<em>Entity Mock Data Types</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Mock Data Types</em>'.
-	 * @generated
-	 */
-	EntityMockDataTypes createEntityMockDataTypes();
-
-	/**
-	 * Returns a new object of class '<em>Entity Mock Data Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Mock Data Type</em>'.
-	 * @generated
-	 */
-	EntityMockDataType createEntityMockDataType();
-
-	/**
 	 * Returns a new object of class '<em>Entity Mock Entities</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -492,13 +483,13 @@
 	EntityMockByResourceAttribute createEntityMockByResourceAttribute();
 
 	/**
-	 * Returns a new object of class '<em>Entity Mock Temporary</em>'.
+	 * Returns a new object of class '<em>Entity Mock Template</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Entity Mock Temporary</em>'.
+	 * @return a new object of class '<em>Entity Mock Template</em>'.
 	 * @generated
 	 */
-	EntityMockTemporary createEntityMockTemporary();
+	EntityMockTemplate createEntityMockTemplate();
 
 	/**
 	 * Returns a new object of class '<em>IEntity Mock Object Usable</em>'.
@@ -573,6 +564,15 @@
 	EntityMockEntityFunction createEntityMockEntityFunction();
 
 	/**
+	 * Returns a new object of class '<em>Entity Mock Entity Nested Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Entity Mock Entity Nested Attribute</em>'.
+	 * @generated
+	 */
+	EntityMockEntityNestedAttribute createEntityMockEntityNestedAttribute();
+
+	/**
 	 * Returns a new object of class '<em>Entity Mock Entity Function Parameter</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLPackage.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLPackage.java
index f65c6b8..e34d488 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLPackage.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLPackage.java
@@ -50,7 +50,7 @@
  * <!-- end-model-doc -->
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLFactory
  * @model kind="package"
- *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='entitymock' modelName='EntityMockDSL' prefix='EntityMockDSL' updateClasspath='false' copyrightText='Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License v1.0 \r\n which accompanies this distribution, and is available at \r\n http://www.eclipse.org/legal/epl-v10.html \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tChristophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
+ *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='entitymock' modelName='EntityMockDSL' prefix='EntityMockDSL' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\n All rights reserved. This program and the accompanying materials \n are made available under the terms of the Eclipse Public License v1.0 \n which accompanies this distribution, and is available at \n http://www.eclipse.org/legal/epl-v10.html \n\n Based on ideas from Xtext, Xtend, Xcore\n  \n Contributors:  \n \t\tChristophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation \n ' basePackage='org.eclipse.osbp.xtext'"
  *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='entitymockdsl'"
  * @generated
  */
@@ -98,13 +98,22 @@
 	int ENTITY_MOCK_MODEL = 0;
 
 	/**
+	 * The feature id for the '<em><b>Import Section</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_MODEL__IMPORT_SECTION = 0;
+
+	/**
 	 * The feature id for the '<em><b>Packages</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_MODEL__PACKAGES = 0;
+	int ENTITY_MOCK_MODEL__PACKAGES = 1;
 
 	/**
 	 * The number of structural features of the '<em>Entity Mock Model</em>' class.
@@ -113,7 +122,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_MODEL_FEATURE_COUNT = 1;
+	int ENTITY_MOCK_MODEL_FEATURE_COUNT = 2;
 
 	/**
 	 * The number of operations of the '<em>Entity Mock Model</em>' class.
@@ -125,6 +134,43 @@
 	int ENTITY_MOCK_MODEL_OPERATION_COUNT = 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
+	 * @generated
+	 */
+	int ENTITY_MOCK_LAZY_RESOLVER = 1;
+
+	/**
+	 * The number of structural features of the '<em>Entity Mock Lazy Resolver</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT = 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = 0;
+
+	/**
+	 * The number of operations of the '<em>Entity Mock Lazy Resolver</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT = 1;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl <em>Entity Mock Package</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -132,7 +178,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockPackage()
 	 * @generated
 	 */
-	int ENTITY_MOCK_PACKAGE = 1;
+	int ENTITY_MOCK_PACKAGE = 2;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -144,67 +190,13 @@
 	int ENTITY_MOCK_PACKAGE__NAME = OSBPTypesPackage.LPACKAGE__NAME;
 
 	/**
-	 * The feature id for the '<em><b>Imports</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Mocks</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_PACKAGE__IMPORTS = OSBPTypesPackage.LPACKAGE__IMPORTS;
-
-	/**
-	 * The feature id for the '<em><b>Run Priority</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__RUN_PRIORITY = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Datainterchanges</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__DATAINTERCHANGES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Resources</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__RESOURCES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Objects</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__OBJECTS = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Datatypes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__DATATYPES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Entities</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_PACKAGE__ENTITIES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 5;
+	int ENTITY_MOCK_PACKAGE__MOCKS = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 0;
 
 	/**
 	 * The number of structural features of the '<em>Entity Mock Package</em>' class.
@@ -213,7 +205,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_PACKAGE_FEATURE_COUNT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 6;
+	int ENTITY_MOCK_PACKAGE_FEATURE_COUNT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 1;
 
 	/**
 	 * The operation id for the '<em>EResolve Proxy</em>' operation.
@@ -234,6 +226,106 @@
 	int ENTITY_MOCK_PACKAGE_OPERATION_COUNT = OSBPTypesPackage.LPACKAGE_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl <em>Entity Mock</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMock()
+	 * @generated
+	 */
+	int ENTITY_MOCK = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__DESCRIPTION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Description Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__DESCRIPTION_VALUE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Run Priority</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__RUN_PRIORITY = 3;
+
+	/**
+	 * The feature id for the '<em><b>Datainterchanges</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__DATAINTERCHANGES = 4;
+
+	/**
+	 * The feature id for the '<em><b>Resources</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__RESOURCES = 5;
+
+	/**
+	 * The feature id for the '<em><b>Objects</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__OBJECTS = 6;
+
+	/**
+	 * The feature id for the '<em><b>Entities</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK__ENTITIES = 7;
+
+	/**
+	 * The number of structural features of the '<em>Entity Mock</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_FEATURE_COUNT = 8;
+
+	/**
+	 * The number of operations of the '<em>Entity Mock</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_OPERATION_COUNT = 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl <em>Running Data Interchanges</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -241,7 +333,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchanges()
 	 * @generated
 	 */
-	int RUNNING_DATA_INTERCHANGES = 2;
+	int RUNNING_DATA_INTERCHANGES = 4;
 
 	/**
 	 * The feature id for the '<em><b>Datainterchanges</b></em>' containment reference list.
@@ -278,7 +370,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchange()
 	 * @generated
 	 */
-	int RUNNING_DATA_INTERCHANGE = 3;
+	int RUNNING_DATA_INTERCHANGE = 5;
 
 	/**
 	 * The feature id for the '<em><b>Datainterchange Ref</b></em>' reference.
@@ -317,43 +409,6 @@
 	int RUNNING_DATA_INTERCHANGE_OPERATION_COUNT = 0;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
-	 * @generated
-	 */
-	int ENTITY_MOCK_LAZY_RESOLVER = 4;
-
-	/**
-	 * The number of structural features of the '<em>Entity Mock Lazy Resolver</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT = 0;
-
-	/**
-	 * The operation id for the '<em>EResolve Proxy</em>' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = 0;
-
-	/**
-	 * The number of operations of the '<em>Entity Mock Lazy Resolver</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT = 1;
-
-	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl <em>Entity Mock Resources</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -361,7 +416,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResources()
 	 * @generated
 	 */
-	int ENTITY_MOCK_RESOURCES = 5;
+	int ENTITY_MOCK_RESOURCES = 6;
 
 	/**
 	 * The feature id for the '<em><b>Resources</b></em>' containment reference list.
@@ -398,7 +453,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResource()
 	 * @generated
 	 */
-	int ENTITY_MOCK_RESOURCE = 6;
+	int ENTITY_MOCK_RESOURCE = 7;
 
 	/**
 	 * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
@@ -498,7 +553,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceAttribute()
 	 * @generated
 	 */
-	int ENTITY_MOCK_RESOURCE_ATTRIBUTE = 7;
+	int ENTITY_MOCK_RESOURCE_ATTRIBUTE = 8;
 
 	/**
 	 * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
@@ -580,7 +635,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceDataRow()
 	 * @generated
 	 */
-	int ENTITY_MOCK_RESOURCE_DATA_ROW = 8;
+	int ENTITY_MOCK_RESOURCE_DATA_ROW = 9;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -662,7 +717,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjects()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECTS = 9;
+	int ENTITY_MOCK_OBJECTS = 10;
 
 	/**
 	 * The feature id for the '<em><b>Objects</b></em>' containment reference list.
@@ -699,7 +754,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObject()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT = 10;
+	int ENTITY_MOCK_OBJECT = 11;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -763,7 +818,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectUsable()
 	 * @generated
 	 */
-	int IENTITY_MOCK_OBJECT_USABLE = 52;
+	int IENTITY_MOCK_OBJECT_USABLE = 51;
 
 	/**
 	 * The number of structural features of the '<em>IEntity Mock Object Usable</em>' class.
@@ -800,7 +855,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEnum()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_ENUM = 11;
+	int ENTITY_MOCK_OBJECT_ENUM = 12;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -855,7 +910,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectAttribute()
 	 * @generated
 	 */
-	int IENTITY_MOCK_OBJECT_ATTRIBUTE = 12;
+	int IENTITY_MOCK_OBJECT_ATTRIBUTE = 13;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -901,7 +956,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectPlainValue()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_PLAIN_VALUE = 13;
+	int ENTITY_MOCK_OBJECT_PLAIN_VALUE = 14;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -956,7 +1011,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectResourceValue()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE = 14;
+	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE = 15;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1020,7 +1075,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectArrayValue()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_ARRAY_VALUE = 15;
+	int ENTITY_MOCK_OBJECT_ARRAY_VALUE = 16;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1084,7 +1139,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectItemValue()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_ITEM_VALUE = 16;
+	int ENTITY_MOCK_OBJECT_ITEM_VALUE = 17;
 
 	/**
 	 * The feature id for the '<em><b>Datarow</b></em>' reference.
@@ -1130,7 +1185,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEmbed()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_EMBED = 17;
+	int ENTITY_MOCK_OBJECT_EMBED = 18;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1185,7 +1240,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunction()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_FUNCTION = 18;
+	int ENTITY_MOCK_OBJECT_FUNCTION = 19;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1258,7 +1313,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunctionParameter()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER = 19;
+	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER = 20;
 
 	/**
 	 * The feature id for the '<em><b>Parameter Type</b></em>' containment reference.
@@ -1304,7 +1359,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFill()
 	 * @generated
 	 */
-	int ENTITY_MOCK_OBJECT_FILL = 20;
+	int ENTITY_MOCK_OBJECT_FILL = 21;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1359,7 +1414,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerType()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TYPE = 21;
+	int PROPERTY_FILLER_TYPE = 22;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Type</em>' class.
@@ -1396,7 +1451,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateType()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_DATE_TYPE = 22;
+	int PROPERTY_FILLER_DATE_TYPE = 23;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Date Type</em>' class.
@@ -1433,7 +1488,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerBoolean()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_BOOLEAN = 23;
+	int PROPERTY_FILLER_BOOLEAN = 24;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Boolean</em>' class.
@@ -1470,7 +1525,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDoubleType()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_DOUBLE_TYPE = 24;
+	int PROPERTY_FILLER_DOUBLE_TYPE = 25;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Double Type</em>' class.
@@ -1507,7 +1562,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerIntegerType()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_INTEGER_TYPE = 25;
+	int PROPERTY_FILLER_INTEGER_TYPE = 26;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Integer Type</em>' class.
@@ -1544,7 +1599,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextType()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TEXT_TYPE = 26;
+	int PROPERTY_FILLER_TEXT_TYPE = 27;
 
 	/**
 	 * The number of structural features of the '<em>Property Filler Text Type</em>' class.
@@ -1581,7 +1636,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateFuture()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_DATE_FUTURE = 27;
+	int PROPERTY_FILLER_DATE_FUTURE = 28;
 
 	/**
 	 * The feature id for the '<em><b>Date Future Years</b></em>' attribute.
@@ -1627,7 +1682,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDatePast()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_DATE_PAST = 28;
+	int PROPERTY_FILLER_DATE_PAST = 29;
 
 	/**
 	 * The feature id for the '<em><b>Date Past Years</b></em>' attribute.
@@ -1673,7 +1728,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateRange()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_DATE_RANGE = 29;
+	int PROPERTY_FILLER_DATE_RANGE = 30;
 
 	/**
 	 * The feature id for the '<em><b>Date Begin Years</b></em>' attribute.
@@ -1728,7 +1783,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRange()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE = 30;
+	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE = 31;
 
 	/**
 	 * The feature id for the '<em><b>Decimals</b></em>' attribute.
@@ -1819,7 +1874,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRandom()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM = 31;
+	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM = 32;
 
 	/**
 	 * The feature id for the '<em><b>Items</b></em>' attribute list.
@@ -1865,7 +1920,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRange()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE = 32;
+	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE = 33;
 
 	/**
 	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
@@ -1947,7 +2002,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRandom()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM = 33;
+	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM = 34;
 
 	/**
 	 * The feature id for the '<em><b>Items</b></em>' attribute list.
@@ -1993,7 +2048,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextRandom()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TEXT_RANDOM = 34;
+	int PROPERTY_FILLER_TEXT_RANDOM = 35;
 
 	/**
 	 * The feature id for the '<em><b>Items</b></em>' attribute list.
@@ -2039,7 +2094,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextParagraphs()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TEXT_PARAGRAPHS = 35;
+	int PROPERTY_FILLER_TEXT_PARAGRAPHS = 36;
 
 	/**
 	 * The feature id for the '<em><b>Count</b></em>' attribute.
@@ -2085,7 +2140,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextSentences()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TEXT_SENTENCES = 36;
+	int PROPERTY_FILLER_TEXT_SENTENCES = 37;
 
 	/**
 	 * The feature id for the '<em><b>Count</b></em>' attribute.
@@ -2131,7 +2186,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextWords()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_TEXT_WORDS = 37;
+	int PROPERTY_FILLER_TEXT_WORDS = 38;
 
 	/**
 	 * The feature id for the '<em><b>Count</b></em>' attribute.
@@ -2177,7 +2232,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRange()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE = 38;
+	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE = 39;
 
 	/**
 	 * The feature id for the '<em><b>Decimals</b></em>' attribute.
@@ -2268,7 +2323,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRandom()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM = 39;
+	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM = 40;
 
 	/**
 	 * The feature id for the '<em><b>Items</b></em>' attribute list.
@@ -2314,7 +2369,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRange()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE = 40;
+	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE = 41;
 
 	/**
 	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
@@ -2396,7 +2451,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRandom()
 	 * @generated
 	 */
-	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM = 41;
+	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM = 42;
 
 	/**
 	 * The feature id for the '<em><b>Items</b></em>' attribute list.
@@ -2435,80 +2490,6 @@
 	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT + 0;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypesImpl <em>Entity Mock Data Types</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypesImpl
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockDataTypes()
-	 * @generated
-	 */
-	int ENTITY_MOCK_DATA_TYPES = 42;
-
-	/**
-	 * The feature id for the '<em><b>Datatypes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPES__DATATYPES = 0;
-
-	/**
-	 * The number of structural features of the '<em>Entity Mock Data Types</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPES_FEATURE_COUNT = 1;
-
-	/**
-	 * The number of operations of the '<em>Entity Mock Data Types</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPES_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypeImpl <em>Entity Mock Data Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypeImpl
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockDataType()
-	 * @generated
-	 */
-	int ENTITY_MOCK_DATA_TYPE = 43;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPE__NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Entity Mock Data Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPE_FEATURE_COUNT = 1;
-
-	/**
-	 * The number of operations of the '<em>Entity Mock Data Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_DATA_TYPE_OPERATION_COUNT = 0;
-
-	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl <em>Entity Mock Entities</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2516,7 +2497,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntities()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ENTITIES = 44;
+	int ENTITY_MOCK_ENTITIES = 43;
 
 	/**
 	 * The feature id for the '<em><b>Entities</b></em>' containment reference list.
@@ -2553,7 +2534,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntity()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ENTITY = 45;
+	int ENTITY_MOCK_ENTITY = 44;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2610,13 +2591,13 @@
 	int ENTITY_MOCK_ENTITY__ITERATOR = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 5;
 
 	/**
-	 * The feature id for the '<em><b>Temporaries</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Templates</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_ENTITY__TEMPORARIES = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 6;
+	int ENTITY_MOCK_ENTITY__TEMPLATES = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 6;
 
 	/**
 	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
@@ -2698,7 +2679,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIIterate()
 	 * @generated
 	 */
-	int IITERATE = 46;
+	int IITERATE = 45;
 
 	/**
 	 * The number of structural features of the '<em>IIterate</em>' class.
@@ -2726,7 +2707,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIntegerIterate()
 	 * @generated
 	 */
-	int INTEGER_ITERATE = 47;
+	int INTEGER_ITERATE = 46;
 
 	/**
 	 * The feature id for the '<em><b>From</b></em>' attribute.
@@ -2781,7 +2762,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDateIterate()
 	 * @generated
 	 */
-	int DATE_ITERATE = 48;
+	int DATE_ITERATE = 47;
 
 	/**
 	 * The feature id for the '<em><b>From</b></em>' containment reference.
@@ -2845,7 +2826,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDate()
 	 * @generated
 	 */
-	int DATE = 49;
+	int DATE = 48;
 
 	/**
 	 * The feature id for the '<em><b>Yesterday</b></em>' attribute.
@@ -2945,7 +2926,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockByResourceAttribute()
 	 * @generated
 	 */
-	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE = 50;
+	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE = 49;
 
 	/**
 	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
@@ -2984,14 +2965,14 @@
 	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE_OPERATION_COUNT = 0;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemporaryImpl <em>Entity Mock Temporary</em>}' class.
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl <em>Entity Mock Template</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemporaryImpl
-	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemporary()
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemplate()
 	 * @generated
 	 */
-	int ENTITY_MOCK_TEMPORARY = 51;
+	int ENTITY_MOCK_TEMPLATE = 50;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -3000,7 +2981,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_TEMPORARY__NAME = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;
+	int ENTITY_MOCK_TEMPLATE__NAME = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Object</b></em>' reference.
@@ -3009,16 +2990,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_TEMPORARY__OBJECT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;
+	int ENTITY_MOCK_TEMPLATE__OBJECT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;
 
 	/**
-	 * The number of structural features of the '<em>Entity Mock Temporary</em>' class.
+	 * The number of structural features of the '<em>Entity Mock Template</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_TEMPORARY_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 2;
+	int ENTITY_MOCK_TEMPLATE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 2;
 
 	/**
 	 * The operation id for the '<em>EResolve Proxy</em>' operation.
@@ -3027,16 +3008,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_TEMPORARY___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+	int ENTITY_MOCK_TEMPLATE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
 
 	/**
-	 * The number of operations of the '<em>Entity Mock Temporary</em>' class.
+	 * The number of operations of the '<em>Entity Mock Template</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_TEMPORARY_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;
+	int ENTITY_MOCK_TEMPLATE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockEntityUsableImpl <em>IEntity Mock Entity Usable</em>}' class.
@@ -3046,7 +3027,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockEntityUsable()
 	 * @generated
 	 */
-	int IENTITY_MOCK_ENTITY_USABLE = 53;
+	int IENTITY_MOCK_ENTITY_USABLE = 52;
 
 	/**
 	 * The number of structural features of the '<em>IEntity Mock Entity Usable</em>' class.
@@ -3083,7 +3064,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockAttribute()
 	 * @generated
 	 */
-	int IENTITY_MOCK_ATTRIBUTE = 54;
+	int IENTITY_MOCK_ATTRIBUTE = 53;
 
 	/**
 	 * The number of structural features of the '<em>IEntity Mock Attribute</em>' class.
@@ -3120,16 +3101,16 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockReferencedObjectAttribute()
 	 * @generated
 	 */
-	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE = 55;
+	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE = 54;
 
 	/**
-	 * The feature id for the '<em><b>Temporary</b></em>' reference.
+	 * The feature id for the '<em><b>Template</b></em>' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;
+	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Embedded</b></em>' reference list.
@@ -3184,7 +3165,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByObject()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT = 56;
+	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT = 55;
 
 	/**
 	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
@@ -3257,7 +3238,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeFiller()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ATTRIBUTE_FILLER = 57;
+	int ENTITY_MOCK_ATTRIBUTE_FILLER = 56;
 
 	/**
 	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
@@ -3312,7 +3293,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByReference()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE = 58;
+	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE = 57;
 
 	/**
 	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
@@ -3376,7 +3357,7 @@
 	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityFunction()
 	 * @generated
 	 */
-	int ENTITY_MOCK_ENTITY_FUNCTION = 59;
+	int ENTITY_MOCK_ENTITY_FUNCTION = 58;
 
 	/**
 	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
@@ -3433,6 +3414,52 @@
 	int ENTITY_MOCK_ENTITY_FUNCTION_OPERATION_COUNT = IENTITY_MOCK_ENTITY_USABLE_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl <em>Entity Mock Entity Nested Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl
+	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityNestedAttribute()
+	 * @generated
+	 */
+	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE = 59;
+
+	/**
+	 * The feature id for the '<em><b>Reference</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE = 1;
+
+	/**
+	 * The number of structural features of the '<em>Entity Mock Entity Nested Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Entity Mock Entity Nested Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE_OPERATION_COUNT = 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl <em>Entity Mock Entity Function Parameter</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3452,22 +3479,13 @@
 	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF = 0;
 
 	/**
-	 * The feature id for the '<em><b>Reference Paths</b></em>' reference list.
+	 * The feature id for the '<em><b>Nested Attribute</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Reference Ref</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF = 2;
+	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE = 1;
 
 	/**
 	 * The number of structural features of the '<em>Entity Mock Entity Function Parameter</em>' class.
@@ -3476,7 +3494,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER_FEATURE_COUNT = 3;
+	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER_FEATURE_COUNT = 2;
 
 	/**
 	 * The number of operations of the '<em>Entity Mock Entity Function Parameter</em>' class.
@@ -3519,6 +3537,17 @@
 	EClass getEntityMockModel();
 
 	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection <em>Import Section</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Import Section</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection()
+	 * @see #getEntityMockModel()
+	 * @generated
+	 */
+	EReference getEntityMockModel_ImportSection();
+
+	/**
 	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getPackages <em>Packages</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3530,6 +3559,26 @@
 	EReference getEntityMockModel_Packages();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver <em>Entity Mock Lazy Resolver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Entity Mock Lazy Resolver</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver
+	 * @generated
+	 */
+	EClass getEntityMockLazyResolver();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) <em>EResolve Proxy</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>EResolve Proxy</em>' operation.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
+	 * @generated
+	 */
+	EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage <em>Entity Mock Package</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3540,70 +3589,113 @@
 	EClass getEntityMockPackage();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getRunPriority <em>Run Priority</em>}'.
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getMocks <em>Mocks</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Mocks</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getMocks()
+	 * @see #getEntityMockPackage()
+	 * @generated
+	 */
+	EReference getEntityMockPackage_Mocks();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMock <em>Entity Mock</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Entity Mock</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock
+	 * @generated
+	 */
+	EClass getEntityMock();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getName()
+	 * @see #getEntityMock()
+	 * @generated
+	 */
+	EAttribute getEntityMock_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription()
+	 * @see #getEntityMock()
+	 * @generated
+	 */
+	EAttribute getEntityMock_Description();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue <em>Description Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description Value</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue()
+	 * @see #getEntityMock()
+	 * @generated
+	 */
+	EAttribute getEntityMock_DescriptionValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority <em>Run Priority</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the attribute '<em>Run Priority</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getRunPriority()
-	 * @see #getEntityMockPackage()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority()
+	 * @see #getEntityMock()
 	 * @generated
 	 */
-	EAttribute getEntityMockPackage_RunPriority();
+	EAttribute getEntityMock_RunPriority();
 
 	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatainterchanges <em>Datainterchanges</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges <em>Datainterchanges</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the containment reference '<em>Datainterchanges</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatainterchanges()
-	 * @see #getEntityMockPackage()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges()
+	 * @see #getEntityMock()
 	 * @generated
 	 */
-	EReference getEntityMockPackage_Datainterchanges();
+	EReference getEntityMock_Datainterchanges();
 
 	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getResources <em>Resources</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getResources <em>Resources</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the containment reference '<em>Resources</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getResources()
-	 * @see #getEntityMockPackage()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getResources()
+	 * @see #getEntityMock()
 	 * @generated
 	 */
-	EReference getEntityMockPackage_Resources();
+	EReference getEntityMock_Resources();
 
 	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getObjects <em>Objects</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects <em>Objects</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the containment reference '<em>Objects</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getObjects()
-	 * @see #getEntityMockPackage()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects()
+	 * @see #getEntityMock()
 	 * @generated
 	 */
-	EReference getEntityMockPackage_Objects();
+	EReference getEntityMock_Objects();
 
 	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatatypes <em>Datatypes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Datatypes</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatatypes()
-	 * @see #getEntityMockPackage()
-	 * @generated
-	 */
-	EReference getEntityMockPackage_Datatypes();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getEntities <em>Entities</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities <em>Entities</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the containment reference '<em>Entities</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getEntities()
-	 * @see #getEntityMockPackage()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities()
+	 * @see #getEntityMock()
 	 * @generated
 	 */
-	EReference getEntityMockPackage_Entities();
+	EReference getEntityMock_Entities();
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges <em>Running Data Interchanges</em>}'.
@@ -3659,26 +3751,6 @@
 	EAttribute getRunningDataInterchange_FileURL();
 
 	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver <em>Entity Mock Lazy Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Mock Lazy Resolver</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver
-	 * @generated
-	 */
-	EClass getEntityMockLazyResolver();
-
-	/**
-	 * Returns the meta object for the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) <em>EResolve Proxy</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the '<em>EResolve Proxy</em>' operation.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
-	 * @generated
-	 */
-	EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject();
-
-	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResources <em>Entity Mock Resources</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4709,48 +4781,6 @@
 	EAttribute getPropertyFillerUnsignedIntegerRandom_Items();
 
 	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes <em>Entity Mock Data Types</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Mock Data Types</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes
-	 * @generated
-	 */
-	EClass getEntityMockDataTypes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes#getDatatypes <em>Datatypes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Datatypes</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes#getDatatypes()
-	 * @see #getEntityMockDataTypes()
-	 * @generated
-	 */
-	EReference getEntityMockDataTypes_Datatypes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataType <em>Entity Mock Data Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Mock Data Type</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataType
-	 * @generated
-	 */
-	EClass getEntityMockDataType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataType#getName()
-	 * @see #getEntityMockDataType()
-	 * @generated
-	 */
-	EAttribute getEntityMockDataType_Name();
-
-	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntities <em>Entity Mock Entities</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4848,15 +4878,15 @@
 	EReference getEntityMockEntity_Iterator();
 
 	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemporaries <em>Temporaries</em>}'.
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemplates <em>Templates</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Temporaries</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemporaries()
+	 * @return the meta object for the containment reference list '<em>Templates</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemplates()
 	 * @see #getEntityMockEntity()
 	 * @generated
 	 */
-	EReference getEntityMockEntity_Temporaries();
+	EReference getEntityMockEntity_Templates();
 
 	/**
 	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getAttributes <em>Attributes</em>}'.
@@ -5151,36 +5181,36 @@
 	EReference getEntityMockByResourceAttribute_ResourceAttribute();
 
 	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemporary <em>Entity Mock Temporary</em>}'.
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate <em>Entity Mock Template</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Entity Mock Temporary</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemporary
+	 * @return the meta object for class '<em>Entity Mock Template</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate
 	 * @generated
 	 */
-	EClass getEntityMockTemporary();
+	EClass getEntityMockTemplate();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemporary#getName <em>Name</em>}'.
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName <em>Name</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemporary#getName()
-	 * @see #getEntityMockTemporary()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName()
+	 * @see #getEntityMockTemplate()
 	 * @generated
 	 */
-	EAttribute getEntityMockTemporary_Name();
+	EAttribute getEntityMockTemplate_Name();
 
 	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemporary#getObject <em>Object</em>}'.
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject <em>Object</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the reference '<em>Object</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemporary#getObject()
-	 * @see #getEntityMockTemporary()
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject()
+	 * @see #getEntityMockTemplate()
 	 * @generated
 	 */
-	EReference getEntityMockTemporary_Object();
+	EReference getEntityMockTemplate_Object();
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable <em>IEntity Mock Object Usable</em>}'.
@@ -5223,15 +5253,15 @@
 	EClass getEntityMockReferencedObjectAttribute();
 
 	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemporary <em>Temporary</em>}'.
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate <em>Template</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Temporary</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemporary()
+	 * @return the meta object for the reference '<em>Template</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate()
 	 * @see #getEntityMockReferencedObjectAttribute()
 	 * @generated
 	 */
-	EReference getEntityMockReferencedObjectAttribute_Temporary();
+	EReference getEntityMockReferencedObjectAttribute_Template();
 
 	/**
 	 * Returns the meta object for the reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getEmbedded <em>Embedded</em>}'.
@@ -5428,6 +5458,38 @@
 	EReference getEntityMockEntityFunction_Body();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute <em>Entity Mock Entity Nested Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Entity Mock Entity Nested Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute
+	 * @generated
+	 */
+	EClass getEntityMockEntityNestedAttribute();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference <em>Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Reference</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference()
+	 * @see #getEntityMockEntityNestedAttribute()
+	 * @generated
+	 */
+	EReference getEntityMockEntityNestedAttribute_Reference();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute <em>Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute()
+	 * @see #getEntityMockEntityNestedAttribute()
+	 * @generated
+	 */
+	EReference getEntityMockEntityNestedAttribute_Attribute();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter <em>Entity Mock Entity Function Parameter</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5449,26 +5511,15 @@
 	EReference getEntityMockEntityFunctionParameter_AttributeRef();
 
 	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferencePaths <em>Reference Paths</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute <em>Nested Attribute</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reference Paths</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferencePaths()
+	 * @return the meta object for the containment reference '<em>Nested Attribute</em>'.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute()
 	 * @see #getEntityMockEntityFunctionParameter()
 	 * @generated
 	 */
-	EReference getEntityMockEntityFunctionParameter_ReferencePaths();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferenceRef <em>Reference Ref</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Reference Ref</em>'.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferenceRef()
-	 * @see #getEntityMockEntityFunctionParameter()
-	 * @generated
-	 */
-	EReference getEntityMockEntityFunctionParameter_ReferenceRef();
+	EReference getEntityMockEntityFunctionParameter_NestedAttribute();
 
 	/**
 	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.entitymock.EDateStepType <em>EDate Step Type</em>}'.
@@ -5525,6 +5576,14 @@
 		EClass ENTITY_MOCK_MODEL = eINSTANCE.getEntityMockModel();
 
 		/**
+		 * The meta object literal for the '<em><b>Import Section</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENTITY_MOCK_MODEL__IMPORT_SECTION = eINSTANCE.getEntityMockModel_ImportSection();
+
+		/**
 		 * The meta object literal for the '<em><b>Packages</b></em>' containment reference list feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -5533,6 +5592,24 @@
 		EReference ENTITY_MOCK_MODEL__PACKAGES = eINSTANCE.getEntityMockModel_Packages();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
+		 * @generated
+		 */
+		EClass ENTITY_MOCK_LAZY_RESOLVER = eINSTANCE.getEntityMockLazyResolver();
+
+		/**
+		 * The meta object literal for the '<em><b>EResolve Proxy</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = eINSTANCE.getEntityMockLazyResolver__EResolveProxy__InternalEObject();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl <em>Entity Mock Package</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -5543,12 +5620,54 @@
 		EClass ENTITY_MOCK_PACKAGE = eINSTANCE.getEntityMockPackage();
 
 		/**
+		 * The meta object literal for the '<em><b>Mocks</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENTITY_MOCK_PACKAGE__MOCKS = eINSTANCE.getEntityMockPackage_Mocks();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl <em>Entity Mock</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMock()
+		 * @generated
+		 */
+		EClass ENTITY_MOCK = eINSTANCE.getEntityMock();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ENTITY_MOCK__NAME = eINSTANCE.getEntityMock_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ENTITY_MOCK__DESCRIPTION = eINSTANCE.getEntityMock_Description();
+
+		/**
+		 * The meta object literal for the '<em><b>Description Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ENTITY_MOCK__DESCRIPTION_VALUE = eINSTANCE.getEntityMock_DescriptionValue();
+
+		/**
 		 * The meta object literal for the '<em><b>Run Priority</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute ENTITY_MOCK_PACKAGE__RUN_PRIORITY = eINSTANCE.getEntityMockPackage_RunPriority();
+		EAttribute ENTITY_MOCK__RUN_PRIORITY = eINSTANCE.getEntityMock_RunPriority();
 
 		/**
 		 * The meta object literal for the '<em><b>Datainterchanges</b></em>' containment reference feature.
@@ -5556,7 +5675,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_PACKAGE__DATAINTERCHANGES = eINSTANCE.getEntityMockPackage_Datainterchanges();
+		EReference ENTITY_MOCK__DATAINTERCHANGES = eINSTANCE.getEntityMock_Datainterchanges();
 
 		/**
 		 * The meta object literal for the '<em><b>Resources</b></em>' containment reference feature.
@@ -5564,7 +5683,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_PACKAGE__RESOURCES = eINSTANCE.getEntityMockPackage_Resources();
+		EReference ENTITY_MOCK__RESOURCES = eINSTANCE.getEntityMock_Resources();
 
 		/**
 		 * The meta object literal for the '<em><b>Objects</b></em>' containment reference feature.
@@ -5572,15 +5691,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_PACKAGE__OBJECTS = eINSTANCE.getEntityMockPackage_Objects();
-
-		/**
-		 * The meta object literal for the '<em><b>Datatypes</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY_MOCK_PACKAGE__DATATYPES = eINSTANCE.getEntityMockPackage_Datatypes();
+		EReference ENTITY_MOCK__OBJECTS = eINSTANCE.getEntityMock_Objects();
 
 		/**
 		 * The meta object literal for the '<em><b>Entities</b></em>' containment reference feature.
@@ -5588,7 +5699,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_PACKAGE__ENTITIES = eINSTANCE.getEntityMockPackage_Entities();
+		EReference ENTITY_MOCK__ENTITIES = eINSTANCE.getEntityMock_Entities();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl <em>Running Data Interchanges</em>}' class.
@@ -5635,24 +5746,6 @@
 		EAttribute RUNNING_DATA_INTERCHANGE__FILE_URL = eINSTANCE.getRunningDataInterchange_FileURL();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
-		 * @generated
-		 */
-		EClass ENTITY_MOCK_LAZY_RESOLVER = eINSTANCE.getEntityMockLazyResolver();
-
-		/**
-		 * The meta object literal for the '<em><b>EResolve Proxy</b></em>' operation.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EOperation ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = eINSTANCE.getEntityMockLazyResolver__EResolveProxy__InternalEObject();
-
-		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl <em>Entity Mock Resources</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -6503,42 +6596,6 @@
 		EAttribute PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM__ITEMS = eINSTANCE.getPropertyFillerUnsignedIntegerRandom_Items();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypesImpl <em>Entity Mock Data Types</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypesImpl
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockDataTypes()
-		 * @generated
-		 */
-		EClass ENTITY_MOCK_DATA_TYPES = eINSTANCE.getEntityMockDataTypes();
-
-		/**
-		 * The meta object literal for the '<em><b>Datatypes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY_MOCK_DATA_TYPES__DATATYPES = eINSTANCE.getEntityMockDataTypes_Datatypes();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypeImpl <em>Entity Mock Data Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDataTypeImpl
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockDataType()
-		 * @generated
-		 */
-		EClass ENTITY_MOCK_DATA_TYPE = eINSTANCE.getEntityMockDataType();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ENTITY_MOCK_DATA_TYPE__NAME = eINSTANCE.getEntityMockDataType_Name();
-
-		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl <em>Entity Mock Entities</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -6615,12 +6672,12 @@
 		EReference ENTITY_MOCK_ENTITY__ITERATOR = eINSTANCE.getEntityMockEntity_Iterator();
 
 		/**
-		 * The meta object literal for the '<em><b>Temporaries</b></em>' containment reference list feature.
+		 * The meta object literal for the '<em><b>Templates</b></em>' containment reference list feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_ENTITY__TEMPORARIES = eINSTANCE.getEntityMockEntity_Temporaries();
+		EReference ENTITY_MOCK_ENTITY__TEMPLATES = eINSTANCE.getEntityMockEntity_Templates();
 
 		/**
 		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
@@ -6849,14 +6906,14 @@
 		EReference ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockByResourceAttribute_ResourceAttribute();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemporaryImpl <em>Entity Mock Temporary</em>}' class.
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl <em>Entity Mock Template</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemporaryImpl
-		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemporary()
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemplate()
 		 * @generated
 		 */
-		EClass ENTITY_MOCK_TEMPORARY = eINSTANCE.getEntityMockTemporary();
+		EClass ENTITY_MOCK_TEMPLATE = eINSTANCE.getEntityMockTemplate();
 
 		/**
 		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
@@ -6864,7 +6921,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute ENTITY_MOCK_TEMPORARY__NAME = eINSTANCE.getEntityMockTemporary_Name();
+		EAttribute ENTITY_MOCK_TEMPLATE__NAME = eINSTANCE.getEntityMockTemplate_Name();
 
 		/**
 		 * The meta object literal for the '<em><b>Object</b></em>' reference feature.
@@ -6872,7 +6929,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_TEMPORARY__OBJECT = eINSTANCE.getEntityMockTemporary_Object();
+		EReference ENTITY_MOCK_TEMPLATE__OBJECT = eINSTANCE.getEntityMockTemplate_Object();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectUsableImpl <em>IEntity Mock Object Usable</em>}' class.
@@ -6915,12 +6972,12 @@
 		EClass ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE = eINSTANCE.getEntityMockReferencedObjectAttribute();
 
 		/**
-		 * The meta object literal for the '<em><b>Temporary</b></em>' reference feature.
+		 * The meta object literal for the '<em><b>Template</b></em>' reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY = eINSTANCE.getEntityMockReferencedObjectAttribute_Temporary();
+		EReference ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE = eINSTANCE.getEntityMockReferencedObjectAttribute_Template();
 
 		/**
 		 * The meta object literal for the '<em><b>Embedded</b></em>' reference list feature.
@@ -7075,6 +7132,32 @@
 		EReference ENTITY_MOCK_ENTITY_FUNCTION__BODY = eINSTANCE.getEntityMockEntityFunction_Body();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl <em>Entity Mock Entity Nested Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl
+		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityNestedAttribute()
+		 * @generated
+		 */
+		EClass ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE = eINSTANCE.getEntityMockEntityNestedAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Reference</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE = eINSTANCE.getEntityMockEntityNestedAttribute_Reference();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getEntityMockEntityNestedAttribute_Attribute();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl <em>Entity Mock Entity Function Parameter</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -7093,20 +7176,12 @@
 		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF = eINSTANCE.getEntityMockEntityFunctionParameter_AttributeRef();
 
 		/**
-		 * The meta object literal for the '<em><b>Reference Paths</b></em>' reference list feature.
+		 * The meta object literal for the '<em><b>Nested Attribute</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS = eINSTANCE.getEntityMockEntityFunctionParameter_ReferencePaths();
-
-		/**
-		 * The meta object literal for the '<em><b>Reference Ref</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF = eINSTANCE.getEntityMockEntityFunctionParameter_ReferenceRef();
+		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE = eINSTANCE.getEntityMockEntityFunctionParameter_NestedAttribute();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.EDateStepType <em>EDate Step Type</em>}' enum.
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntities.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntities.java
index 000e26d..dee510a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntities.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntities.java
@@ -24,10 +24,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntities#getEntities <em>Entities</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntities()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntity.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntity.java
index 5b5be22..8f50a57 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntity.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntity.java
@@ -25,6 +25,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getEntityRef <em>Entity Ref</em>}</li>
@@ -32,14 +33,13 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getMaxRows <em>Max Rows</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterate <em>Iterate</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterator <em>Iterator</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemporaries <em>Temporaries</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemplates <em>Templates</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getCalculations <em>Calculations</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResource <em>By Resource</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResourceAttributes <em>By Resource Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#isCreateBlobMapping <em>Create Blob Mapping</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntity()
  * @model
@@ -203,20 +203,20 @@
 	void setIterator(LEntityAttribute value);
 
 	/**
-	 * Returns the value of the '<em><b>Temporaries</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.osbp.xtext.entitymock.EntityMockTemporary}.
+	 * Returns the value of the '<em><b>Templates</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate}.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Temporaries</em>' containment reference list isn't clear,
+	 * If the meaning of the '<em>Templates</em>' containment reference list isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Temporaries</em>' containment reference list.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntity_Temporaries()
+	 * @return the value of the '<em>Templates</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntity_Templates()
 	 * @model containment="true"
 	 * @generated
 	 */
-	EList<EntityMockTemporary> getTemporaries();
+	EList<EntityMockTemplate> getTemplates();
 
 	/**
 	 * Returns the value of the '<em><b>Attributes</b></em>' containment reference list.
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunction.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunction.java
index 3a818eb..7a81ef6 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunction.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunction.java
@@ -26,12 +26,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getParams <em>Params</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getBody <em>Body</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunction()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunctionParameter.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunctionParameter.java
index d92718e..2adb10e 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunctionParameter.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityFunctionParameter.java
@@ -13,12 +13,9 @@
  */
 package org.eclipse.osbp.xtext.entitymock;
 
-import org.eclipse.emf.common.util.EList;
-
 import org.eclipse.emf.ecore.EObject;
 
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
-import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
 
 /**
  * <!-- begin-user-doc -->
@@ -27,12 +24,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getAttributeRef <em>Attribute Ref</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferencePaths <em>Reference Paths</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferenceRef <em>Reference Ref</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute <em>Nested Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunctionParameter()
  * @model
@@ -66,45 +62,29 @@
 	void setAttributeRef(LEntityAttribute value);
 
 	/**
-	 * Returns the value of the '<em><b>Reference Paths</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.osbp.dsl.semantic.entity.LEntityReference}.
+	 * Returns the value of the '<em><b>Nested Attribute</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Reference Paths</em>' reference list isn't clear,
+	 * If the meaning of the '<em>Nested Attribute</em>' containment reference isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reference Paths</em>' reference list.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunctionParameter_ReferencePaths()
-	 * @model
+	 * @return the value of the '<em>Nested Attribute</em>' containment reference.
+	 * @see #setNestedAttribute(EntityMockEntityNestedAttribute)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunctionParameter_NestedAttribute()
+	 * @model containment="true"
 	 * @generated
 	 */
-	EList<LEntityReference> getReferencePaths();
+	EntityMockEntityNestedAttribute getNestedAttribute();
 
 	/**
-	 * Returns the value of the '<em><b>Reference Ref</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference Ref</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reference Ref</em>' reference.
-	 * @see #setReferenceRef(LEntityAttribute)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityFunctionParameter_ReferenceRef()
-	 * @model
-	 * @generated
-	 */
-	LEntityAttribute getReferenceRef();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getReferenceRef <em>Reference Ref</em>}' reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute <em>Nested Attribute</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Reference Ref</em>' reference.
-	 * @see #getReferenceRef()
+	 * @param value the new value of the '<em>Nested Attribute</em>' containment reference.
+	 * @see #getNestedAttribute()
 	 * @generated
 	 */
-	void setReferenceRef(LEntityAttribute value);
+	void setNestedAttribute(EntityMockEntityNestedAttribute value);
 
 } // EntityMockEntityFunctionParameter
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityNestedAttribute.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityNestedAttribute.java
new file mode 100644
index 0000000..81642b1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockEntityNestedAttribute.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Entity Mock Entity Nested Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference <em>Reference</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityNestedAttribute()
+ * @model
+ * @generated
+ */
+public interface EntityMockEntityNestedAttribute extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Reference</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Reference</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Reference</em>' reference.
+	 * @see #setReference(LEntityReference)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityNestedAttribute_Reference()
+	 * @model
+	 * @generated
+	 */
+	LEntityReference getReference();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference <em>Reference</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Reference</em>' reference.
+	 * @see #getReference()
+	 * @generated
+	 */
+	void setReference(LEntityReference value);
+
+	/**
+	 * Returns the value of the '<em><b>Attribute</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute</em>' reference.
+	 * @see #setAttribute(LEntityAttribute)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockEntityNestedAttribute_Attribute()
+	 * @model
+	 * @generated
+	 */
+	LEntityAttribute getAttribute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Attribute</em>' reference.
+	 * @see #getAttribute()
+	 * @generated
+	 */
+	void setAttribute(LEntityAttribute value);
+
+} // EntityMockEntityNestedAttribute
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockLazyResolver.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockLazyResolver.java
index cbee694..cdeb00e 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockLazyResolver.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockLazyResolver.java
@@ -31,7 +31,7 @@
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @model unique="false" proxyDataType="org.eclipse.osbp.xtext.entitymock.InternalEObject" proxyUnique="false"
-	 *        annotation="http://www.eclipse.org/emf/2002/GenModel body='<%org.eclipse.emf.ecore.resource.Resource%> _eResource = this.eResource();\n<%org.eclipse.emf.ecore.resource.ResourceSet%> _resourceSet = _eResource.getResourceSet();\nreturn <%org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3%>.resolve(proxy, _resourceSet);'"
+	 *        annotation="http://www.eclipse.org/emf/2002/GenModel body='return <%org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3%>.resolve(proxy, this.eResource().getResourceSet());'"
 	 * @generated
 	 */
 	EObject eResolveProxy(InternalEObject proxy);
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockModel.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockModel.java
index f1286eb..2354f7c 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockModel.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockModel.java
@@ -17,6 +17,8 @@
 
 import org.eclipse.emf.ecore.EObject;
 
+import org.eclipse.xtext.xtype.XImportSection;
+
 /**
  * <!-- begin-user-doc -->
  * A representation of the model object '<em><b>Entity Mock Model</b></em>'.
@@ -24,10 +26,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection <em>Import Section</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getPackages <em>Packages</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockModel()
  * @model
@@ -35,6 +38,32 @@
  */
 public interface EntityMockModel extends EObject {
 	/**
+	 * Returns the value of the '<em><b>Import Section</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Import Section</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Import Section</em>' containment reference.
+	 * @see #setImportSection(XImportSection)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockModel_ImportSection()
+	 * @model containment="true"
+	 * @generated
+	 */
+	XImportSection getImportSection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection <em>Import Section</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Import Section</em>' containment reference.
+	 * @see #getImportSection()
+	 * @generated
+	 */
+	void setImportSection(XImportSection value);
+
+	/**
 	 * Returns the value of the '<em><b>Packages</b></em>' containment reference list.
 	 * The list contents are of type {@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage}.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObject.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObject.java
index 535b36c..2ac615f 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObject.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObject.java
@@ -24,13 +24,13 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getEnumerations <em>Enumerations</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getCalculations <em>Calculations</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObject()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectArrayValue.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectArrayValue.java
index eaa89f6..89dfb50 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectArrayValue.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectArrayValue.java
@@ -22,11 +22,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getEnumeration <em>Enumeration</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectArrayValue()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEmbed.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEmbed.java
index ab031c8..d8fe8ab 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEmbed.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEmbed.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed#getObject <em>Object</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectEmbed()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEnum.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEnum.java
index 8231fb6..3996e8b 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEnum.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectEnum.java
@@ -22,11 +22,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getUsingResource <em>Using Resource</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectEnum()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFill.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFill.java
index 482fe49..e672f15 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFill.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFill.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill#getFillerType <em>Filler Type</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectFill()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunction.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunction.java
index a668087..df2c8c6 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunction.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunction.java
@@ -26,12 +26,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getOftype <em>Oftype</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getParams <em>Params</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getBody <em>Body</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectFunction()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunctionParameter.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunctionParameter.java
index 9797ebb..dfd295b 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunctionParameter.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectFunctionParameter.java
@@ -24,11 +24,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getParameterType <em>Parameter Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectFunctionParameter()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectItemValue.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectItemValue.java
index 0400378..e0444aa 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectItemValue.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectItemValue.java
@@ -26,11 +26,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getDatarow <em>Datarow</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectItemValue()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectPlainValue.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectPlainValue.java
index 78a3cde..f0efee5 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectPlainValue.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectPlainValue.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectPlainValue()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectResourceValue.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectResourceValue.java
index d65b3cf..c3bf807 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectResourceValue.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjectResourceValue.java
@@ -21,11 +21,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceEnum <em>Resource Enum</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjectResourceValue()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjects.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjects.java
index 9c49ca7..98ed70a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjects.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockObjects.java
@@ -24,10 +24,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjects#getObjects <em>Objects</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockObjects()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockPackage.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockPackage.java
index 4bacbb5..79240c9 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockPackage.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockPackage.java
@@ -13,6 +13,8 @@
  */
 package org.eclipse.osbp.xtext.entitymock;
 
+import org.eclipse.emf.common.util.EList;
+
 import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
 
 /**
@@ -22,15 +24,10 @@
  *
  * <p>
  * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getRunPriority <em>Run Priority</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatainterchanges <em>Datainterchanges</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getObjects <em>Objects</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatatypes <em>Datatypes</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getEntities <em>Entities</em>}</li>
- * </ul>
  * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getMocks <em>Mocks</em>}</li>
+ * </ul>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage()
  * @model
@@ -38,159 +35,19 @@
  */
 public interface EntityMockPackage extends LPackage {
 	/**
-	 * Returns the value of the '<em><b>Run Priority</b></em>' attribute.
+	 * Returns the value of the '<em><b>Mocks</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.osbp.xtext.entitymock.EntityMock}.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Run Priority</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Mocks</em>' containment reference list isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Run Priority</em>' attribute.
-	 * @see #setRunPriority(int)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_RunPriority()
-	 * @model unique="false"
-	 * @generated
-	 */
-	int getRunPriority();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getRunPriority <em>Run Priority</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Run Priority</em>' attribute.
-	 * @see #getRunPriority()
-	 * @generated
-	 */
-	void setRunPriority(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Datainterchanges</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Datainterchanges</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Datainterchanges</em>' containment reference.
-	 * @see #setDatainterchanges(RunningDataInterchanges)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Datainterchanges()
+	 * @return the value of the '<em>Mocks</em>' containment reference list.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Mocks()
 	 * @model containment="true"
 	 * @generated
 	 */
-	RunningDataInterchanges getDatainterchanges();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatainterchanges <em>Datainterchanges</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Datainterchanges</em>' containment reference.
-	 * @see #getDatainterchanges()
-	 * @generated
-	 */
-	void setDatainterchanges(RunningDataInterchanges value);
-
-	/**
-	 * Returns the value of the '<em><b>Resources</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resources</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resources</em>' containment reference.
-	 * @see #setResources(EntityMockResources)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Resources()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EntityMockResources getResources();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getResources <em>Resources</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resources</em>' containment reference.
-	 * @see #getResources()
-	 * @generated
-	 */
-	void setResources(EntityMockResources value);
-
-	/**
-	 * Returns the value of the '<em><b>Objects</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Objects</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Objects</em>' containment reference.
-	 * @see #setObjects(EntityMockObjects)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Objects()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EntityMockObjects getObjects();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getObjects <em>Objects</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Objects</em>' containment reference.
-	 * @see #getObjects()
-	 * @generated
-	 */
-	void setObjects(EntityMockObjects value);
-
-	/**
-	 * Returns the value of the '<em><b>Datatypes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Datatypes</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Datatypes</em>' containment reference.
-	 * @see #setDatatypes(EntityMockDataTypes)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Datatypes()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EntityMockDataTypes getDatatypes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getDatatypes <em>Datatypes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Datatypes</em>' containment reference.
-	 * @see #getDatatypes()
-	 * @generated
-	 */
-	void setDatatypes(EntityMockDataTypes value);
-
-	/**
-	 * Returns the value of the '<em><b>Entities</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Entities</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Entities</em>' containment reference.
-	 * @see #setEntities(EntityMockEntities)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockPackage_Entities()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EntityMockEntities getEntities();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getEntities <em>Entities</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Entities</em>' containment reference.
-	 * @see #getEntities()
-	 * @generated
-	 */
-	void setEntities(EntityMockEntities value);
+	EList<EntityMock> getMocks();
 
 } // EntityMockPackage
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockReferencedObjectAttribute.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockReferencedObjectAttribute.java
index ea25aa0..ea23a26 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockReferencedObjectAttribute.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockReferencedObjectAttribute.java
@@ -22,12 +22,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemporary <em>Temporary</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate <em>Template</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getEmbedded <em>Embedded</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getAttribute <em>Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockReferencedObjectAttribute()
  * @model
@@ -35,30 +35,30 @@
  */
 public interface EntityMockReferencedObjectAttribute extends EntityMockLazyResolver {
 	/**
-	 * Returns the value of the '<em><b>Temporary</b></em>' reference.
+	 * Returns the value of the '<em><b>Template</b></em>' reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Temporary</em>' reference isn't clear,
+	 * If the meaning of the '<em>Template</em>' reference isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Temporary</em>' reference.
-	 * @see #setTemporary(EntityMockTemporary)
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockReferencedObjectAttribute_Temporary()
+	 * @return the value of the '<em>Template</em>' reference.
+	 * @see #setTemplate(EntityMockTemplate)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockReferencedObjectAttribute_Template()
 	 * @model
 	 * @generated
 	 */
-	EntityMockTemporary getTemporary();
+	EntityMockTemplate getTemplate();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemporary <em>Temporary</em>}' reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate <em>Template</em>}' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Temporary</em>' reference.
-	 * @see #getTemporary()
+	 * @param value the new value of the '<em>Template</em>' reference.
+	 * @see #getTemplate()
 	 * @generated
 	 */
-	void setTemporary(EntityMockTemporary value);
+	void setTemplate(EntityMockTemplate value);
 
 	/**
 	 * Returns the value of the '<em><b>Embedded</b></em>' reference list.
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResource.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResource.java
index 21385b1..da47bbf 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResource.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResource.java
@@ -24,11 +24,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockResource#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockResource#getDatarows <em>Datarows</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockResource()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResourceDataRow.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResourceDataRow.java
index a902b1b..57def7c 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResourceDataRow.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResourceDataRow.java
@@ -24,10 +24,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockResourceDataRow()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResources.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResources.java
index cfd027e..8cb53f8 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResources.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockResources.java
@@ -24,10 +24,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockResources#getResources <em>Resources</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockResources()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockTemplate.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockTemplate.java
new file mode 100644
index 0000000..61fa7d7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/EntityMockTemplate.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Entity Mock Template</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject <em>Object</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockTemplate()
+ * @model
+ * @generated
+ */
+public interface EntityMockTemplate extends EntityMockLazyResolver {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockTemplate_Name()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Object</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Object</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Object</em>' reference.
+	 * @see #setObject(EntityMockObject)
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getEntityMockTemplate_Object()
+	 * @model
+	 * @generated
+	 */
+	EntityMockObject getObject();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject <em>Object</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Object</em>' reference.
+	 * @see #getObject()
+	 * @generated
+	 */
+	void setObject(EntityMockObject value);
+
+} // EntityMockTemplate
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IEntityMockObjectAttribute.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IEntityMockObjectAttribute.java
index 3f550ea..1a6e872 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IEntityMockObjectAttribute.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IEntityMockObjectAttribute.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getIEntityMockObjectAttribute()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IntegerIterate.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IntegerIterate.java
index 2d992cd..16e40b2 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IntegerIterate.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/IntegerIterate.java
@@ -21,12 +21,12 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getFrom <em>From</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getUntil <em>Until</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getStep <em>Step</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getIntegerIterate()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateFuture.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateFuture.java
index c4969bf..c09903f 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateFuture.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateFuture.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture#getDateFutureYears <em>Date Future Years</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerDateFuture()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDatePast.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDatePast.java
index d8c4bed..3c64192 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDatePast.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDatePast.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast#getDatePastYears <em>Date Past Years</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerDatePast()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateRange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateRange.java
index aabff41..b9ad20e 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateRange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerDateRange.java
@@ -21,11 +21,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateBeginYears <em>Date Begin Years</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateEndYears <em>Date End Years</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerDateRange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRandom.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRandom.java
index 54cc92b..2c6686a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRandom.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRandom.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerSignedDoubleRandom()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRange.java
index 9e330f7..0b0e43a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedDoubleRange.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getDecimals <em>Decimals</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getBeginRange <em>Begin Range</em>}</li>
@@ -30,7 +31,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerSignedDoubleRange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRandom.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRandom.java
index 4c0ffbb..d15e74a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRandom.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRandom.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerSignedIntegerRandom()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRange.java
index 7284cd4..5d320fc 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerSignedIntegerRange.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getBeginRange <em>Begin Range</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRange <em>End Range</em>}</li>
@@ -29,7 +30,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerSignedIntegerRange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextParagraphs.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextParagraphs.java
index 10469dc..9bfb066 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextParagraphs.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextParagraphs.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerTextParagraphs()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextRandom.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextRandom.java
index 2c9fcf6..847130c 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextRandom.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextRandom.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerTextRandom()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextSentences.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextSentences.java
index 81428a8..7c07b49 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextSentences.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextSentences.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerTextSentences()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextWords.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextWords.java
index da8f76d..b443545 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextWords.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerTextWords.java
@@ -21,10 +21,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerTextWords()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRandom.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRandom.java
index d0a3939..659c54f 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRandom.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRandom.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerUnsignedDoubleRandom()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRange.java
index b26b415..6457457 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedDoubleRange.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getDecimals <em>Decimals</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getBeginRange <em>Begin Range</em>}</li>
@@ -30,7 +31,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerUnsignedDoubleRange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRandom.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRandom.java
index 2329309..9bf36d4 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRandom.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRandom.java
@@ -22,10 +22,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerUnsignedIntegerRandom()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRange.java
index 0cd0e86..d8f86d9 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/PropertyFillerUnsignedIntegerRange.java
@@ -22,6 +22,7 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getBeginRange <em>Begin Range</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRange <em>End Range</em>}</li>
@@ -29,7 +30,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getPropertyFillerUnsignedIntegerRange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchange.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchange.java
index 3e2a8d2..816d693 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchange.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchange.java
@@ -24,11 +24,11 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getDatainterchangeRef <em>Datainterchange Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getFileURL <em>File URL</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getRunningDataInterchange()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchanges.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchanges.java
index 0aeacd8..854e3b5 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchanges.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/RunningDataInterchanges.java
@@ -24,10 +24,10 @@
  *
  * <p>
  * The following features are supported:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges#getDatainterchanges <em>Datainterchanges</em>}</li>
  * </ul>
- * </p>
  *
  * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage#getRunningDataInterchanges()
  * @model
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateImpl.java
index fcb8289..8fc689a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateImpl.java
@@ -30,6 +30,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl#isYesterday <em>Yesterday</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl#isToday <em>Today</em>}</li>
@@ -40,7 +41,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl#getMonth <em>Month</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl#getDay <em>Day</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateIterateImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateIterateImpl.java
index 1e761d7..e9f71e7 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateIterateImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/DateIterateImpl.java
@@ -32,13 +32,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl#getFrom <em>From</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl#getUntil <em>Until</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl#getStepCount <em>Step Count</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl#getStepType <em>Step Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByObjectImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByObjectImpl.java
index 791e292..251b9f1 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByObjectImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByObjectImpl.java
@@ -35,13 +35,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl#getReference <em>Reference</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl#getResourceEnum <em>Resource Enum</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByReferenceImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByReferenceImpl.java
index 432b69f..6c2e0e3 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByReferenceImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeByReferenceImpl.java
@@ -32,12 +32,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl#getMockedEntity <em>Mocked Entity</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl#getOptionalFor <em>Optional For</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeFillerImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeFillerImpl.java
index 75d0701..54229e8 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeFillerImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockAttributeFillerImpl.java
@@ -33,11 +33,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl#getFillerType <em>Filler Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockByResourceAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockByResourceAttributeImpl.java
index 7ec3015..646dec9 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockByResourceAttributeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockByResourceAttributeImpl.java
@@ -33,11 +33,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLFactoryImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLFactoryImpl.java
index d15db23..98fa893 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLFactoryImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLFactoryImpl.java
@@ -70,10 +70,11 @@
 	public EObject create(EClass eClass) {
 		switch (eClass.getClassifierID()) {
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL: return createEntityMockModel();
+			case EntityMockDSLPackage.ENTITY_MOCK_LAZY_RESOLVER: return createEntityMockLazyResolver();
 			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE: return createEntityMockPackage();
+			case EntityMockDSLPackage.ENTITY_MOCK: return createEntityMock();
 			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGES: return createRunningDataInterchanges();
 			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE: return createRunningDataInterchange();
-			case EntityMockDSLPackage.ENTITY_MOCK_LAZY_RESOLVER: return createEntityMockLazyResolver();
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCES: return createEntityMockResources();
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE: return createEntityMockResource();
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE_ATTRIBUTE: return createEntityMockResourceAttribute();
@@ -111,8 +112,6 @@
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM: return createPropertyFillerUnsignedDoubleRandom();
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE: return createPropertyFillerUnsignedIntegerRange();
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM: return createPropertyFillerUnsignedIntegerRandom();
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPES: return createEntityMockDataTypes();
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPE: return createEntityMockDataType();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITIES: return createEntityMockEntities();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY: return createEntityMockEntity();
 			case EntityMockDSLPackage.IITERATE: return createIIterate();
@@ -120,7 +119,7 @@
 			case EntityMockDSLPackage.DATE_ITERATE: return createDateIterate();
 			case EntityMockDSLPackage.DATE: return createDate();
 			case EntityMockDSLPackage.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE: return createEntityMockByResourceAttribute();
-			case EntityMockDSLPackage.ENTITY_MOCK_TEMPORARY: return createEntityMockTemporary();
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE: return createEntityMockTemplate();
 			case EntityMockDSLPackage.IENTITY_MOCK_OBJECT_USABLE: return createIEntityMockObjectUsable();
 			case EntityMockDSLPackage.IENTITY_MOCK_ENTITY_USABLE: return createIEntityMockEntityUsable();
 			case EntityMockDSLPackage.IENTITY_MOCK_ATTRIBUTE: return createIEntityMockAttribute();
@@ -129,6 +128,7 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_FILLER: return createEntityMockAttributeFiller();
 			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE: return createEntityMockAttributeByReference();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION: return createEntityMockEntityFunction();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE: return createEntityMockEntityNestedAttribute();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER: return createEntityMockEntityFunctionParameter();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
@@ -184,6 +184,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EntityMockLazyResolver createEntityMockLazyResolver() {
+		EntityMockLazyResolverImpl entityMockLazyResolver = new EntityMockLazyResolverImpl();
+		return entityMockLazyResolver;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EntityMockPackage createEntityMockPackage() {
 		EntityMockPackageImpl entityMockPackage = new EntityMockPackageImpl();
 		return entityMockPackage;
@@ -194,6 +204,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EntityMock createEntityMock() {
+		EntityMockImpl entityMock = new EntityMockImpl();
+		return entityMock;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public RunningDataInterchanges createRunningDataInterchanges() {
 		RunningDataInterchangesImpl runningDataInterchanges = new RunningDataInterchangesImpl();
 		return runningDataInterchanges;
@@ -214,16 +234,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EntityMockLazyResolver createEntityMockLazyResolver() {
-		EntityMockLazyResolverImpl entityMockLazyResolver = new EntityMockLazyResolverImpl();
-		return entityMockLazyResolver;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EntityMockResources createEntityMockResources() {
 		EntityMockResourcesImpl entityMockResources = new EntityMockResourcesImpl();
 		return entityMockResources;
@@ -594,26 +604,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EntityMockDataTypes createEntityMockDataTypes() {
-		EntityMockDataTypesImpl entityMockDataTypes = new EntityMockDataTypesImpl();
-		return entityMockDataTypes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityMockDataType createEntityMockDataType() {
-		EntityMockDataTypeImpl entityMockDataType = new EntityMockDataTypeImpl();
-		return entityMockDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EntityMockEntities createEntityMockEntities() {
 		EntityMockEntitiesImpl entityMockEntities = new EntityMockEntitiesImpl();
 		return entityMockEntities;
@@ -684,9 +674,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EntityMockTemporary createEntityMockTemporary() {
-		EntityMockTemporaryImpl entityMockTemporary = new EntityMockTemporaryImpl();
-		return entityMockTemporary;
+	public EntityMockTemplate createEntityMockTemplate() {
+		EntityMockTemplateImpl entityMockTemplate = new EntityMockTemplateImpl();
+		return entityMockTemplate;
 	}
 
 	/**
@@ -774,6 +764,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EntityMockEntityNestedAttribute createEntityMockEntityNestedAttribute() {
+		EntityMockEntityNestedAttributeImpl entityMockEntityNestedAttribute = new EntityMockEntityNestedAttributeImpl();
+		return entityMockEntityNestedAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EntityMockEntityFunctionParameter createEntityMockEntityFunctionParameter() {
 		EntityMockEntityFunctionParameterImpl entityMockEntityFunctionParameter = new EntityMockEntityFunctionParameterImpl();
 		return entityMockEntityFunctionParameter;
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLPackageImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLPackageImpl.java
index c9c5c21..89d68f4 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLPackageImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockDSLPackageImpl.java
@@ -34,18 +34,18 @@
 import org.eclipse.osbp.xtext.entitymock.Date;
 import org.eclipse.osbp.xtext.entitymock.DateIterate;
 import org.eclipse.osbp.xtext.entitymock.EDateStepType;
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
 import org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLFactory;
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
-import org.eclipse.osbp.xtext.entitymock.EntityMockDataType;
-import org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver;
 import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
@@ -65,7 +65,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockEntityUsable;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
@@ -100,6 +100,8 @@
 
 import org.eclipse.xtext.xbase.XbasePackage;
 
+import org.eclipse.xtext.xtype.XtypePackage;
+
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model <b>Package</b>.
@@ -119,6 +121,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass entityMockLazyResolverEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass entityMockPackageEClass = null;
 
 	/**
@@ -126,6 +135,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass entityMockEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass runningDataInterchangesEClass = null;
 
 	/**
@@ -140,13 +156,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EClass entityMockLazyResolverEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	private EClass entityMockResourcesEClass = null;
 
 	/**
@@ -406,20 +415,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EClass entityMockDataTypesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass entityMockDataTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	private EClass entityMockEntitiesEClass = null;
 
 	/**
@@ -469,7 +464,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EClass entityMockTemporaryEClass = null;
+	private EClass entityMockTemplateEClass = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -532,6 +527,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass entityMockEntityNestedAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass entityMockEntityFunctionParameterEClass = null;
 
 	/**
@@ -626,7 +628,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockModel_Packages() {
+	public EReference getEntityMockModel_ImportSection() {
 		return (EReference)entityMockModelEClass.getEStructuralFeatures().get(0);
 	}
 
@@ -635,6 +637,33 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EReference getEntityMockModel_Packages() {
+		return (EReference)entityMockModelEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEntityMockLazyResolver() {
+		return entityMockLazyResolverEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject() {
+		return entityMockLazyResolverEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getEntityMockPackage() {
 		return entityMockPackageEClass;
 	}
@@ -644,8 +673,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getEntityMockPackage_RunPriority() {
-		return (EAttribute)entityMockPackageEClass.getEStructuralFeatures().get(0);
+	public EReference getEntityMockPackage_Mocks() {
+		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(0);
 	}
 
 	/**
@@ -653,8 +682,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockPackage_Datainterchanges() {
-		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(1);
+	public EClass getEntityMock() {
+		return entityMockEClass;
 	}
 
 	/**
@@ -662,8 +691,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockPackage_Resources() {
-		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(2);
+	public EAttribute getEntityMock_Name() {
+		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(0);
 	}
 
 	/**
@@ -671,8 +700,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockPackage_Objects() {
-		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(3);
+	public EAttribute getEntityMock_Description() {
+		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -680,8 +709,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockPackage_Datatypes() {
-		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(4);
+	public EAttribute getEntityMock_DescriptionValue() {
+		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(2);
 	}
 
 	/**
@@ -689,8 +718,44 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockPackage_Entities() {
-		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(5);
+	public EAttribute getEntityMock_RunPriority() {
+		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMock_Datainterchanges() {
+		return (EReference)entityMockEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMock_Resources() {
+		return (EReference)entityMockEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMock_Objects() {
+		return (EReference)entityMockEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMock_Entities() {
+		return (EReference)entityMockEClass.getEStructuralFeatures().get(7);
 	}
 
 	/**
@@ -743,24 +808,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EClass getEntityMockLazyResolver() {
-		return entityMockLazyResolverEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject() {
-		return entityMockLazyResolverEClass.getEOperations().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EClass getEntityMockResources() {
 		return entityMockResourcesEClass;
 	}
@@ -1634,42 +1681,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EClass getEntityMockDataTypes() {
-		return entityMockDataTypesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEntityMockDataTypes_Datatypes() {
-		return (EReference)entityMockDataTypesEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEntityMockDataType() {
-		return entityMockDataTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEntityMockDataType_Name() {
-		return (EAttribute)entityMockDataTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EClass getEntityMockEntities() {
 		return entityMockEntitiesEClass;
 	}
@@ -1751,7 +1762,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockEntity_Temporaries() {
+	public EReference getEntityMockEntity_Templates() {
 		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(6);
 	}
 
@@ -2003,8 +2014,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EClass getEntityMockTemporary() {
-		return entityMockTemporaryEClass;
+	public EClass getEntityMockTemplate() {
+		return entityMockTemplateEClass;
 	}
 
 	/**
@@ -2012,8 +2023,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getEntityMockTemporary_Name() {
-		return (EAttribute)entityMockTemporaryEClass.getEStructuralFeatures().get(0);
+	public EAttribute getEntityMockTemplate_Name() {
+		return (EAttribute)entityMockTemplateEClass.getEStructuralFeatures().get(0);
 	}
 
 	/**
@@ -2021,8 +2032,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockTemporary_Object() {
-		return (EReference)entityMockTemporaryEClass.getEStructuralFeatures().get(1);
+	public EReference getEntityMockTemplate_Object() {
+		return (EReference)entityMockTemplateEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -2066,7 +2077,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockReferencedObjectAttribute_Temporary() {
+	public EReference getEntityMockReferencedObjectAttribute_Template() {
 		return (EReference)entityMockReferencedObjectAttributeEClass.getEStructuralFeatures().get(0);
 	}
 
@@ -2237,6 +2248,33 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EClass getEntityMockEntityNestedAttribute() {
+		return entityMockEntityNestedAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMockEntityNestedAttribute_Reference() {
+		return (EReference)entityMockEntityNestedAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEntityMockEntityNestedAttribute_Attribute() {
+		return (EReference)entityMockEntityNestedAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getEntityMockEntityFunctionParameter() {
 		return entityMockEntityFunctionParameterEClass;
 	}
@@ -2255,7 +2293,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockEntityFunctionParameter_ReferencePaths() {
+	public EReference getEntityMockEntityFunctionParameter_NestedAttribute() {
 		return (EReference)entityMockEntityFunctionParameterEClass.getEStructuralFeatures().get(1);
 	}
 
@@ -2264,15 +2302,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getEntityMockEntityFunctionParameter_ReferenceRef() {
-		return (EReference)entityMockEntityFunctionParameterEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public EEnum getEDateStepType() {
 		return eDateStepTypeEEnum;
 	}
@@ -2315,15 +2344,24 @@
 
 		// Create classes and their features
 		entityMockModelEClass = createEClass(ENTITY_MOCK_MODEL);
+		createEReference(entityMockModelEClass, ENTITY_MOCK_MODEL__IMPORT_SECTION);
 		createEReference(entityMockModelEClass, ENTITY_MOCK_MODEL__PACKAGES);
 
+		entityMockLazyResolverEClass = createEClass(ENTITY_MOCK_LAZY_RESOLVER);
+		createEOperation(entityMockLazyResolverEClass, ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);
+
 		entityMockPackageEClass = createEClass(ENTITY_MOCK_PACKAGE);
-		createEAttribute(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__RUN_PRIORITY);
-		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__DATAINTERCHANGES);
-		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__RESOURCES);
-		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__OBJECTS);
-		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__DATATYPES);
-		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__ENTITIES);
+		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__MOCKS);
+
+		entityMockEClass = createEClass(ENTITY_MOCK);
+		createEAttribute(entityMockEClass, ENTITY_MOCK__NAME);
+		createEAttribute(entityMockEClass, ENTITY_MOCK__DESCRIPTION);
+		createEAttribute(entityMockEClass, ENTITY_MOCK__DESCRIPTION_VALUE);
+		createEAttribute(entityMockEClass, ENTITY_MOCK__RUN_PRIORITY);
+		createEReference(entityMockEClass, ENTITY_MOCK__DATAINTERCHANGES);
+		createEReference(entityMockEClass, ENTITY_MOCK__RESOURCES);
+		createEReference(entityMockEClass, ENTITY_MOCK__OBJECTS);
+		createEReference(entityMockEClass, ENTITY_MOCK__ENTITIES);
 
 		runningDataInterchangesEClass = createEClass(RUNNING_DATA_INTERCHANGES);
 		createEReference(runningDataInterchangesEClass, RUNNING_DATA_INTERCHANGES__DATAINTERCHANGES);
@@ -2332,9 +2370,6 @@
 		createEReference(runningDataInterchangeEClass, RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF);
 		createEAttribute(runningDataInterchangeEClass, RUNNING_DATA_INTERCHANGE__FILE_URL);
 
-		entityMockLazyResolverEClass = createEClass(ENTITY_MOCK_LAZY_RESOLVER);
-		createEOperation(entityMockLazyResolverEClass, ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);
-
 		entityMockResourcesEClass = createEClass(ENTITY_MOCK_RESOURCES);
 		createEReference(entityMockResourcesEClass, ENTITY_MOCK_RESOURCES__RESOURCES);
 
@@ -2469,12 +2504,6 @@
 		propertyFillerUnsignedIntegerRandomEClass = createEClass(PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM);
 		createEAttribute(propertyFillerUnsignedIntegerRandomEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM__ITEMS);
 
-		entityMockDataTypesEClass = createEClass(ENTITY_MOCK_DATA_TYPES);
-		createEReference(entityMockDataTypesEClass, ENTITY_MOCK_DATA_TYPES__DATATYPES);
-
-		entityMockDataTypeEClass = createEClass(ENTITY_MOCK_DATA_TYPE);
-		createEAttribute(entityMockDataTypeEClass, ENTITY_MOCK_DATA_TYPE__NAME);
-
 		entityMockEntitiesEClass = createEClass(ENTITY_MOCK_ENTITIES);
 		createEReference(entityMockEntitiesEClass, ENTITY_MOCK_ENTITIES__ENTITIES);
 
@@ -2485,7 +2514,7 @@
 		createEAttribute(entityMockEntityEClass, ENTITY_MOCK_ENTITY__MAX_ROWS);
 		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ITERATE);
 		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ITERATOR);
-		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__TEMPORARIES);
+		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__TEMPLATES);
 		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ATTRIBUTES);
 		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__CALCULATIONS);
 		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__BY_RESOURCE);
@@ -2519,9 +2548,9 @@
 		createEReference(entityMockByResourceAttributeEClass, ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF);
 		createEReference(entityMockByResourceAttributeEClass, ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE);
 
-		entityMockTemporaryEClass = createEClass(ENTITY_MOCK_TEMPORARY);
-		createEAttribute(entityMockTemporaryEClass, ENTITY_MOCK_TEMPORARY__NAME);
-		createEReference(entityMockTemporaryEClass, ENTITY_MOCK_TEMPORARY__OBJECT);
+		entityMockTemplateEClass = createEClass(ENTITY_MOCK_TEMPLATE);
+		createEAttribute(entityMockTemplateEClass, ENTITY_MOCK_TEMPLATE__NAME);
+		createEReference(entityMockTemplateEClass, ENTITY_MOCK_TEMPLATE__OBJECT);
 
 		iEntityMockObjectUsableEClass = createEClass(IENTITY_MOCK_OBJECT_USABLE);
 
@@ -2530,7 +2559,7 @@
 		iEntityMockAttributeEClass = createEClass(IENTITY_MOCK_ATTRIBUTE);
 
 		entityMockReferencedObjectAttributeEClass = createEClass(ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE);
-		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY);
+		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE);
 		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED);
 		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE);
 
@@ -2554,10 +2583,13 @@
 		createEReference(entityMockEntityFunctionEClass, ENTITY_MOCK_ENTITY_FUNCTION__PARAMS);
 		createEReference(entityMockEntityFunctionEClass, ENTITY_MOCK_ENTITY_FUNCTION__BODY);
 
+		entityMockEntityNestedAttributeEClass = createEClass(ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE);
+		createEReference(entityMockEntityNestedAttributeEClass, ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE);
+		createEReference(entityMockEntityNestedAttributeEClass, ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE);
+
 		entityMockEntityFunctionParameterEClass = createEClass(ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER);
 		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF);
-		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS);
-		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF);
+		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE);
 
 		// Create enums
 		eDateStepTypeEEnum = createEEnum(EDATE_STEP_TYPE);
@@ -2590,8 +2622,9 @@
 		setNsURI(eNS_URI);
 
 		// Obtain other dependent packages
-		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
+		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);
 		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
+		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
 		DataDSLPackage theDataDSLPackage = (DataDSLPackage)EPackage.Registry.INSTANCE.getEPackage(DataDSLPackage.eNS_URI);
 		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);
 		XbasePackage theXbasePackage = (XbasePackage)EPackage.Registry.INSTANCE.getEPackage(XbasePackage.eNS_URI);
@@ -2645,7 +2678,7 @@
 		entityMockEntityEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
 		integerIterateEClass.getESuperTypes().add(this.getIIterate());
 		dateIterateEClass.getESuperTypes().add(this.getIIterate());
-		entityMockTemporaryEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
+		entityMockTemplateEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
 		iEntityMockObjectUsableEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
 		iEntityMockEntityUsableEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
 		iEntityMockAttributeEClass.getESuperTypes().add(this.getIEntityMockEntityUsable());
@@ -2657,15 +2690,26 @@
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(entityMockModelEClass, EntityMockModel.class, "EntityMockModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getEntityMockModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, EntityMockModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockModel_Packages(), this.getEntityMockPackage(), null, "packages", null, 0, -1, EntityMockModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(entityMockLazyResolverEClass, EntityMockLazyResolver.class, "EntityMockLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		EOperation op = initEOperation(getEntityMockLazyResolver__EResolveProxy__InternalEObject(), theEcorePackage.getEObject(), "eResolveProxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getInternalEObject(), "proxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(entityMockPackageEClass, EntityMockPackage.class, "EntityMockPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getEntityMockPackage_RunPriority(), theEcorePackage.getEInt(), "runPriority", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockPackage_Datainterchanges(), this.getRunningDataInterchanges(), null, "datainterchanges", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockPackage_Resources(), this.getEntityMockResources(), null, "resources", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockPackage_Objects(), this.getEntityMockObjects(), null, "objects", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockPackage_Datatypes(), this.getEntityMockDataTypes(), null, "datatypes", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockPackage_Entities(), this.getEntityMockEntities(), null, "entities", null, 0, 1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockPackage_Mocks(), this.getEntityMock(), null, "mocks", null, 0, -1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(entityMockEClass, EntityMock.class, "EntityMock", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getEntityMock_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getEntityMock_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getEntityMock_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getEntityMock_RunPriority(), theEcorePackage.getEInt(), "runPriority", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMock_Datainterchanges(), this.getRunningDataInterchanges(), null, "datainterchanges", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMock_Resources(), this.getEntityMockResources(), null, "resources", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMock_Objects(), this.getEntityMockObjects(), null, "objects", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMock_Entities(), this.getEntityMockEntities(), null, "entities", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(runningDataInterchangesEClass, RunningDataInterchanges.class, "RunningDataInterchanges", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getRunningDataInterchanges_Datainterchanges(), this.getRunningDataInterchange(), null, "datainterchanges", null, 0, -1, RunningDataInterchanges.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -2674,11 +2718,6 @@
 		initEReference(getRunningDataInterchange_DatainterchangeRef(), theDataDSLPackage.getDataInterchange(), null, "datainterchangeRef", null, 0, 1, RunningDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getRunningDataInterchange_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, RunningDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-		initEClass(entityMockLazyResolverEClass, EntityMockLazyResolver.class, "EntityMockLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		EOperation op = initEOperation(getEntityMockLazyResolver__EResolveProxy__InternalEObject(), theEcorePackage.getEObject(), "eResolveProxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
-		addEParameter(op, this.getInternalEObject(), "proxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
-
 		initEClass(entityMockResourcesEClass, EntityMockResources.class, "EntityMockResources", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getEntityMockResources_Resources(), this.getEntityMockResource(), null, "resources", null, 0, -1, EntityMockResources.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -2813,12 +2852,6 @@
 		initEClass(propertyFillerUnsignedIntegerRandomEClass, PropertyFillerUnsignedIntegerRandom.class, "PropertyFillerUnsignedIntegerRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getPropertyFillerUnsignedIntegerRandom_Items(), theEcorePackage.getEInt(), "items", null, 0, -1, PropertyFillerUnsignedIntegerRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-		initEClass(entityMockDataTypesEClass, EntityMockDataTypes.class, "EntityMockDataTypes", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getEntityMockDataTypes_Datatypes(), this.getEntityMockDataType(), null, "datatypes", null, 0, -1, EntityMockDataTypes.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(entityMockDataTypeEClass, EntityMockDataType.class, "EntityMockDataType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getEntityMockDataType_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockDataType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
 		initEClass(entityMockEntitiesEClass, EntityMockEntities.class, "EntityMockEntities", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getEntityMockEntities_Entities(), this.getEntityMockEntity(), null, "entities", null, 0, -1, EntityMockEntities.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -2829,7 +2862,7 @@
 		initEAttribute(getEntityMockEntity_MaxRows(), theEcorePackage.getEInt(), "maxRows", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntity_Iterate(), this.getIIterate(), null, "iterate", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntity_Iterator(), theOSBPEntityPackage.getLEntityAttribute(), null, "iterator", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockEntity_Temporaries(), this.getEntityMockTemporary(), null, "temporaries", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockEntity_Templates(), this.getEntityMockTemplate(), null, "templates", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntity_Attributes(), this.getIEntityMockAttribute(), null, "attributes", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntity_Calculations(), this.getEntityMockEntityFunction(), null, "calculations", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntity_ByResource(), this.getEntityMockResource(), null, "byResource", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -2863,9 +2896,9 @@
 		initEReference(getEntityMockByResourceAttribute_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockByResourceAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockByResourceAttribute_ResourceAttribute(), this.getEntityMockResourceAttribute(), null, "resourceAttribute", null, 0, 1, EntityMockByResourceAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-		initEClass(entityMockTemporaryEClass, EntityMockTemporary.class, "EntityMockTemporary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getEntityMockTemporary_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockTemporary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockTemporary_Object(), this.getEntityMockObject(), null, "object", null, 0, 1, EntityMockTemporary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(entityMockTemplateEClass, EntityMockTemplate.class, "EntityMockTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getEntityMockTemplate_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockTemplate_Object(), this.getEntityMockObject(), null, "object", null, 0, 1, EntityMockTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(iEntityMockObjectUsableEClass, IEntityMockObjectUsable.class, "IEntityMockObjectUsable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
@@ -2874,7 +2907,7 @@
 		initEClass(iEntityMockAttributeEClass, IEntityMockAttribute.class, "IEntityMockAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		initEClass(entityMockReferencedObjectAttributeEClass, EntityMockReferencedObjectAttribute.class, "EntityMockReferencedObjectAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getEntityMockReferencedObjectAttribute_Temporary(), this.getEntityMockTemporary(), null, "temporary", null, 0, 1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockReferencedObjectAttribute_Template(), this.getEntityMockTemplate(), null, "template", null, 0, 1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockReferencedObjectAttribute_Embedded(), this.getEntityMockObjectEmbed(), null, "embedded", null, 0, -1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockReferencedObjectAttribute_Attribute(), this.getIEntityMockObjectUsable(), null, "attribute", null, 0, 1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -2898,10 +2931,13 @@
 		initEReference(getEntityMockEntityFunction_Params(), this.getEntityMockEntityFunctionParameter(), null, "params", null, 0, -1, EntityMockEntityFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getEntityMockEntityFunction_Body(), theXbasePackage.getXExpression(), null, "body", null, 0, 1, EntityMockEntityFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(entityMockEntityNestedAttributeEClass, EntityMockEntityNestedAttribute.class, "EntityMockEntityNestedAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getEntityMockEntityNestedAttribute_Reference(), theOSBPEntityPackage.getLEntityReference(), null, "reference", null, 0, 1, EntityMockEntityNestedAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockEntityNestedAttribute_Attribute(), theOSBPEntityPackage.getLEntityAttribute(), null, "attribute", null, 0, 1, EntityMockEntityNestedAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
 		initEClass(entityMockEntityFunctionParameterEClass, EntityMockEntityFunctionParameter.class, "EntityMockEntityFunctionParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getEntityMockEntityFunctionParameter_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockEntityFunctionParameter_ReferencePaths(), theOSBPEntityPackage.getLEntityReference(), null, "referencePaths", null, 0, -1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getEntityMockEntityFunctionParameter_ReferenceRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "referenceRef", null, 0, 1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getEntityMockEntityFunctionParameter_NestedAttribute(), this.getEntityMockEntityNestedAttribute(), null, "nestedAttribute", null, 0, 1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		// Initialize enums and add enum literals
 		initEEnum(eDateStepTypeEEnum, EDateStepType.class, "EDateStepType");
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntitiesImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntitiesImpl.java
index def69e5..b892ac1 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntitiesImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntitiesImpl.java
@@ -37,10 +37,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl#getEntities <em>Entities</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionImpl.java
index a3dc8e5..6a7cfbd 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionImpl.java
@@ -42,12 +42,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl#getAttributeRef <em>Attribute Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl#getParams <em>Params</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl#getBody <em>Body</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionParameterImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionParameterImpl.java
index c8b66b0..2e2ce63 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionParameterImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityFunctionParameterImpl.java
@@ -13,11 +13,8 @@
  */
 package org.eclipse.osbp.xtext.entitymock.impl;
 
-import java.util.Collection;
-
 import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
@@ -25,13 +22,11 @@
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
-import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
 
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
 
 /**
  * <!-- begin-user-doc -->
@@ -39,12 +34,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl#getAttributeRef <em>Attribute Ref</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl#getReferencePaths <em>Reference Paths</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl#getReferenceRef <em>Reference Ref</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl#getNestedAttribute <em>Nested Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
@@ -60,24 +54,14 @@
 	protected LEntityAttribute attributeRef;
 
 	/**
-	 * The cached value of the '{@link #getReferencePaths() <em>Reference Paths</em>}' reference list.
+	 * The cached value of the '{@link #getNestedAttribute() <em>Nested Attribute</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getReferencePaths()
+	 * @see #getNestedAttribute()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<LEntityReference> referencePaths;
-
-	/**
-	 * The cached value of the '{@link #getReferenceRef() <em>Reference Ref</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferenceRef()
-	 * @generated
-	 * @ordered
-	 */
-	protected LEntityAttribute referenceRef;
+	protected EntityMockEntityNestedAttribute nestedAttribute;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -141,11 +125,23 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<LEntityReference> getReferencePaths() {
-		if (referencePaths == null) {
-			referencePaths = new EObjectResolvingEList<LEntityReference>(LEntityReference.class, this, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS);
+	public EntityMockEntityNestedAttribute getNestedAttribute() {
+		return nestedAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetNestedAttribute(EntityMockEntityNestedAttribute newNestedAttribute, NotificationChain msgs) {
+		EntityMockEntityNestedAttribute oldNestedAttribute = nestedAttribute;
+		nestedAttribute = newNestedAttribute;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE, oldNestedAttribute, newNestedAttribute);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
-		return referencePaths;
+		return msgs;
 	}
 
 	/**
@@ -153,16 +149,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public LEntityAttribute getReferenceRef() {
-		if (referenceRef != null && referenceRef.eIsProxy()) {
-			InternalEObject oldReferenceRef = (InternalEObject)referenceRef;
-			referenceRef = (LEntityAttribute)eResolveProxy(oldReferenceRef);
-			if (referenceRef != oldReferenceRef) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF, oldReferenceRef, referenceRef));
-			}
+	public void setNestedAttribute(EntityMockEntityNestedAttribute newNestedAttribute) {
+		if (newNestedAttribute != nestedAttribute) {
+			NotificationChain msgs = null;
+			if (nestedAttribute != null)
+				msgs = ((InternalEObject)nestedAttribute).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE, null, msgs);
+			if (newNestedAttribute != null)
+				msgs = ((InternalEObject)newNestedAttribute).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE, null, msgs);
+			msgs = basicSetNestedAttribute(newNestedAttribute, msgs);
+			if (msgs != null) msgs.dispatch();
 		}
-		return referenceRef;
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE, newNestedAttribute, newNestedAttribute));
 	}
 
 	/**
@@ -170,20 +168,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public LEntityAttribute basicGetReferenceRef() {
-		return referenceRef;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferenceRef(LEntityAttribute newReferenceRef) {
-		LEntityAttribute oldReferenceRef = referenceRef;
-		referenceRef = newReferenceRef;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF, oldReferenceRef, referenceRef));
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE:
+				return basicSetNestedAttribute(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
 
 	/**
@@ -197,11 +188,8 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF:
 				if (resolve) return getAttributeRef();
 				return basicGetAttributeRef();
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS:
-				return getReferencePaths();
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF:
-				if (resolve) return getReferenceRef();
-				return basicGetReferenceRef();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE:
+				return getNestedAttribute();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -211,19 +199,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF:
 				setAttributeRef((LEntityAttribute)newValue);
 				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS:
-				getReferencePaths().clear();
-				getReferencePaths().addAll((Collection<? extends LEntityReference>)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF:
-				setReferenceRef((LEntityAttribute)newValue);
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE:
+				setNestedAttribute((EntityMockEntityNestedAttribute)newValue);
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -240,11 +223,8 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF:
 				setAttributeRef((LEntityAttribute)null);
 				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS:
-				getReferencePaths().clear();
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF:
-				setReferenceRef((LEntityAttribute)null);
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE:
+				setNestedAttribute((EntityMockEntityNestedAttribute)null);
 				return;
 		}
 		super.eUnset(featureID);
@@ -260,10 +240,8 @@
 		switch (featureID) {
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF:
 				return attributeRef != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_PATHS:
-				return referencePaths != null && !referencePaths.isEmpty();
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__REFERENCE_REF:
-				return referenceRef != null;
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE:
+				return nestedAttribute != null;
 		}
 		return super.eIsSet(featureID);
 	}
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityImpl.java
index 31962fd..f2f8795 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityImpl.java
@@ -36,7 +36,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute;
 import org.eclipse.osbp.xtext.entitymock.IIterate;
 
@@ -46,6 +46,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getEntityRef <em>Entity Ref</em>}</li>
@@ -53,14 +54,13 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getMaxRows <em>Max Rows</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getIterate <em>Iterate</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getIterator <em>Iterator</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getTemporaries <em>Temporaries</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getTemplates <em>Templates</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getCalculations <em>Calculations</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getByResource <em>By Resource</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#getByResourceAttributes <em>By Resource Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl#isCreateBlobMapping <em>Create Blob Mapping</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
@@ -156,14 +156,14 @@
 	protected LEntityAttribute iterator;
 
 	/**
-	 * The cached value of the '{@link #getTemporaries() <em>Temporaries</em>}' containment reference list.
+	 * The cached value of the '{@link #getTemplates() <em>Templates</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getTemporaries()
+	 * @see #getTemplates()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<EntityMockTemporary> temporaries;
+	protected EList<EntityMockTemplate> templates;
 
 	/**
 	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' containment reference list.
@@ -431,11 +431,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<EntityMockTemporary> getTemporaries() {
-		if (temporaries == null) {
-			temporaries = new EObjectContainmentEList<EntityMockTemporary>(EntityMockTemporary.class, this, EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES);
+	public EList<EntityMockTemplate> getTemplates() {
+		if (templates == null) {
+			templates = new EObjectContainmentEList<EntityMockTemplate>(EntityMockTemplate.class, this, EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES);
 		}
-		return temporaries;
+		return templates;
 	}
 
 	/**
@@ -543,8 +543,8 @@
 		switch (featureID) {
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ITERATE:
 				return basicSetIterate(null, msgs);
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES:
-				return ((InternalEList<?>)getTemporaries()).basicRemove(otherEnd, msgs);
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES:
+				return ((InternalEList<?>)getTemplates()).basicRemove(otherEnd, msgs);
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ATTRIBUTES:
 				return ((InternalEList<?>)getAttributes()).basicRemove(otherEnd, msgs);
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__CALCULATIONS:
@@ -577,8 +577,8 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ITERATOR:
 				if (resolve) return getIterator();
 				return basicGetIterator();
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES:
-				return getTemporaries();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES:
+				return getTemplates();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ATTRIBUTES:
 				return getAttributes();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__CALCULATIONS:
@@ -621,9 +621,9 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ITERATOR:
 				setIterator((LEntityAttribute)newValue);
 				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES:
-				getTemporaries().clear();
-				getTemporaries().addAll((Collection<? extends EntityMockTemporary>)newValue);
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES:
+				getTemplates().clear();
+				getTemplates().addAll((Collection<? extends EntityMockTemplate>)newValue);
 				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ATTRIBUTES:
 				getAttributes().clear();
@@ -673,8 +673,8 @@
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ITERATOR:
 				setIterator((LEntityAttribute)null);
 				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES:
-				getTemporaries().clear();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES:
+				getTemplates().clear();
 				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ATTRIBUTES:
 				getAttributes().clear();
@@ -715,8 +715,8 @@
 				return iterate != null;
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ITERATOR:
 				return iterator != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPORARIES:
-				return temporaries != null && !temporaries.isEmpty();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__TEMPLATES:
+				return templates != null && !templates.isEmpty();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__ATTRIBUTES:
 				return attributes != null && !attributes.isEmpty();
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY__CALCULATIONS:
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityNestedAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityNestedAttributeImpl.java
new file mode 100644
index 0000000..afc2a3f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockEntityNestedAttributeImpl.java
@@ -0,0 +1,230 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
+
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Entity Mock Entity Nested Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl#getReference <em>Reference</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl#getAttribute <em>Attribute</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EntityMockEntityNestedAttributeImpl extends MinimalEObjectImpl.Container implements EntityMockEntityNestedAttribute {
+	/**
+	 * The cached value of the '{@link #getReference() <em>Reference</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getReference()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityReference reference;
+
+	/**
+	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttribute()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityAttribute attribute;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EntityMockEntityNestedAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityReference getReference() {
+		if (reference != null && reference.eIsProxy()) {
+			InternalEObject oldReference = (InternalEObject)reference;
+			reference = (LEntityReference)eResolveProxy(oldReference);
+			if (reference != oldReference) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE, oldReference, reference));
+			}
+		}
+		return reference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityReference basicGetReference() {
+		return reference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setReference(LEntityReference newReference) {
+		LEntityReference oldReference = reference;
+		reference = newReference;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE, oldReference, reference));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityAttribute getAttribute() {
+		if (attribute != null && attribute.eIsProxy()) {
+			InternalEObject oldAttribute = (InternalEObject)attribute;
+			attribute = (LEntityAttribute)eResolveProxy(oldAttribute);
+			if (attribute != oldAttribute) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+			}
+		}
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityAttribute basicGetAttribute() {
+		return attribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(LEntityAttribute newAttribute) {
+		LEntityAttribute oldAttribute = attribute;
+		attribute = newAttribute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE:
+				if (resolve) return getReference();
+				return basicGetReference();
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE:
+				if (resolve) return getAttribute();
+				return basicGetAttribute();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE:
+				setReference((LEntityReference)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE:
+				setAttribute((LEntityAttribute)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE:
+				setReference((LEntityReference)null);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE:
+				setAttribute((LEntityAttribute)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE:
+				return reference != null;
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE:
+				return attribute != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //EntityMockEntityNestedAttributeImpl
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockImpl.java
new file mode 100644
index 0000000..3adae71
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockImpl.java
@@ -0,0 +1,618 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
+import org.eclipse.osbp.xtext.entitymock.EntityMockObjects;
+import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
+import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Entity Mock</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#isDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getDescriptionValue <em>Description Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getRunPriority <em>Run Priority</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getDatainterchanges <em>Datainterchanges</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getResources <em>Resources</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getObjects <em>Objects</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl#getEntities <em>Entities</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EntityMockImpl extends MinimalEObjectImpl.Container implements EntityMock {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean DESCRIPTION_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescriptionValue() <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescriptionValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getDescriptionValue() <em>Description Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescriptionValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String descriptionValue = DESCRIPTION_VALUE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getRunPriority() <em>Run Priority</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRunPriority()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int RUN_PRIORITY_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getRunPriority() <em>Run Priority</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRunPriority()
+	 * @generated
+	 * @ordered
+	 */
+	protected int runPriority = RUN_PRIORITY_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getDatainterchanges() <em>Datainterchanges</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDatainterchanges()
+	 * @generated
+	 * @ordered
+	 */
+	protected RunningDataInterchanges datainterchanges;
+
+	/**
+	 * The cached value of the '{@link #getResources() <em>Resources</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getResources()
+	 * @generated
+	 * @ordered
+	 */
+	protected EntityMockResources resources;
+
+	/**
+	 * The cached value of the '{@link #getObjects() <em>Objects</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObjects()
+	 * @generated
+	 * @ordered
+	 */
+	protected EntityMockObjects objects;
+
+	/**
+	 * The cached value of the '{@link #getEntities() <em>Entities</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEntities()
+	 * @generated
+	 * @ordered
+	 */
+	protected EntityMockEntities entities;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EntityMockImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return EntityMockDSLPackage.Literals.ENTITY_MOCK;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(boolean newDescription) {
+		boolean oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescriptionValue() {
+		return descriptionValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescriptionValue(String newDescriptionValue) {
+		String oldDescriptionValue = descriptionValue;
+		descriptionValue = newDescriptionValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION_VALUE, oldDescriptionValue, descriptionValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getRunPriority() {
+		return runPriority;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRunPriority(int newRunPriority) {
+		int oldRunPriority = runPriority;
+		runPriority = newRunPriority;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__RUN_PRIORITY, oldRunPriority, runPriority));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RunningDataInterchanges getDatainterchanges() {
+		return datainterchanges;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDatainterchanges(RunningDataInterchanges newDatainterchanges, NotificationChain msgs) {
+		RunningDataInterchanges oldDatainterchanges = datainterchanges;
+		datainterchanges = newDatainterchanges;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES, oldDatainterchanges, newDatainterchanges);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDatainterchanges(RunningDataInterchanges newDatainterchanges) {
+		if (newDatainterchanges != datainterchanges) {
+			NotificationChain msgs = null;
+			if (datainterchanges != null)
+				msgs = ((InternalEObject)datainterchanges).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES, null, msgs);
+			if (newDatainterchanges != null)
+				msgs = ((InternalEObject)newDatainterchanges).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES, null, msgs);
+			msgs = basicSetDatainterchanges(newDatainterchanges, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES, newDatainterchanges, newDatainterchanges));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EntityMockResources getResources() {
+		return resources;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetResources(EntityMockResources newResources, NotificationChain msgs) {
+		EntityMockResources oldResources = resources;
+		resources = newResources;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__RESOURCES, oldResources, newResources);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setResources(EntityMockResources newResources) {
+		if (newResources != resources) {
+			NotificationChain msgs = null;
+			if (resources != null)
+				msgs = ((InternalEObject)resources).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__RESOURCES, null, msgs);
+			if (newResources != null)
+				msgs = ((InternalEObject)newResources).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__RESOURCES, null, msgs);
+			msgs = basicSetResources(newResources, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__RESOURCES, newResources, newResources));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EntityMockObjects getObjects() {
+		return objects;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetObjects(EntityMockObjects newObjects, NotificationChain msgs) {
+		EntityMockObjects oldObjects = objects;
+		objects = newObjects;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__OBJECTS, oldObjects, newObjects);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setObjects(EntityMockObjects newObjects) {
+		if (newObjects != objects) {
+			NotificationChain msgs = null;
+			if (objects != null)
+				msgs = ((InternalEObject)objects).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__OBJECTS, null, msgs);
+			if (newObjects != null)
+				msgs = ((InternalEObject)newObjects).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__OBJECTS, null, msgs);
+			msgs = basicSetObjects(newObjects, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__OBJECTS, newObjects, newObjects));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EntityMockEntities getEntities() {
+		return entities;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetEntities(EntityMockEntities newEntities, NotificationChain msgs) {
+		EntityMockEntities oldEntities = entities;
+		entities = newEntities;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__ENTITIES, oldEntities, newEntities);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEntities(EntityMockEntities newEntities) {
+		if (newEntities != entities) {
+			NotificationChain msgs = null;
+			if (entities != null)
+				msgs = ((InternalEObject)entities).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__ENTITIES, null, msgs);
+			if (newEntities != null)
+				msgs = ((InternalEObject)newEntities).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK__ENTITIES, null, msgs);
+			msgs = basicSetEntities(newEntities, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK__ENTITIES, newEntities, newEntities));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES:
+				return basicSetDatainterchanges(null, msgs);
+			case EntityMockDSLPackage.ENTITY_MOCK__RESOURCES:
+				return basicSetResources(null, msgs);
+			case EntityMockDSLPackage.ENTITY_MOCK__OBJECTS:
+				return basicSetObjects(null, msgs);
+			case EntityMockDSLPackage.ENTITY_MOCK__ENTITIES:
+				return basicSetEntities(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK__NAME:
+				return getName();
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION:
+				return isDescription();
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION_VALUE:
+				return getDescriptionValue();
+			case EntityMockDSLPackage.ENTITY_MOCK__RUN_PRIORITY:
+				return getRunPriority();
+			case EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES:
+				return getDatainterchanges();
+			case EntityMockDSLPackage.ENTITY_MOCK__RESOURCES:
+				return getResources();
+			case EntityMockDSLPackage.ENTITY_MOCK__OBJECTS:
+				return getObjects();
+			case EntityMockDSLPackage.ENTITY_MOCK__ENTITIES:
+				return getEntities();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK__NAME:
+				setName((String)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION:
+				setDescription((Boolean)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION_VALUE:
+				setDescriptionValue((String)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__RUN_PRIORITY:
+				setRunPriority((Integer)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES:
+				setDatainterchanges((RunningDataInterchanges)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__RESOURCES:
+				setResources((EntityMockResources)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__OBJECTS:
+				setObjects((EntityMockObjects)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__ENTITIES:
+				setEntities((EntityMockEntities)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION_VALUE:
+				setDescriptionValue(DESCRIPTION_VALUE_EDEFAULT);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__RUN_PRIORITY:
+				setRunPriority(RUN_PRIORITY_EDEFAULT);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES:
+				setDatainterchanges((RunningDataInterchanges)null);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__RESOURCES:
+				setResources((EntityMockResources)null);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__OBJECTS:
+				setObjects((EntityMockObjects)null);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK__ENTITIES:
+				setEntities((EntityMockEntities)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION:
+				return description != DESCRIPTION_EDEFAULT;
+			case EntityMockDSLPackage.ENTITY_MOCK__DESCRIPTION_VALUE:
+				return DESCRIPTION_VALUE_EDEFAULT == null ? descriptionValue != null : !DESCRIPTION_VALUE_EDEFAULT.equals(descriptionValue);
+			case EntityMockDSLPackage.ENTITY_MOCK__RUN_PRIORITY:
+				return runPriority != RUN_PRIORITY_EDEFAULT;
+			case EntityMockDSLPackage.ENTITY_MOCK__DATAINTERCHANGES:
+				return datainterchanges != null;
+			case EntityMockDSLPackage.ENTITY_MOCK__RESOURCES:
+				return resources != null;
+			case EntityMockDSLPackage.ENTITY_MOCK__OBJECTS:
+				return objects != null;
+			case EntityMockDSLPackage.ENTITY_MOCK__ENTITIES:
+				return entities != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", description: ");
+		result.append(description);
+		result.append(", descriptionValue: ");
+		result.append(descriptionValue);
+		result.append(", runPriority: ");
+		result.append(runPriority);
+		result.append(')');
+		return result.toString();
+	}
+
+} //EntityMockImpl
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockLazyResolverImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockLazyResolverImpl.java
index ea9b4be..be0d42d 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockLazyResolverImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockLazyResolverImpl.java
@@ -23,20 +23,15 @@
 
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3;
-
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
 import org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver;
 
+import org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3;
+
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Entity Mock Lazy Resolver</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
@@ -66,9 +61,7 @@
 	 * @generated
 	 */
 	public EObject eResolveProxy(final InternalEObject proxy) {
-		Resource _eResource = this.eResource();
-		ResourceSet _resourceSet = _eResource.getResourceSet();
-		return EcoreUtil3.resolve(proxy, _resourceSet);
+		return EcoreUtil3.resolve(proxy, this.eResource().getResourceSet());
 	}
 
 	/**
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockModelImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockModelImpl.java
index 3632e65..5d79c79 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockModelImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockModelImpl.java
@@ -15,6 +15,7 @@
 
 import java.util.Collection;
 
+import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
@@ -22,6 +23,7 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
@@ -31,21 +33,34 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
 import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
 
+import org.eclipse.xtext.xtype.XImportSection;
+
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Entity Mock Model</b></em>'.
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl#getImportSection <em>Import Section</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl#getPackages <em>Packages</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
 public class EntityMockModelImpl extends MinimalEObjectImpl.Container implements EntityMockModel {
 	/**
+	 * The cached value of the '{@link #getImportSection() <em>Import Section</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImportSection()
+	 * @generated
+	 * @ordered
+	 */
+	protected XImportSection importSection;
+
+	/**
 	 * The cached value of the '{@link #getPackages() <em>Packages</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -79,6 +94,49 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public XImportSection getImportSection() {
+		return importSection;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetImportSection(XImportSection newImportSection, NotificationChain msgs) {
+		XImportSection oldImportSection = importSection;
+		importSection = newImportSection;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION, oldImportSection, newImportSection);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setImportSection(XImportSection newImportSection) {
+		if (newImportSection != importSection) {
+			NotificationChain msgs = null;
+			if (importSection != null)
+				msgs = ((InternalEObject)importSection).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION, null, msgs);
+			if (newImportSection != null)
+				msgs = ((InternalEObject)newImportSection).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION, null, msgs);
+			msgs = basicSetImportSection(newImportSection, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION, newImportSection, newImportSection));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EList<EntityMockPackage> getPackages() {
 		if (packages == null) {
 			packages = new EObjectContainmentEList<EntityMockPackage>(EntityMockPackage.class, this, EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES);
@@ -94,6 +152,8 @@
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION:
+				return basicSetImportSection(null, msgs);
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES:
 				return ((InternalEList<?>)getPackages()).basicRemove(otherEnd, msgs);
 		}
@@ -108,6 +168,8 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION:
+				return getImportSection();
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES:
 				return getPackages();
 		}
@@ -123,6 +185,9 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION:
+				setImportSection((XImportSection)newValue);
+				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES:
 				getPackages().clear();
 				getPackages().addAll((Collection<? extends EntityMockPackage>)newValue);
@@ -139,6 +204,9 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION:
+				setImportSection((XImportSection)null);
+				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES:
 				getPackages().clear();
 				return;
@@ -154,6 +222,8 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__IMPORT_SECTION:
+				return importSection != null;
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL__PACKAGES:
 				return packages != null && !packages.isEmpty();
 		}
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectArrayValueImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectArrayValueImpl.java
index 0c9c33e..6d49690 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectArrayValueImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectArrayValueImpl.java
@@ -39,11 +39,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl#getEnumeration <em>Enumeration</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEmbedImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEmbedImpl.java
index 5d2c282..0dd6e3c 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEmbedImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEmbedImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEmbedImpl#getObject <em>Object</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEnumImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEnumImpl.java
index ca21a9c..ebb4bdd 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEnumImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectEnumImpl.java
@@ -31,11 +31,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl#getUsingResource <em>Using Resource</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFillImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFillImpl.java
index bc5176a..3f45cb1 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFillImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFillImpl.java
@@ -31,10 +31,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFillImpl#getFillerType <em>Filler Type</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionImpl.java
index 9e16c4b..b30f956 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionImpl.java
@@ -42,12 +42,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl#getOftype <em>Oftype</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl#getParams <em>Params</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl#getBody <em>Body</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionParameterImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionParameterImpl.java
index 4f8a2b4..056dfed 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionParameterImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectFunctionParameterImpl.java
@@ -34,11 +34,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl#getParameterType <em>Parameter Type</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectImpl.java
index c9f2786..8fa6930 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectImpl.java
@@ -41,13 +41,13 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl#getName <em>Name</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl#getEnumerations <em>Enumerations</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl#getCalculations <em>Calculations</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectItemValueImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectItemValueImpl.java
index 99b0c06..fd384cd 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectItemValueImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectItemValueImpl.java
@@ -38,11 +38,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl#getDatarow <em>Datarow</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectPlainValueImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectPlainValueImpl.java
index 03534a2..bd77078 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectPlainValueImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectPlainValueImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectPlainValueImpl#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectResourceValueImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectResourceValueImpl.java
index ae6eefe..97ff525 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectResourceValueImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectResourceValueImpl.java
@@ -31,11 +31,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl#getResourceEnum <em>Resource Enum</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl#getResourceAttribute <em>Resource Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectsImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectsImpl.java
index 82c286d..88584d9 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectsImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockObjectsImpl.java
@@ -37,10 +37,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectsImpl#getObjects <em>Objects</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockPackageImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockPackageImpl.java
index a296487..bf1d195 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockPackageImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockPackageImpl.java
@@ -13,23 +13,23 @@
  */
 package org.eclipse.osbp.xtext.entitymock.impl;
 
-import org.eclipse.emf.common.notify.Notification;
+import java.util.Collection;
+
 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;
 
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
 
 import org.eclipse.osbp.dsl.semantic.common.types.impl.LPackageImpl;
 
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
-import org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes;
-import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
-import org.eclipse.osbp.xtext.entitymock.EntityMockObjects;
 import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
-import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
-import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;
 
 /**
  * <!-- begin-user-doc -->
@@ -37,88 +37,23 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getRunPriority <em>Run Priority</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getDatainterchanges <em>Datainterchanges</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getObjects <em>Objects</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getDatatypes <em>Datatypes</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getEntities <em>Entities</em>}</li>
- * </ul>
  * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl#getMocks <em>Mocks</em>}</li>
+ * </ul>
  *
  * @generated
  */
 public class EntityMockPackageImpl extends LPackageImpl implements EntityMockPackage {
 	/**
-	 * The default value of the '{@link #getRunPriority() <em>Run Priority</em>}' attribute.
+	 * The cached value of the '{@link #getMocks() <em>Mocks</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getRunPriority()
+	 * @see #getMocks()
 	 * @generated
 	 * @ordered
 	 */
-	protected static final int RUN_PRIORITY_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getRunPriority() <em>Run Priority</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRunPriority()
-	 * @generated
-	 * @ordered
-	 */
-	protected int runPriority = RUN_PRIORITY_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getDatainterchanges() <em>Datainterchanges</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDatainterchanges()
-	 * @generated
-	 * @ordered
-	 */
-	protected RunningDataInterchanges datainterchanges;
-
-	/**
-	 * The cached value of the '{@link #getResources() <em>Resources</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResources()
-	 * @generated
-	 * @ordered
-	 */
-	protected EntityMockResources resources;
-
-	/**
-	 * The cached value of the '{@link #getObjects() <em>Objects</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getObjects()
-	 * @generated
-	 * @ordered
-	 */
-	protected EntityMockObjects objects;
-
-	/**
-	 * The cached value of the '{@link #getDatatypes() <em>Datatypes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDatatypes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EntityMockDataTypes datatypes;
-
-	/**
-	 * The cached value of the '{@link #getEntities() <em>Entities</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEntities()
-	 * @generated
-	 * @ordered
-	 */
-	protected EntityMockEntities entities;
+	protected EList<EntityMock> mocks;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -144,235 +79,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public int getRunPriority() {
-		return runPriority;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRunPriority(int newRunPriority) {
-		int oldRunPriority = runPriority;
-		runPriority = newRunPriority;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RUN_PRIORITY, oldRunPriority, runPriority));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RunningDataInterchanges getDatainterchanges() {
-		return datainterchanges;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDatainterchanges(RunningDataInterchanges newDatainterchanges, NotificationChain msgs) {
-		RunningDataInterchanges oldDatainterchanges = datainterchanges;
-		datainterchanges = newDatainterchanges;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES, oldDatainterchanges, newDatainterchanges);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
+	public EList<EntityMock> getMocks() {
+		if (mocks == null) {
+			mocks = new EObjectContainmentEList<EntityMock>(EntityMock.class, this, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS);
 		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDatainterchanges(RunningDataInterchanges newDatainterchanges) {
-		if (newDatainterchanges != datainterchanges) {
-			NotificationChain msgs = null;
-			if (datainterchanges != null)
-				msgs = ((InternalEObject)datainterchanges).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES, null, msgs);
-			if (newDatainterchanges != null)
-				msgs = ((InternalEObject)newDatainterchanges).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES, null, msgs);
-			msgs = basicSetDatainterchanges(newDatainterchanges, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES, newDatainterchanges, newDatainterchanges));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityMockResources getResources() {
-		return resources;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResources(EntityMockResources newResources, NotificationChain msgs) {
-		EntityMockResources oldResources = resources;
-		resources = newResources;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES, oldResources, newResources);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResources(EntityMockResources newResources) {
-		if (newResources != resources) {
-			NotificationChain msgs = null;
-			if (resources != null)
-				msgs = ((InternalEObject)resources).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES, null, msgs);
-			if (newResources != null)
-				msgs = ((InternalEObject)newResources).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES, null, msgs);
-			msgs = basicSetResources(newResources, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES, newResources, newResources));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityMockObjects getObjects() {
-		return objects;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetObjects(EntityMockObjects newObjects, NotificationChain msgs) {
-		EntityMockObjects oldObjects = objects;
-		objects = newObjects;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS, oldObjects, newObjects);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setObjects(EntityMockObjects newObjects) {
-		if (newObjects != objects) {
-			NotificationChain msgs = null;
-			if (objects != null)
-				msgs = ((InternalEObject)objects).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS, null, msgs);
-			if (newObjects != null)
-				msgs = ((InternalEObject)newObjects).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS, null, msgs);
-			msgs = basicSetObjects(newObjects, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS, newObjects, newObjects));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityMockDataTypes getDatatypes() {
-		return datatypes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDatatypes(EntityMockDataTypes newDatatypes, NotificationChain msgs) {
-		EntityMockDataTypes oldDatatypes = datatypes;
-		datatypes = newDatatypes;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES, oldDatatypes, newDatatypes);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDatatypes(EntityMockDataTypes newDatatypes) {
-		if (newDatatypes != datatypes) {
-			NotificationChain msgs = null;
-			if (datatypes != null)
-				msgs = ((InternalEObject)datatypes).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES, null, msgs);
-			if (newDatatypes != null)
-				msgs = ((InternalEObject)newDatatypes).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES, null, msgs);
-			msgs = basicSetDatatypes(newDatatypes, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES, newDatatypes, newDatatypes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EntityMockEntities getEntities() {
-		return entities;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetEntities(EntityMockEntities newEntities, NotificationChain msgs) {
-		EntityMockEntities oldEntities = entities;
-		entities = newEntities;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES, oldEntities, newEntities);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEntities(EntityMockEntities newEntities) {
-		if (newEntities != entities) {
-			NotificationChain msgs = null;
-			if (entities != null)
-				msgs = ((InternalEObject)entities).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES, null, msgs);
-			if (newEntities != null)
-				msgs = ((InternalEObject)newEntities).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES, null, msgs);
-			msgs = basicSetEntities(newEntities, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES, newEntities, newEntities));
+		return mocks;
 	}
 
 	/**
@@ -383,16 +94,8 @@
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES:
-				return basicSetDatainterchanges(null, msgs);
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES:
-				return basicSetResources(null, msgs);
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS:
-				return basicSetObjects(null, msgs);
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES:
-				return basicSetDatatypes(null, msgs);
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES:
-				return basicSetEntities(null, msgs);
+			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS:
+				return ((InternalEList<?>)getMocks()).basicRemove(otherEnd, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -405,18 +108,8 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RUN_PRIORITY:
-				return getRunPriority();
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES:
-				return getDatainterchanges();
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES:
-				return getResources();
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS:
-				return getObjects();
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES:
-				return getDatatypes();
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES:
-				return getEntities();
+			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS:
+				return getMocks();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -426,26 +119,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RUN_PRIORITY:
-				setRunPriority((Integer)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES:
-				setDatainterchanges((RunningDataInterchanges)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES:
-				setResources((EntityMockResources)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS:
-				setObjects((EntityMockObjects)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES:
-				setDatatypes((EntityMockDataTypes)newValue);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES:
-				setEntities((EntityMockEntities)newValue);
+			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS:
+				getMocks().clear();
+				getMocks().addAll((Collection<? extends EntityMock>)newValue);
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -459,23 +139,8 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RUN_PRIORITY:
-				setRunPriority(RUN_PRIORITY_EDEFAULT);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES:
-				setDatainterchanges((RunningDataInterchanges)null);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES:
-				setResources((EntityMockResources)null);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS:
-				setObjects((EntityMockObjects)null);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES:
-				setDatatypes((EntityMockDataTypes)null);
-				return;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES:
-				setEntities((EntityMockEntities)null);
+			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS:
+				getMocks().clear();
 				return;
 		}
 		super.eUnset(featureID);
@@ -489,36 +154,10 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RUN_PRIORITY:
-				return runPriority != RUN_PRIORITY_EDEFAULT;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATAINTERCHANGES:
-				return datainterchanges != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__RESOURCES:
-				return resources != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__OBJECTS:
-				return objects != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__DATATYPES:
-				return datatypes != null;
-			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__ENTITIES:
-				return entities != null;
+			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE__MOCKS:
+				return mocks != null && !mocks.isEmpty();
 		}
 		return super.eIsSet(featureID);
 	}
 
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (runPriority: ");
-		result.append(runPriority);
-		result.append(')');
-		return result.toString();
-	}
-
 } //EntityMockPackageImpl
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockReferencedObjectAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockReferencedObjectAttributeImpl.java
index cfce118..e6a6d13 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockReferencedObjectAttributeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockReferencedObjectAttributeImpl.java
@@ -29,7 +29,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed;
 import org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable;
 
 /**
@@ -38,25 +38,25 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl#getTemporary <em>Temporary</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl#getTemplate <em>Template</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl#getEmbedded <em>Embedded</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl#getAttribute <em>Attribute</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
 public class EntityMockReferencedObjectAttributeImpl extends EntityMockLazyResolverImpl implements EntityMockReferencedObjectAttribute {
 	/**
-	 * The cached value of the '{@link #getTemporary() <em>Temporary</em>}' reference.
+	 * The cached value of the '{@link #getTemplate() <em>Template</em>}' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getTemporary()
+	 * @see #getTemplate()
 	 * @generated
 	 * @ordered
 	 */
-	protected EntityMockTemporary temporary;
+	protected EntityMockTemplate template;
 
 	/**
 	 * The cached value of the '{@link #getEmbedded() <em>Embedded</em>}' reference list.
@@ -102,16 +102,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EntityMockTemporary getTemporary() {
-		if (temporary != null && temporary.eIsProxy()) {
-			InternalEObject oldTemporary = (InternalEObject)temporary;
-			temporary = (EntityMockTemporary)eResolveProxy(oldTemporary);
-			if (temporary != oldTemporary) {
+	public EntityMockTemplate getTemplate() {
+		if (template != null && template.eIsProxy()) {
+			InternalEObject oldTemplate = (InternalEObject)template;
+			template = (EntityMockTemplate)eResolveProxy(oldTemplate);
+			if (template != oldTemplate) {
 				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY, oldTemporary, temporary));
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE, oldTemplate, template));
 			}
 		}
-		return temporary;
+		return template;
 	}
 
 	/**
@@ -119,8 +119,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EntityMockTemporary basicGetTemporary() {
-		return temporary;
+	public EntityMockTemplate basicGetTemplate() {
+		return template;
 	}
 
 	/**
@@ -128,11 +128,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setTemporary(EntityMockTemporary newTemporary) {
-		EntityMockTemporary oldTemporary = temporary;
-		temporary = newTemporary;
+	public void setTemplate(EntityMockTemplate newTemplate) {
+		EntityMockTemplate oldTemplate = template;
+		template = newTemplate;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY, oldTemporary, temporary));
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE, oldTemplate, template));
 	}
 
 	/**
@@ -193,9 +193,9 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY:
-				if (resolve) return getTemporary();
-				return basicGetTemporary();
+			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE:
+				if (resolve) return getTemplate();
+				return basicGetTemplate();
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED:
 				return getEmbedded();
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE:
@@ -214,8 +214,8 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY:
-				setTemporary((EntityMockTemporary)newValue);
+			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE:
+				setTemplate((EntityMockTemplate)newValue);
 				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED:
 				getEmbedded().clear();
@@ -236,8 +236,8 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY:
-				setTemporary((EntityMockTemporary)null);
+			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE:
+				setTemplate((EntityMockTemplate)null);
 				return;
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED:
 				getEmbedded().clear();
@@ -257,8 +257,8 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPORARY:
-				return temporary != null;
+			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE:
+				return template != null;
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED:
 				return embedded != null && !embedded.isEmpty();
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE:
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceAttributeImpl.java
index 9edc60e..7e49f52 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceAttributeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceAttributeImpl.java
@@ -24,8 +24,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Entity Mock Resource Attribute</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceDataRowImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceDataRowImpl.java
index ce779bb..5f72bad 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceDataRowImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceDataRowImpl.java
@@ -32,10 +32,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceDataRowImpl#getValues <em>Values</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceImpl.java
index 2c2e6b9..4c5dcb4 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourceImpl.java
@@ -38,11 +38,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl#getAttributes <em>Attributes</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl#getDatarows <em>Datarows</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourcesImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourcesImpl.java
index 0cdbfaf..d096b29 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourcesImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockResourcesImpl.java
@@ -37,10 +37,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl#getResources <em>Resources</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockTemplateImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockTemplateImpl.java
new file mode 100644
index 0000000..14abb12
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/EntityMockTemplateImpl.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License v1.0 
+ *  which accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.entitymock.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
+import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Entity Mock Template</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl#getObject <em>Object</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EntityMockTemplateImpl extends EntityMockLazyResolverImpl implements EntityMockTemplate {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getObject() <em>Object</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected EntityMockObject object;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EntityMockTemplateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EntityMockObject getObject() {
+		if (object != null && object.eIsProxy()) {
+			InternalEObject oldObject = (InternalEObject)object;
+			object = (EntityMockObject)eResolveProxy(oldObject);
+			if (object != oldObject) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT, oldObject, object));
+			}
+		}
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EntityMockObject basicGetObject() {
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setObject(EntityMockObject newObject) {
+		EntityMockObject oldObject = object;
+		object = newObject;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT, oldObject, object));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__NAME:
+				return getName();
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT:
+				if (resolve) return getObject();
+				return basicGetObject();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__NAME:
+				setName((String)newValue);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT:
+				setObject((EntityMockObject)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT:
+				setObject((EntityMockObject)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE__OBJECT:
+				return object != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+
+} //EntityMockTemplateImpl
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockAttributeImpl.java
index a988035..379e932 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockAttributeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockAttributeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>IEntity Mock Attribute</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockEntityUsableImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockEntityUsableImpl.java
index 60584a5..2de7f9f 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockEntityUsableImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockEntityUsableImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>IEntity Mock Entity Usable</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectAttributeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectAttributeImpl.java
index e86f96d..928253a 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectAttributeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectAttributeImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectAttributeImpl#getName <em>Name</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectUsableImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectUsableImpl.java
index b3ac140..4523c96 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectUsableImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IEntityMockObjectUsableImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>IEntity Mock Object Usable</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IIterateImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IIterateImpl.java
index 78af222..fce7e7d 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IIterateImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IIterateImpl.java
@@ -24,8 +24,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>IIterate</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IntegerIterateImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IntegerIterateImpl.java
index 1ae9eab..b0b2351 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IntegerIterateImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/IntegerIterateImpl.java
@@ -28,12 +28,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl#getFrom <em>From</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl#getUntil <em>Until</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl#getStep <em>Step</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerBooleanImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerBooleanImpl.java
index 7079a72..4969a81 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerBooleanImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerBooleanImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Boolean</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateFutureImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateFutureImpl.java
index 121fbbf..38c51c4 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateFutureImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateFutureImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateFutureImpl#getDateFutureYears <em>Date Future Years</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDatePastImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDatePastImpl.java
index 9e5caa7..a7798ea 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDatePastImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDatePastImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDatePastImpl#getDatePastYears <em>Date Past Years</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateRangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateRangeImpl.java
index e52102c..141eca3 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateRangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateRangeImpl.java
@@ -28,11 +28,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl#getDateBeginYears <em>Date Begin Years</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl#getDateEndYears <em>Date End Years</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateTypeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateTypeImpl.java
index 3d46c30..b352b96 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateTypeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDateTypeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Date Type</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDoubleTypeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDoubleTypeImpl.java
index 8277757..6dc09c6 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDoubleTypeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerDoubleTypeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Double Type</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerIntegerTypeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerIntegerTypeImpl.java
index 82ec601..165adcd 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerIntegerTypeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerIntegerTypeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Integer Type</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRandomImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRandomImpl.java
index a2bd5b5..5bc26ae 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRandomImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRandomImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRandomImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRangeImpl.java
index 6745e6f..1863aba 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedDoubleRangeImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl#getDecimals <em>Decimals</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl#getBeginRange <em>Begin Range</em>}</li>
@@ -39,7 +40,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRandomImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRandomImpl.java
index a397422..e46e35d 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRandomImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRandomImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRandomImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRangeImpl.java
index a97c057..e93a76c 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerSignedIntegerRangeImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl#getBeginRange <em>Begin Range</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl#getEndRange <em>End Range</em>}</li>
@@ -38,7 +39,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextParagraphsImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextParagraphsImpl.java
index bf72107..4b67fe2 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextParagraphsImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextParagraphsImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextParagraphsImpl#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextRandomImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextRandomImpl.java
index ab39fae..b24c904 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextRandomImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextRandomImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextRandomImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextSentencesImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextSentencesImpl.java
index ce46273..00e72ce 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextSentencesImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextSentencesImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextSentencesImpl#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextTypeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextTypeImpl.java
index 51969e7..27c00ab 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextTypeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextTypeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Text Type</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextWordsImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextWordsImpl.java
index fcda90f..bf28968 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextWordsImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTextWordsImpl.java
@@ -28,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextWordsImpl#getCount <em>Count</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTypeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTypeImpl.java
index 7d8df42..63fc906 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTypeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerTypeImpl.java
@@ -22,8 +22,6 @@
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Property Filler Type</b></em>'.
  * <!-- end-user-doc -->
- * <p>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRandomImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRandomImpl.java
index a945bb4..f7cff71 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRandomImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRandomImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRandomImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRangeImpl.java
index b11905a..19181bd 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedDoubleRangeImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl#getDecimals <em>Decimals</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl#getBeginRange <em>Begin Range</em>}</li>
@@ -39,7 +40,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRandomImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRandomImpl.java
index 8b4377f..6794b3b 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRandomImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRandomImpl.java
@@ -30,10 +30,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRandomImpl#getItems <em>Items</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRangeImpl.java
index edafd61..fc56683 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/PropertyFillerUnsignedIntegerRangeImpl.java
@@ -31,6 +31,7 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl#getBeginRange <em>Begin Range</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl#getEndRange <em>End Range</em>}</li>
@@ -38,7 +39,6 @@
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl#getEndRangeRef <em>End Range Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl#getRounded <em>Rounded</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangeImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangeImpl.java
index 6d16b42..911c4ee 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangeImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangeImpl.java
@@ -32,11 +32,11 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl#getDatainterchangeRef <em>Datainterchange Ref</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl#getFileURL <em>File URL</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangesImpl.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangesImpl.java
index 9572ee9..5e49d49 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangesImpl.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/impl/RunningDataInterchangesImpl.java
@@ -37,10 +37,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
+ * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl#getDatainterchanges <em>Datainterchanges</em>}</li>
  * </ul>
- * </p>
  *
  * @generated
  */
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLAdapterFactory.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLAdapterFactory.java
index 95f7815..07a957b 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLAdapterFactory.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLAdapterFactory.java
@@ -91,10 +91,18 @@
 				return createEntityMockModelAdapter();
 			}
 			@Override
+			public Adapter caseEntityMockLazyResolver(EntityMockLazyResolver object) {
+				return createEntityMockLazyResolverAdapter();
+			}
+			@Override
 			public Adapter caseEntityMockPackage(EntityMockPackage object) {
 				return createEntityMockPackageAdapter();
 			}
 			@Override
+			public Adapter caseEntityMock(EntityMock object) {
+				return createEntityMockAdapter();
+			}
+			@Override
 			public Adapter caseRunningDataInterchanges(RunningDataInterchanges object) {
 				return createRunningDataInterchangesAdapter();
 			}
@@ -103,10 +111,6 @@
 				return createRunningDataInterchangeAdapter();
 			}
 			@Override
-			public Adapter caseEntityMockLazyResolver(EntityMockLazyResolver object) {
-				return createEntityMockLazyResolverAdapter();
-			}
-			@Override
 			public Adapter caseEntityMockResources(EntityMockResources object) {
 				return createEntityMockResourcesAdapter();
 			}
@@ -255,14 +259,6 @@
 				return createPropertyFillerUnsignedIntegerRandomAdapter();
 			}
 			@Override
-			public Adapter caseEntityMockDataTypes(EntityMockDataTypes object) {
-				return createEntityMockDataTypesAdapter();
-			}
-			@Override
-			public Adapter caseEntityMockDataType(EntityMockDataType object) {
-				return createEntityMockDataTypeAdapter();
-			}
-			@Override
 			public Adapter caseEntityMockEntities(EntityMockEntities object) {
 				return createEntityMockEntitiesAdapter();
 			}
@@ -291,8 +287,8 @@
 				return createEntityMockByResourceAttributeAdapter();
 			}
 			@Override
-			public Adapter caseEntityMockTemporary(EntityMockTemporary object) {
-				return createEntityMockTemporaryAdapter();
+			public Adapter caseEntityMockTemplate(EntityMockTemplate object) {
+				return createEntityMockTemplateAdapter();
 			}
 			@Override
 			public Adapter caseIEntityMockObjectUsable(IEntityMockObjectUsable object) {
@@ -327,6 +323,10 @@
 				return createEntityMockEntityFunctionAdapter();
 			}
 			@Override
+			public Adapter caseEntityMockEntityNestedAttribute(EntityMockEntityNestedAttribute object) {
+				return createEntityMockEntityNestedAttributeAdapter();
+			}
+			@Override
 			public Adapter caseEntityMockEntityFunctionParameter(EntityMockEntityFunctionParameter object) {
 				return createEntityMockEntityFunctionParameterAdapter();
 			}
@@ -393,6 +393,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver <em>Entity Mock Lazy Resolver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver
+	 * @generated
+	 */
+	public Adapter createEntityMockLazyResolverAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage <em>Entity Mock Package</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -407,6 +421,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMock <em>Entity Mock</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock
+	 * @generated
+	 */
+	public Adapter createEntityMockAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges <em>Running Data Interchanges</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -435,20 +463,6 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver <em>Entity Mock Lazy Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver
-	 * @generated
-	 */
-	public Adapter createEntityMockLazyResolverAdapter() {
-		return null;
-	}
-
-	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResources <em>Entity Mock Resources</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -967,34 +981,6 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes <em>Entity Mock Data Types</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes
-	 * @generated
-	 */
-	public Adapter createEntityMockDataTypesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockDataType <em>Entity Mock Data Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDataType
-	 * @generated
-	 */
-	public Adapter createEntityMockDataTypeAdapter() {
-		return null;
-	}
-
-	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntities <em>Entity Mock Entities</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -1093,16 +1079,16 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemporary <em>Entity Mock Temporary</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate <em>Entity Mock Template</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemporary
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate
 	 * @generated
 	 */
-	public Adapter createEntityMockTemporaryAdapter() {
+	public Adapter createEntityMockTemplateAdapter() {
 		return null;
 	}
 
@@ -1219,6 +1205,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute <em>Entity Mock Entity Nested Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute
+	 * @generated
+	 */
+	public Adapter createEntityMockEntityNestedAttributeAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter <em>Entity Mock Entity Function Parameter</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLSwitch.java b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLSwitch.java
index f05066e..4cbf234 100644
--- a/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLSwitch.java
+++ b/org.eclipse.osbp.xtext.entitymock/emf-gen/org/eclipse/osbp/xtext/entitymock/util/EntityMockDSLSwitch.java
@@ -66,7 +66,7 @@
 	 * Checks whether this is a switch for the given package.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @parameter ePackage the package in question.
+	 * @param ePackage the package in question.
 	 * @return whether this is a switch for the given package.
 	 * @generated
 	 */
@@ -91,6 +91,12 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case EntityMockDSLPackage.ENTITY_MOCK_LAZY_RESOLVER: {
+				EntityMockLazyResolver entityMockLazyResolver = (EntityMockLazyResolver)theEObject;
+				T result = caseEntityMockLazyResolver(entityMockLazyResolver);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE: {
 				EntityMockPackage entityMockPackage = (EntityMockPackage)theEObject;
 				T result = caseEntityMockPackage(entityMockPackage);
@@ -99,6 +105,12 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case EntityMockDSLPackage.ENTITY_MOCK: {
+				EntityMock entityMock = (EntityMock)theEObject;
+				T result = caseEntityMock(entityMock);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGES: {
 				RunningDataInterchanges runningDataInterchanges = (RunningDataInterchanges)theEObject;
 				T result = caseRunningDataInterchanges(runningDataInterchanges);
@@ -111,12 +123,6 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case EntityMockDSLPackage.ENTITY_MOCK_LAZY_RESOLVER: {
-				EntityMockLazyResolver entityMockLazyResolver = (EntityMockLazyResolver)theEObject;
-				T result = caseEntityMockLazyResolver(entityMockLazyResolver);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCES: {
 				EntityMockResources entityMockResources = (EntityMockResources)theEObject;
 				T result = caseEntityMockResources(entityMockResources);
@@ -428,18 +434,6 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPES: {
-				EntityMockDataTypes entityMockDataTypes = (EntityMockDataTypes)theEObject;
-				T result = caseEntityMockDataTypes(entityMockDataTypes);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPE: {
-				EntityMockDataType entityMockDataType = (EntityMockDataType)theEObject;
-				T result = caseEntityMockDataType(entityMockDataType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITIES: {
 				EntityMockEntities entityMockEntities = (EntityMockEntities)theEObject;
 				T result = caseEntityMockEntities(entityMockEntities);
@@ -485,10 +479,10 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case EntityMockDSLPackage.ENTITY_MOCK_TEMPORARY: {
-				EntityMockTemporary entityMockTemporary = (EntityMockTemporary)theEObject;
-				T result = caseEntityMockTemporary(entityMockTemporary);
-				if (result == null) result = caseEntityMockLazyResolver(entityMockTemporary);
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE: {
+				EntityMockTemplate entityMockTemplate = (EntityMockTemplate)theEObject;
+				T result = caseEntityMockTemplate(entityMockTemplate);
+				if (result == null) result = caseEntityMockLazyResolver(entityMockTemplate);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
@@ -556,6 +550,12 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE: {
+				EntityMockEntityNestedAttribute entityMockEntityNestedAttribute = (EntityMockEntityNestedAttribute)theEObject;
+				T result = caseEntityMockEntityNestedAttribute(entityMockEntityNestedAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER: {
 				EntityMockEntityFunctionParameter entityMockEntityFunctionParameter = (EntityMockEntityFunctionParameter)theEObject;
 				T result = caseEntityMockEntityFunctionParameter(entityMockEntityFunctionParameter);
@@ -582,6 +582,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Lazy Resolver</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Lazy Resolver</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEntityMockLazyResolver(EntityMockLazyResolver object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Package</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -597,6 +612,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Entity Mock</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEntityMock(EntityMock object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Running Data Interchanges</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -627,21 +657,6 @@
 	}
 
 	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Lazy Resolver</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Lazy Resolver</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseEntityMockLazyResolver(EntityMockLazyResolver object) {
-		return null;
-	}
-
-	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Resources</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -1197,36 +1212,6 @@
 	}
 
 	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Data Types</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Data Types</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseEntityMockDataTypes(EntityMockDataTypes object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Data Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Data Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseEntityMockDataType(EntityMockDataType object) {
-		return null;
-	}
-
-	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Entities</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -1332,17 +1317,17 @@
 	}
 
 	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Temporary</em>'.
+	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Template</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
 	 * returning a non-null result will terminate the switch.
 	 * <!-- end-user-doc -->
 	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Temporary</em>'.
+	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Template</em>'.
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public T caseEntityMockTemporary(EntityMockTemporary object) {
+	public T caseEntityMockTemplate(EntityMockTemplate object) {
 		return null;
 	}
 
@@ -1467,6 +1452,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Entity Nested Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Entity Mock Entity Nested Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEntityMockEntityNestedAttribute(EntityMockEntityNestedAttribute object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Entity Mock Entity Function Parameter</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore b/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore
index f29d5f3..78ffd28 100644
--- a/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore
+++ b/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore
@@ -16,6 +16,9 @@
 @GenModel(modelName="EntityMockDSL")
 @GenModel(prefix="EntityMockDSL")
 @GenModel(updateClasspath="false")
+// force bigModel == false
+@GenModel(loadInitialization="false")
+@GenModel(literalsInterface="true")
 @GenModel(copyrightText="Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  All rights reserved. This program and the accompanying materials 
  are made available under the terms of the Eclipse Public License v1.0 
@@ -42,31 +45,15 @@
 import org.eclipse.osbp.dsl.semantic.entity.LEntity
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
 import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
-import org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3
+import org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3
 import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral
+import org.eclipse.xtext.xtype.XImportSection
 
 class EntityMockModel {
+	contains XImportSection importSection
     contains EntityMockPackage[] packages
 }
 
-class EntityMockPackage extends LPackage {
-	int runPriority
-	contains RunningDataInterchanges datainterchanges
-    contains EntityMockResources resources
-	contains EntityMockObjects objects
-    contains EntityMockDataTypes datatypes
-    contains EntityMockEntities entities
-}
-
-class RunningDataInterchanges {
-    contains RunningDataInterchange[] datainterchanges
-}
-
-class RunningDataInterchange {
-    refers DataInterchange datainterchangeRef
-    String fileURL
-}
-
 type InternalEObject wraps InternalEObject
 
 class EntityMockLazyResolver { 
@@ -75,6 +62,28 @@
     }
 }
 
+class EntityMockPackage extends LPackage {
+	contains EntityMock[] mocks
+}
+
+class EntityMock {
+	String name
+	boolean description
+	String descriptionValue
+	int runPriority
+	contains RunningDataInterchanges datainterchanges
+    contains EntityMockResources resources
+	contains EntityMockObjects objects
+    contains EntityMockEntities entities
+} 
+class RunningDataInterchanges {
+    contains RunningDataInterchange[] datainterchanges
+}
+
+class RunningDataInterchange {
+    refers DataInterchange datainterchangeRef
+    String fileURL
+}
 class EntityMockResources {
     contains EntityMockResource[] resources
 }
@@ -237,14 +246,6 @@
 }
 
 
-class EntityMockDataTypes {
-    contains EntityMockDataType[] datatypes
-}
-
-class EntityMockDataType {
-    String name
-}
-
 class EntityMockEntities {
     contains EntityMockEntity[] entities
 }
@@ -256,7 +257,7 @@
     int maxRows
     contains IIterate iterate
     refers LEntityAttribute iterator
-    contains EntityMockTemporary[] temporaries
+    contains EntityMockTemplate[] templates
     contains IEntityMockAttribute[] attributes
     contains EntityMockEntityFunction[] calculations
     refers EntityMockResource byResource
@@ -302,7 +303,7 @@
     refers EntityMockResourceAttribute resourceAttribute
 }
 
-class EntityMockTemporary extends EntityMockLazyResolver {
+class EntityMockTemplate extends EntityMockLazyResolver {
     String name
     refers EntityMockObject object
 }
@@ -314,7 +315,7 @@
 class IEntityMockAttribute extends IEntityMockEntityUsable {}
 
 class EntityMockReferencedObjectAttribute extends EntityMockLazyResolver {
-    refers EntityMockTemporary temporary
+    refers EntityMockTemplate template
     refers EntityMockObjectEmbed[] embedded
     refers IEntityMockObjectUsable attribute
 }
@@ -343,8 +344,12 @@
 	contains XExpression body
 }
 
+class EntityMockEntityNestedAttribute{
+    refers LEntityReference reference
+	refers LEntityAttribute attribute
+}
+ 
 class EntityMockEntityFunctionParameter {
 	refers LEntityAttribute attributeRef
-	refers LEntityReference[] referencePaths
-	refers LEntityAttribute referenceRef
+	contains EntityMockEntityNestedAttribute nestedAttribute
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/pom.xml b/org.eclipse.osbp.xtext.entitymock/pom.xml
index 0095679..8c846bf 100644
--- a/org.eclipse.osbp.xtext.entitymock/pom.xml
+++ b/org.eclipse.osbp.xtext.entitymock/pom.xml
@@ -20,4 +20,13 @@
     </parent>
     <artifactId>org.eclipse.osbp.xtext.entitymock</artifactId>
     <packaging>eclipse-plugin</packaging>
+    <dependencies>
+		<dependency>
+			<groupId>org.eclipse.osbp.dependencies</groupId>
+			<artifactId>
+				org.eclipse.osbp.dependencies.bundle.activemq.all.osgi
+			</artifactId>
+			<version>5.14.5-SNAPSHOT</version>
+		</dependency>
+    </dependencies>
 </project>
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/AbstractEntityMockDSLRuntimeModule.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/AbstractEntityMockDSLRuntimeModule.java
index 74a133f..1885d63 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/AbstractEntityMockDSLRuntimeModule.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/AbstractEntityMockDSLRuntimeModule.java
@@ -10,23 +10,77 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock;
 
-import java.util.Properties;
-
-import org.eclipse.xtext.Constants;
-import org.eclipse.xtext.service.DefaultRuntimeModule;
-
 import com.google.inject.Binder;
+import com.google.inject.Provider;
 import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.osbp.xtext.entitymock.jvmmodel.EntityMockDSLJvmModelInferrer;
+import org.eclipse.osbp.xtext.entitymock.parser.antlr.EntityMockDSLAntlrTokenFileProvider;
+import org.eclipse.osbp.xtext.entitymock.parser.antlr.EntityMockDSLParser;
+import org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer;
+import org.eclipse.osbp.xtext.entitymock.scoping.EntityMockDSLScopeProvider;
+import org.eclipse.osbp.xtext.entitymock.serializer.EntityMockDSLSemanticSequencer;
+import org.eclipse.osbp.xtext.entitymock.serializer.EntityMockDSLSyntacticSequencer;
+import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+import org.eclipse.osbp.xtext.entitymock.validation.EntityMockDSLValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parser.ITokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper;
+import org.eclipse.xtext.parser.antlr.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.parser.antlr.UnorderedGroupHelper;
+import org.eclipse.xtext.resource.IContainer;
+import org.eclipse.xtext.resource.ILocationInFileProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider;
+import org.eclipse.xtext.resource.containers.StateBasedContainerManager;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.scoping.IgnoreCaseLinking;
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.validation.IResourceValidator;
+import org.eclipse.xtext.xbase.annotations.DefaultXbaseWithAnnotationsRuntimeModule;
+import org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator;
+import org.eclipse.xtext.xbase.jvmmodel.IJvmModelInferrer;
+import org.eclipse.xtext.xbase.jvmmodel.JvmLocationInFileProvider;
+import org.eclipse.xtext.xbase.scoping.XImportSectionNamespaceScopeProvider;
+import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;
+import org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider;
+import org.eclipse.xtext.xbase.typesystem.internal.DefaultBatchTypeResolver;
+import org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver;
+import org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareBatchTypeResolver;
+import org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver;
+import org.eclipse.xtext.xbase.validation.FeatureNameValidator;
+import org.eclipse.xtext.xbase.validation.LogicalContainerAwareFeatureNameValidator;
 
 /**
- * Manual modifications go to {org.eclipse.osbp.xtext.entitymock.EntityMockDSLRuntimeModule}
+ * Manual modifications go to {@link EntityMockDSLRuntimeModule}.
  */
- @SuppressWarnings("all")
-public abstract class AbstractEntityMockDSLRuntimeModule extends DefaultRuntimeModule {
+@SuppressWarnings("all")
+public abstract class AbstractEntityMockDSLRuntimeModule extends DefaultXbaseWithAnnotationsRuntimeModule {
 
 	protected Properties properties = null;
 
@@ -45,304 +99,152 @@
 			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("entitymock");
 	}
 	
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISemanticSequencer> bindISemanticSequencer() {
-		return org.eclipse.osbp.xtext.entitymock.serializer.EntityMockDSLSemanticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer> bindISyntacticSequencer() {
-		return org.eclipse.osbp.xtext.entitymock.serializer.EntityMockDSLSyntacticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.ISerializer> bindISerializer() {
-		return org.eclipse.xtext.serializer.impl.Serializer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.IParser> bindIParser() {
-		return org.eclipse.osbp.xtext.entitymock.parser.antlr.EntityMockDSLParser.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.ITokenToStringConverter> bindITokenToStringConverter() {
-		return org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
-		return org.eclipse.osbp.xtext.entitymock.parser.antlr.EntityMockDSLAntlrTokenFileProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.Lexer> bindLexer() {
-		return org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer> provideInternalEntityMockDSLLexer() {
-		return org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public void configureRuntimeLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.parser.antlr.LexerBindings.RUNTIME)).to(org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLLexer.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.ITokenDefProvider> bindITokenDefProvider() {
-		return org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.validation.ValidatorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.osbp.xtext.entitymock.validation.EntityMockDSLValidator> bindEntityMockDSLValidator() {
-		return org.eclipse.osbp.xtext.entitymock.validation.EntityMockDSLValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.scoping.AbstractScopingFragment
-	public void configureIgnoreCaseLinking(com.google.inject.Binder binder) {
-		binder.bindConstant().annotatedWith(org.eclipse.xtext.scoping.IgnoreCaseLinking.class).to(false);
-	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public Class<? extends org.eclipse.xtext.resource.IContainer.Manager> bindIContainer$Manager() {
-		return org.eclipse.xtext.resource.containers.StateBasedContainerManager.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public Class<? extends org.eclipse.xtext.resource.containers.IAllContainersState.Provider> bindIAllContainersState$Provider() {
-		return org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public void configureIResourceDescriptions(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).to(org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.builder.BuilderIntegrationFragment
-	public void configureIResourceDescriptionsPersisted(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.formatting.FormatterFragment
-	public Class<? extends org.eclipse.xtext.formatting.IFormatter> bindIFormatter() {
-		return org.eclipse.osbp.xtext.entitymock.formatting.EntityMockDSLFormatter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public org.eclipse.xtext.common.types.TypesFactory bindTypesFactoryToInstance() {
-		return org.eclipse.xtext.common.types.TypesFactory.eINSTANCE;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
-		return org.eclipse.xtext.common.types.access.ClasspathTypeProviderFactory.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider> bindAbstractTypeScopeProvider() {
-		return org.eclipse.xtext.common.types.xtext.ClasspathBasedTypeScopeProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.interpreter.IEvaluationContext> bindIEvaluationContext() {
-		return org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.interpreter.IExpressionInterpreter> bindIExpressionInterpreter() {
-		return org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameConverter> bindIQualifiedNameConverter() {
-		return org.eclipse.xtext.xbase.XbaseQualifiedNameConverter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameProvider> bindIQualifiedNameProvider() {
-		return org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.conversion.IValueConverterService> bindIValueConverterService() {
-		return org.eclipse.xtext.xbase.conversion.XbaseValueConverterService.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.scoping.IScopeProvider> bindIScopeProvider() {
-		return org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public void configureLinkingIScopeProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(org.eclipse.xtext.linking.LinkingScopeProviderBinding.class).to(org.eclipse.xtext.xbase.scoping.batch.IBatchScopeProvider.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public void configureSerializerIScopeProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(org.eclipse.xtext.serializer.tokens.SerializerScopeProviderBinding.class).to(org.eclipse.xtext.xbase.serializer.SerializerScopeProvider.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public void configureIScopeProviderDelegate(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(Names.named(org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(org.eclipse.xtext.xbase.scoping.XbaseImportedNamespaceScopeProvider.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
-		return org.eclipse.xtext.xbase.linking.XbaseLazyLinker.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.XtextResource> bindXtextResource() {
-		return org.eclipse.xtext.xbase.resource.BatchLinkableResource.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.xtext.xbase.validation.JvmTypeReferencesValidator> bindJvmTypeReferencesValidator() {
-		return org.eclipse.xtext.xbase.validation.JvmTypeReferencesValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider> bindIdentifiableSimpleNameProvider() {
-		return org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.IDerivedStateComputer> bindIDerivedStateComputer() {
-		return org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.IResourceDescription.Manager> bindIResourceDescription$Manager() {
-		return org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.generator.IGenerator> bindIGenerator() {
-		return org.eclipse.xtext.xbase.compiler.JvmModelGenerator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public org.eclipse.xtext.xtype.XtypeFactory bindXtypeFactoryToInstance() {
-		return org.eclipse.xtext.xtype.XtypeFactory.eINSTANCE;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.debug.IStratumBreakpointSupport> bindIStratumBreakpointSupport() {
-		return org.eclipse.xtext.xbase.debug.XbaseStratumBreakpointSupport.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.generator.LineSeparatorHarmonizer> bindLineSeparatorHarmonizer() {
-		return org.eclipse.xtext.xbase.compiler.output.TraceAwarePostProcessor.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
-		return org.eclipse.xtext.xbase.resource.XbaseResourceDescriptionStrategy.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.validation.SeverityConverter> bindSeverityConverter() {
-		return org.eclipse.xtext.xbase.validation.XbaseSeverityConverter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.validation.ConfigurableIssueCodesProvider> bindConfigurableIssueCodesProvider() {
-		return org.eclipse.xtext.xbase.validation.XbaseConfigurableIssueCodes.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.EObjectAtOffsetHelper> bindEObjectAtOffsetHelper() {
-		return org.eclipse.xtext.xbase.linking.BrokenConstructorCallAwareEObjectAtOffsetHelper.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.validation.CancelableDiagnostician> bindCancelableDiagnostician() {
-		return org.eclipse.xtext.xbase.validation.XbaseDiagnostician.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.scoping.featurecalls.StaticImplicitMethodsFeatureForTypeProvider.ExtensionClassNameProvider> bindStaticImplicitMethodsFeatureForTypeProvider$ExtensionClassNameProvider() {
-		return org.eclipse.xtext.xbase.scoping.batch.ImplicitlyImportedTypesAdapter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtend.lib.macro.file.MutableFileSystemSupport> bindMutableFileSystemSupport() {
-		return org.eclipse.xtext.xbase.file.JavaIOFileSystemSupport.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtend.lib.macro.file.FileLocations> bindFileLocations() {
-		return org.eclipse.xtext.xbase.file.FileLocationsImpl.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends com.google.inject.Provider<org.eclipse.xtext.xbase.file.WorkspaceConfig>> provideWorkspaceConfig() {
-		return org.eclipse.xtext.xbase.file.RuntimeWorkspaceConfigProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.typesystem.computation.ITypeComputer> bindITypeComputer() {
-		return org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsTypeComputer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider> bindXbaseBatchScopeProvider() {
-		return org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.linking.ILinkingDiagnosticMessageProvider> bindILinkingDiagnosticMessageProvider() {
-		return org.eclipse.xtext.xbase.annotations.validation.UnresolvedAnnotationTypeAwareMessageProducer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.resource.ILocationInFileProvider> bindILocationInFileProvider() {
-		return org.eclipse.xtext.xbase.jvmmodel.JvmLocationInFileProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
-		return org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.validation.FeatureNameValidator> bindFeatureNameValidator() {
-		return org.eclipse.xtext.xbase.validation.LogicalContainerAwareFeatureNameValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.DefaultBatchTypeResolver> bindDefaultBatchTypeResolver() {
-		return org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareBatchTypeResolver.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver> bindDefaultReentrantTypeResolver() {
-		return org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.validation.IResourceValidator> bindIResourceValidator() {
-		return org.eclipse.xtext.xbase.annotations.validation.DerivedStateAwareResourceValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.xbase.XbaseGeneratorFragment
-	public Class<? extends org.eclipse.xtext.xbase.jvmmodel.IJvmModelInferrer> bindIJvmModelInferrer() {
-		return org.eclipse.osbp.xtext.entitymock.jvmmodel.EntityMockDSLJvmModelInferrer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
-	public java.lang.ClassLoader bindClassLoaderToInstance() {
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public ClassLoader bindClassLoaderToInstance() {
 		return getClass().getClassLoader();
 	}
-
-	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
-	public Class<? extends org.eclipse.xtext.IGrammarAccess> bindIGrammarAccess() {
-		return org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return EntityMockDSLGrammarAccess.class;
 	}
-
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return EntityMockDSLSemanticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return EntityMockDSLSyntacticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return EntityMockDSLParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return EntityMockDSLAntlrTokenFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalEntityMockDSLLexer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<? extends InternalEntityMockDSLLexer> provideInternalEntityMockDSLLexer() {
+		return LexerProvider.create(InternalEntityMockDSLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalEntityMockDSLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IUnorderedGroupHelper> bindIUnorderedGroupHelper() {
+		return UnorderedGroupHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends EntityMockDSLValidator> bindEntityMockDSLValidator() {
+		return EntityMockDSLValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IBatchScopeProvider> bindIBatchScopeProvider() {
+		return EntityMockDSLScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIScopeProviderDelegate(Binder binder) {
+		binder.bind(IScopeProvider.class).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(XImportSectionNamespaceScopeProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return XbaseQualifiedNameProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends ILocationInFileProvider> bindILocationInFileProvider() {
+		return JvmLocationInFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return TypesAwareDefaultGlobalScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends FeatureNameValidator> bindFeatureNameValidator() {
+		return LogicalContainerAwareFeatureNameValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultBatchTypeResolver> bindDefaultBatchTypeResolver() {
+		return LogicalContainerAwareBatchTypeResolver.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends DefaultReentrantTypeResolver> bindDefaultReentrantTypeResolver() {
+		return LogicalContainerAwareReentrantTypeResolver.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IResourceValidator> bindIResourceValidator() {
+		return DerivedStateAwareResourceValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.xbase.XbaseGeneratorFragment2
+	public Class<? extends IJvmModelInferrer> bindIJvmModelInferrer() {
+		return EntityMockDSLJvmModelInferrer.class;
+	}
+	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtextbin b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtextbin
new file mode 100644
index 0000000..ebdba4a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtextbin
Binary files differ
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLStandaloneSetupGenerated.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLStandaloneSetupGenerated.java
index 053461e..affb625 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLStandaloneSetupGenerated.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/EntityMockDSLStandaloneSetupGenerated.java
@@ -10,25 +10,26 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock;
 
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.xtext.ISetup;
-import org.eclipse.emf.ecore.resource.Resource;
-
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.osbp.xtext.oxtype.OXtypeStandaloneSetup;
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
 
-/**
- * Generated from StandaloneSetup.xpt!
- */
 @SuppressWarnings("all")
 public class EntityMockDSLStandaloneSetupGenerated implements ISetup {
 
+	@Override
 	public Injector createInjectorAndDoEMFRegistration() {
-		org.eclipse.xtext.xbase.annotations.XbaseWithAnnotationsStandaloneSetup.doSetup();
+		OXtypeStandaloneSetup.doSetup();
 
 		Injector injector = createInjector();
 		register(injector);
@@ -36,18 +37,14 @@
 	}
 	
 	public Injector createInjector() {
-		return Guice.createInjector(new org.eclipse.osbp.xtext.entitymock.EntityMockDSLRuntimeModule());
+		return Guice.createInjector(new EntityMockDSLRuntimeModule());
 	}
 	
 	public void register(Injector injector) {
-
-		org.eclipse.xtext.resource.IResourceFactory resourceFactory = injector.getInstance(org.eclipse.xtext.resource.IResourceFactory.class);
-		org.eclipse.xtext.resource.IResourceServiceProvider serviceProvider = injector.getInstance(org.eclipse.xtext.resource.IResourceServiceProvider.class);
-		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("entitymock", resourceFactory);
-		org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("entitymock", serviceProvider);
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
 		
-
-
-
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("entitymock", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("entitymock", serviceProvider);
 	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLAntlrTokenFileProvider.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLAntlrTokenFileProvider.java
index 46e48d5..fd3ffca 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLAntlrTokenFileProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLAntlrTokenFileProvider.java
@@ -10,6 +10,8 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.parser.antlr;
@@ -18,9 +20,10 @@
 import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
 
 public class EntityMockDSLAntlrTokenFileProvider implements IAntlrTokenFileProvider {
-	
+
+	@Override
 	public InputStream getAntlrTokenFile() {
 		ClassLoader classLoader = getClass().getClassLoader();
-    	return classLoader.getResourceAsStream("org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens");
+		return classLoader.getResourceAsStream("org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens");
 	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLParser.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLParser.java
index 880bb10..f6983ea 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLParser.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/EntityMockDSLParser.java
@@ -10,41 +10,44 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.parser.antlr;
 
 import com.google.inject.Inject;
-
-import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLParser;
 import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
-public class EntityMockDSLParser extends org.eclipse.xtext.parser.antlr.AbstractAntlrParser {
-	
+public class EntityMockDSLParser extends AbstractAntlrParser {
+
 	@Inject
 	private EntityMockDSLGrammarAccess grammarAccess;
-	
+
 	@Override
 	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
 		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
 	}
 	
+
 	@Override
-	protected org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLParser createParser(XtextTokenStream stream) {
-		return new org.eclipse.osbp.xtext.entitymock.parser.antlr.internal.InternalEntityMockDSLParser(stream, getGrammarAccess());
+	protected InternalEntityMockDSLParser createParser(XtextTokenStream stream) {
+		return new InternalEntityMockDSLParser(stream, getGrammarAccess());
 	}
-	
+
 	@Override 
 	protected String getDefaultRuleName() {
 		return "EntityMockModel";
 	}
-	
+
 	public EntityMockDSLGrammarAccess getGrammarAccess() {
 		return this.grammarAccess;
 	}
-	
+
 	public void setGrammarAccess(EntityMockDSLGrammarAccess grammarAccess) {
 		this.grammarAccess = grammarAccess;
 	}
-	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g
index 887b1e2..a0ab2ca 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g
@@ -10,13 +10,14 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 grammar InternalEntityMockDSL;
 
 options {
 	superClass=AbstractInternalAntlrParser;
-	
 }
 
 @lexer::header {
@@ -28,7 +29,7 @@
 }
 
 @parser::header {
-package org.eclipse.osbp.xtext.entitymock.parser.antlr.internal; 
+package org.eclipse.osbp.xtext.entitymock.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -47,9969 +48,11590 @@
 @parser::members {
 
  	private EntityMockDSLGrammarAccess grammarAccess;
- 	
+
     public InternalEntityMockDSLParser(TokenStream input, EntityMockDSLGrammarAccess grammarAccess) {
         this(input);
         this.grammarAccess = grammarAccess;
         registerRules(grammarAccess.getGrammar());
     }
-    
+
     @Override
     protected String getFirstRuleName() {
-    	return "EntityMockModel";	
+    	return "EntityMockModel";
    	}
-   	
+
    	@Override
    	protected EntityMockDSLGrammarAccess getGrammarAccess() {
    		return grammarAccess;
    	}
+
 }
 
-@rulecatch { 
-    catch (RecognitionException re) { 
-        recover(input,re); 
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
         appendSkippedTokens();
-    } 
+    }
 }
 
-
-
-
 // Entry rule entryRuleEntityMockModel
-entryRuleEntityMockModel returns [EObject current=null] 
-	:
+entryRuleEntityMockModel returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockModelRule()); }
-	 iv_ruleEntityMockModel=ruleEntityMockModel 
-	 { $current=$iv_ruleEntityMockModel.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockModel=ruleEntityMockModel
+	{ $current=$iv_ruleEntityMockModel.current; }
+	EOF;
 
 // Rule EntityMockModel
-ruleEntityMockModel returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_0()); 
-	    }
-		lv_packages_0_0=ruleEntityMockPackage		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
-	        }
-       		add(
-       			$current, 
-       			"packages",
-        		lv_packages_0_0, 
-        		"EntityMockPackage");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*
+ruleEntityMockModel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
+				}
+				lv_importSection_0_0=ruleXImportSection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
+					}
+					set(
+						$current,
+						"importSection",
+						lv_importSection_0_0,
+						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0());
+				}
+				lv_packages_1_0=ruleEntityMockPackage
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
+					}
+					add(
+						$current,
+						"packages",
+						lv_packages_1_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockPackage");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockPackage
-entryRuleEntityMockPackage returns [EObject current=null] 
-	:
+entryRuleEntityMockPackage returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockPackageRule()); }
-	 iv_ruleEntityMockPackage=ruleEntityMockPackage 
-	 { $current=$iv_ruleEntityMockPackage.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockPackage=ruleEntityMockPackage
+	{ $current=$iv_ruleEntityMockPackage.current; }
+	EOF;
 
 // Rule EntityMockPackage
-ruleEntityMockPackage returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='mock entitymodel for' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockPackageAccess().getMockEntitymodelForKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getImportsEntityModelImportParserRuleCall_1_0()); 
-	    }
-		lv_imports_1_0=ruleEntityModelImport		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		add(
-       			$current, 
-       			"imports",
-        		lv_imports_1_0, 
-        		"EntityModelImport");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_2());
-    }
-(	otherlv_3='run with priority' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockPackageAccess().getRunWithPriorityKeyword_3_0());
-    }
-(
-(
-		lv_runPriority_4_0=RULE_INT
+ruleEntityMockPackage returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='package'
 		{
-			newLeafNode(lv_runPriority_4_0, grammarAccess.getEntityMockPackageAccess().getRunPriorityINTTerminalRuleCall_3_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleQualifiedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_3='{'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0());
+					}
+					lv_mocks_4_0=ruleEntityMock
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
+						}
+						add(
+							$current,
+							"mocks",
+							lv_mocks_4_0,
+							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMock");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_5='}'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleEntityMock
+entryRuleEntityMock returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEntityMockRule()); }
+	iv_ruleEntityMock=ruleEntityMock
+	{ $current=$iv_ruleEntityMock.current; }
+	EOF;
+
+// Rule EntityMock
+ruleEntityMock returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockAccess().getEntityMockAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mock'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockPackageRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"runPriority",
-        		lv_runPriority_4_0, 
-        		"INT");
-	    }
-
-)
-))?(	otherlv_5='import' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockPackageAccess().getImportKeyword_4_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getImportsEntityModelImportParserRuleCall_4_1_0()); 
-	    }
-		lv_imports_6_0=ruleEntityModelImport		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		add(
-       			$current, 
-       			"imports",
-        		lv_imports_6_0, 
-        		"EntityModelImport");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_5_0()); 
-	    }
-		lv_datainterchanges_7_0=ruleRunningDataInterchanges		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		set(
-       			$current, 
-       			"datainterchanges",
-        		lv_datainterchanges_7_0, 
-        		"RunningDataInterchanges");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getResourcesEntityMockResourcesParserRuleCall_6_0()); 
-	    }
-		lv_resources_8_0=ruleEntityMockResources		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		set(
-       			$current, 
-       			"resources",
-        		lv_resources_8_0, 
-        		"EntityMockResources");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getObjectsEntityMockObjectsParserRuleCall_7_0()); 
-	    }
-		lv_objects_9_0=ruleEntityMockObjects		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		set(
-       			$current, 
-       			"objects",
-        		lv_objects_9_0, 
-        		"EntityMockObjects");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getDatatypesEntityMockDataTypesParserRuleCall_8_0()); 
-	    }
-		lv_datatypes_10_0=ruleEntityMockDataTypes		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		set(
-       			$current, 
-       			"datatypes",
-        		lv_datatypes_10_0, 
-        		"EntityMockDataTypes");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getEntitiesEntityMockEntitiesParserRuleCall_9_0()); 
-	    }
-		lv_entities_11_0=ruleEntityMockEntities		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-	        }
-       		set(
-       			$current, 
-       			"entities",
-        		lv_entities_11_0, 
-        		"EntityMockEntities");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_12='}' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_10());
-    }
-)
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockAccess().getMockKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			(
+				(
+					lv_description_3_0='describedBy'
+					{
+						newLeafNode(lv_description_3_0, grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockRule());
+						}
+						setWithLastConsumed($current, "description", true, "describedBy");
+					}
+				)
+			)
+			(
+				(
+					lv_descriptionValue_4_0=RULE_STRING
+					{
+						newLeafNode(lv_descriptionValue_4_0, grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"descriptionValue",
+							lv_descriptionValue_4_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		(
+			otherlv_5='{'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0());
+			}
+			(
+				(
+					{ 
+					  getUnorderedGroupHelper().enter(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+					}
+					(
+						(
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0);
+						}
+									({true}?=>(otherlv_7='priority'
+									{
+										newLeafNode(otherlv_7, grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0());
+									}
+									(
+										(
+											lv_runPriority_8_0=RULE_INT
+											{
+												newLeafNode(lv_runPriority_8_0, grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getEntityMockRule());
+												}
+												setWithLastConsumed(
+													$current,
+													"runPriority",
+													lv_runPriority_8_0,
+													"org.eclipse.xtext.xbase.Xbase.INT");
+											}
+										)
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0());
+										}
+										lv_datainterchanges_9_0=ruleRunningDataInterchanges
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getEntityMockRule());
+											}
+											set(
+												$current,
+												"datainterchanges",
+												lv_datainterchanges_9_0,
+												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchanges");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0());
+										}
+										lv_resources_10_0=ruleEntityMockResources
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getEntityMockRule());
+											}
+											set(
+												$current,
+												"resources",
+												lv_resources_10_0,
+												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResources");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0());
+										}
+										lv_objects_11_0=ruleEntityMockObjects
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getEntityMockRule());
+											}
+											set(
+												$current,
+												"objects",
+												lv_objects_11_0,
+												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjects");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)|
+				(
+					{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4)}?=>(
+						{
+							getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4);
+						}
+									({true}?=>((
+										{
+											newCompositeNode(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0());
+										}
+										lv_entities_12_0=ruleEntityMockEntities
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getEntityMockRule());
+											}
+											set(
+												$current,
+												"entities",
+												lv_entities_12_0,
+												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntities");
+											afterParserOrEnumRuleCall();
+										}
+									)
+									))
+						{ 
+							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+						}
+					)
+				)
+						)+
+						{getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1())}?
+					)
+				)
+					{ 
+					  getUnorderedGroupHelper().leave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+					}
+			)
+			otherlv_13='}'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2());
+			}
+		)?
+	)
 ;
 
-
-
-
-
-// Entry rule entryRuleEntityModelImport
-entryRuleEntityModelImport returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getEntityModelImportRule()); }
-	 iv_ruleEntityModelImport=ruleEntityModelImport 
-	 { $current=$iv_ruleEntityModelImport.current; } 
-	 EOF 
-;
-
-// Rule EntityModelImport
-ruleEntityModelImport returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityModelImportAccess().getImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0()); 
-	    }
-		lv_importedNamespace_0_0=ruleEntityMockQualifiedNameWithWildCard		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityModelImportRule());
-	        }
-       		set(
-       			$current, 
-       			"importedNamespace",
-        		lv_importedNamespace_0_0, 
-        		"EntityMockQualifiedNameWithWildCard");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-;
-
-
-
-
-
-// Entry rule entryRuleEntityMockQualifiedNameWithWildCard
-entryRuleEntityMockQualifiedNameWithWildCard returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getEntityMockQualifiedNameWithWildCardRule()); } 
-	 iv_ruleEntityMockQualifiedNameWithWildCard=ruleEntityMockQualifiedNameWithWildCard 
-	 { $current=$iv_ruleEntityMockQualifiedNameWithWildCard.current.getText(); }  
-	 EOF 
-;
-
-// Rule EntityMockQualifiedNameWithWildCard
-ruleEntityMockQualifiedNameWithWildCard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getQualifiedNameParserRuleCall_0()); 
-    }
-    this_QualifiedName_0=ruleQualifiedName    {
-		$current.merge(this_QualifiedName_0);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-(
-	kw='.' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getFullStopKeyword_1_0()); 
-    }
-
-	kw='*' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getAsteriskKeyword_1_1()); 
-    }
-)?)
-    ;
-
-
-
-
-
 // Entry rule entryRuleRunningDataInterchanges
-entryRuleRunningDataInterchanges returns [EObject current=null] 
-	:
+entryRuleRunningDataInterchanges returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getRunningDataInterchangesRule()); }
-	 iv_ruleRunningDataInterchanges=ruleRunningDataInterchanges 
-	 { $current=$iv_ruleRunningDataInterchanges.current; } 
-	 EOF 
-;
+	iv_ruleRunningDataInterchanges=ruleRunningDataInterchanges
+	{ $current=$iv_ruleRunningDataInterchanges.current; }
+	EOF;
 
 // Rule RunningDataInterchanges
-ruleRunningDataInterchanges returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0(),
-            $current);
-    }
-)	otherlv_1='datainterchanges' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); 
-	    }
-		lv_datainterchanges_3_0=ruleRunningDataInterchange		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getRunningDataInterchangesRule());
-	        }
-       		add(
-       			$current, 
-       			"datainterchanges",
-        		lv_datainterchanges_3_0, 
-        		"RunningDataInterchange");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4());
-    }
-)
+ruleRunningDataInterchanges returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='datainterchanges'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0());
+				}
+				lv_datainterchanges_3_0=ruleRunningDataInterchange
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRunningDataInterchangesRule());
+					}
+					add(
+						$current,
+						"datainterchanges",
+						lv_datainterchanges_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchange");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleRunningDataInterchange
-entryRuleRunningDataInterchange returns [EObject current=null] 
-	:
+entryRuleRunningDataInterchange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getRunningDataInterchangeRule()); }
-	 iv_ruleRunningDataInterchange=ruleRunningDataInterchange 
-	 { $current=$iv_ruleRunningDataInterchange.current; } 
-	 EOF 
-;
+	iv_ruleRunningDataInterchange=ruleRunningDataInterchange
+	{ $current=$iv_ruleRunningDataInterchange.current; }
+	EOF;
 
 // Rule RunningDataInterchange
-ruleRunningDataInterchange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0(),
-            $current);
-    }
-)	otherlv_1='datainterchange import' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeImportKeyword_1());
-    }
-(
-(
+ruleRunningDataInterchange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='datainterchange'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); 
-	}
-
-)
-)	otherlv_3='from file' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getRunningDataInterchangeAccess().getFromFileKeyword_3());
-    }
-(
-(
-		lv_fileURL_4_0=RULE_STRING
-		{
-			newLeafNode(lv_fileURL_4_0, grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1());
 		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0());
+				}
+			)
+		)
+		otherlv_3='file'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"fileURL",
-        		lv_fileURL_4_0, 
-        		"STRING");
-	    }
-
-)
-))
+			newLeafNode(otherlv_3, grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3());
+		}
+		(
+			(
+				lv_fileURL_4_0=RULE_STRING
+				{
+					newLeafNode(lv_fileURL_4_0, grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"fileURL",
+						lv_fileURL_4_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockResources
-entryRuleEntityMockResources returns [EObject current=null] 
-	:
+entryRuleEntityMockResources returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockResourcesRule()); }
-	 iv_ruleEntityMockResources=ruleEntityMockResources 
-	 { $current=$iv_ruleEntityMockResources.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockResources=ruleEntityMockResources
+	{ $current=$iv_ruleEntityMockResources.current; }
+	EOF;
 
 // Rule EntityMockResources
-ruleEntityMockResources returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0(),
-            $current);
-    }
-)	otherlv_1='resources' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); 
-	    }
-		lv_resources_3_0=ruleEntityMockResource		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourcesRule());
-	        }
-       		add(
-       			$current, 
-       			"resources",
-        		lv_resources_3_0, 
-        		"EntityMockResource");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4());
-    }
-)
+ruleEntityMockResources returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='resources'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0());
+				}
+				lv_resources_3_0=ruleEntityMockResource
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockResourcesRule());
+					}
+					add(
+						$current,
+						"resources",
+						lv_resources_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResource");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockResource
-entryRuleEntityMockResource returns [EObject current=null] 
-	:
+entryRuleEntityMockResource returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockResourceRule()); }
-	 iv_ruleEntityMockResource=ruleEntityMockResource 
-	 { $current=$iv_ruleEntityMockResource.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockResource=ruleEntityMockResource
+	{ $current=$iv_ruleEntityMockResource.current; }
+	EOF;
 
 // Rule EntityMockResource
-ruleEntityMockResource returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='resource' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2());
-    }
-(	otherlv_3='attributes' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0());
-    }
-	otherlv_4='(' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); 
-	    }
-		lv_attributes_5_0=ruleEntityMockResourceAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-	        }
-       		add(
-       			$current, 
-       			"attributes",
-        		lv_attributes_5_0, 
-        		"EntityMockResourceAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_6=',' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1());
-    }
-)?)*	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3());
-    }
-)?	otherlv_8='items' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4());
-    }
-	otherlv_9='{' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); 
-	    }
-		lv_datarows_10_0=ruleEntityMockResourceDataRow		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-	        }
-       		add(
-       			$current, 
-       			"datarows",
-        		lv_datarows_10_0, 
-        		"EntityMockResourceDataRow");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_11='}' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7());
-    }
-	otherlv_12='}' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8());
-    }
-)
+ruleEntityMockResource returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='resource'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockResourceRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			otherlv_3='attributes'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0());
+			}
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0());
+						}
+						lv_attributes_5_0=ruleEntityMockResourceAttribute
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
+							}
+							add(
+								$current,
+								"attributes",
+								lv_attributes_5_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceAttribute");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_6=','
+					{
+						newLeafNode(otherlv_6, grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1());
+					}
+				)?
+			)*
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3());
+			}
+		)?
+		otherlv_8='items'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4());
+		}
+		otherlv_9='{'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0());
+				}
+				lv_datarows_10_0=ruleEntityMockResourceDataRow
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
+					}
+					add(
+						$current,
+						"datarows",
+						lv_datarows_10_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceDataRow");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_11='}'
+		{
+			newLeafNode(otherlv_11, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7());
+		}
+		otherlv_12='}'
+		{
+			newLeafNode(otherlv_12, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockResourceAttribute
-entryRuleEntityMockResourceAttribute returns [EObject current=null] 
-	:
+entryRuleEntityMockResourceAttribute returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockResourceAttributeRule()); }
-	 iv_ruleEntityMockResourceAttribute=ruleEntityMockResourceAttribute 
-	 { $current=$iv_ruleEntityMockResourceAttribute.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockResourceAttribute=ruleEntityMockResourceAttribute
+	{ $current=$iv_ruleEntityMockResourceAttribute.current; }
+	EOF;
 
 // Rule EntityMockResourceAttribute
-ruleEntityMockResourceAttribute returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourceAttributeAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourceAttributeRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleEntityMockResourceAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockResourceAttributeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockResourceDataRow
-entryRuleEntityMockResourceDataRow returns [EObject current=null] 
-	:
+entryRuleEntityMockResourceDataRow returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockResourceDataRowRule()); }
-	 iv_ruleEntityMockResourceDataRow=ruleEntityMockResourceDataRow 
-	 { $current=$iv_ruleEntityMockResourceDataRow.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockResourceDataRow=ruleEntityMockResourceDataRow
+	{ $current=$iv_ruleEntityMockResourceDataRow.current; }
+	EOF;
 
 // Rule EntityMockResourceDataRow
-ruleEntityMockResourceDataRow returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockResourceDataRowAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockResourceDataRowRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0());
-    }
-((
-(
-		lv_values_3_0=RULE_STRING
-		{
-			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
-	        }
-       		addWithLastConsumed(
-       			$current, 
-       			"values",
-        		lv_values_3_0, 
-        		"STRING");
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1());
-    }
-)?)*	otherlv_5=')' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2());
-    }
-)?)
+ruleEntityMockResourceDataRow returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					(
+						lv_values_3_0=RULE_STRING
+						{
+							newLeafNode(lv_values_3_0, grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
+							}
+							addWithLastConsumed(
+								$current,
+								"values",
+								lv_values_3_0,
+								"org.eclipse.xtext.xbase.Xtype.STRING");
+						}
+					)
+				)
+				(
+					otherlv_4=','
+					{
+						newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1());
+					}
+				)?
+			)*
+			otherlv_5=')'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjects
-entryRuleEntityMockObjects returns [EObject current=null] 
-	:
+entryRuleEntityMockObjects returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectsRule()); }
-	 iv_ruleEntityMockObjects=ruleEntityMockObjects 
-	 { $current=$iv_ruleEntityMockObjects.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjects=ruleEntityMockObjects
+	{ $current=$iv_ruleEntityMockObjects.current; }
+	EOF;
 
 // Rule EntityMockObjects
-ruleEntityMockObjects returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0(),
-            $current);
-    }
-)	otherlv_1='objects' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); 
-	    }
-		lv_objects_3_0=ruleEntityMockObject		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectsRule());
-	        }
-       		add(
-       			$current, 
-       			"objects",
-        		lv_objects_3_0, 
-        		"EntityMockObject");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4());
-    }
-)
+ruleEntityMockObjects returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='objects'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0());
+				}
+				lv_objects_3_0=ruleEntityMockObject
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectsRule());
+					}
+					add(
+						$current,
+						"objects",
+						lv_objects_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObject");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObject
-entryRuleEntityMockObject returns [EObject current=null] 
-	:
+entryRuleEntityMockObject returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectRule()); }
-	 iv_ruleEntityMockObject=ruleEntityMockObject 
-	 { $current=$iv_ruleEntityMockObject.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObject=ruleEntityMockObject
+	{ $current=$iv_ruleEntityMockObject.current; }
+	EOF;
 
 // Rule EntityMockObject
-ruleEntityMockObject returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='object' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); 
-	    }
-		lv_enumerations_3_0=ruleEntityMockObjectEnum		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-	        }
-       		add(
-       			$current, 
-       			"enumerations",
-        		lv_enumerations_3_0, 
-        		"EntityMockObjectEnum");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); 
-	    }
-		lv_attributes_4_0=ruleIEntityMockObjectAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-	        }
-       		add(
-       			$current, 
-       			"attributes",
-        		lv_attributes_4_0, 
-        		"IEntityMockObjectAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); 
-	    }
-		lv_calculations_5_0=ruleEntityMockObjectFunction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-	        }
-       		add(
-       			$current, 
-       			"calculations",
-        		lv_calculations_5_0, 
-        		"EntityMockObjectFunction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_6='}' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6());
-    }
-)
+ruleEntityMockObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='object'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0());
+				}
+				lv_enumerations_3_0=ruleEntityMockObjectEnum
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+					}
+					add(
+						$current,
+						"enumerations",
+						lv_enumerations_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectEnum");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0());
+				}
+				lv_attributes_4_0=ruleIEntityMockObjectAttribute
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+					}
+					add(
+						$current,
+						"attributes",
+						lv_attributes_4_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockObjectAttribute");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0());
+				}
+				lv_calculations_5_0=ruleEntityMockObjectFunction
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+					}
+					add(
+						$current,
+						"calculations",
+						lv_calculations_5_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunction");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectEnum
-entryRuleEntityMockObjectEnum returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectEnum returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectEnumRule()); }
-	 iv_ruleEntityMockObjectEnum=ruleEntityMockObjectEnum 
-	 { $current=$iv_ruleEntityMockObjectEnum.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectEnum=ruleEntityMockObjectEnum
+	{ $current=$iv_ruleEntityMockObjectEnum.current; }
+	EOF;
 
 // Rule EntityMockObjectEnum
-ruleEntityMockObjectEnum returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectEnumAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectEnumRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='by enum' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2());
-    }
-(
-(
+ruleEntityMockObjectEnum returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='byEnum'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
-// Entry rule entryRuleEntityMockDataTypes
-entryRuleEntityMockDataTypes returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getEntityMockDataTypesRule()); }
-	 iv_ruleEntityMockDataTypes=ruleEntityMockDataTypes 
-	 { $current=$iv_ruleEntityMockDataTypes.current; } 
-	 EOF 
-;
-
-// Rule EntityMockDataTypes
-ruleEntityMockDataTypes returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockDataTypesAccess().getEntityMockDataTypesAction_0(),
-            $current);
-    }
-)	otherlv_1='datatypes' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockDataTypesAccess().getDatatypesKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockDataTypesAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockDataTypesAccess().getDatatypesEntityMockDataTypeParserRuleCall_3_0()); 
-	    }
-		lv_datatypes_3_0=ruleEntityMockDataType		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockDataTypesRule());
-	        }
-       		add(
-       			$current, 
-       			"datatypes",
-        		lv_datatypes_3_0, 
-        		"EntityMockDataType");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockDataTypesAccess().getRightCurlyBracketKeyword_4());
-    }
-)
-;
-
-
-
-
-
-
-
 // Entry rule entryRuleIEntityMockObjectAttribute
-entryRuleIEntityMockObjectAttribute returns [EObject current=null] 
-	:
+entryRuleIEntityMockObjectAttribute returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getIEntityMockObjectAttributeRule()); }
-	 iv_ruleIEntityMockObjectAttribute=ruleIEntityMockObjectAttribute 
-	 { $current=$iv_ruleIEntityMockObjectAttribute.current; } 
-	 EOF 
-;
+	iv_ruleIEntityMockObjectAttribute=ruleIEntityMockObjectAttribute
+	{ $current=$iv_ruleIEntityMockObjectAttribute.current; }
+	EOF;
 
 // Rule IEntityMockObjectAttribute
-ruleIEntityMockObjectAttribute returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); 
-    }
-    this_EntityMockObjectResourceValue_0=ruleEntityMockObjectResourceValue
-    { 
-        $current = $this_EntityMockObjectResourceValue_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); 
-    }
-    this_EntityMockObjectPlainValue_1=ruleEntityMockObjectPlainValue
-    { 
-        $current = $this_EntityMockObjectPlainValue_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); 
-    }
-    this_EntityMockObjectArrayValue_2=ruleEntityMockObjectArrayValue
-    { 
-        $current = $this_EntityMockObjectArrayValue_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); 
-    }
-    this_EntityMockObjectEmbed_3=ruleEntityMockObjectEmbed
-    { 
-        $current = $this_EntityMockObjectEmbed_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); 
-    }
-    this_EntityMockObjectFill_4=ruleEntityMockObjectFill
-    { 
-        $current = $this_EntityMockObjectFill_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleIEntityMockObjectAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0());
+		}
+		this_EntityMockObjectResourceValue_0=ruleEntityMockObjectResourceValue
+		{
+			$current = $this_EntityMockObjectResourceValue_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1());
+		}
+		this_EntityMockObjectPlainValue_1=ruleEntityMockObjectPlainValue
+		{
+			$current = $this_EntityMockObjectPlainValue_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2());
+		}
+		this_EntityMockObjectArrayValue_2=ruleEntityMockObjectArrayValue
+		{
+			$current = $this_EntityMockObjectArrayValue_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3());
+		}
+		this_EntityMockObjectEmbed_3=ruleEntityMockObjectEmbed
+		{
+			$current = $this_EntityMockObjectEmbed_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4());
+		}
+		this_EntityMockObjectFill_4=ruleEntityMockObjectFill
+		{
+			$current = $this_EntityMockObjectFill_4.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectPlainValue
-entryRuleEntityMockObjectPlainValue returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectPlainValue returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectPlainValueRule()); }
-	 iv_ruleEntityMockObjectPlainValue=ruleEntityMockObjectPlainValue 
-	 { $current=$iv_ruleEntityMockObjectPlainValue.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectPlainValue=ruleEntityMockObjectPlainValue
+	{ $current=$iv_ruleEntityMockObjectPlainValue.current; }
+	EOF;
 
 // Rule EntityMockObjectPlainValue
-ruleEntityMockObjectPlainValue returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectPlainValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectPlainValueRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2());
-    }
-((
-(
-		lv_values_3_0=RULE_STRING
+ruleEntityMockObjectPlainValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='('
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
-	        }
-       		addWithLastConsumed(
-       			$current, 
-       			"values",
-        		lv_values_3_0, 
-        		"STRING");
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1());
-    }
-)?)*	otherlv_5=')' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				(
+					lv_values_3_0=RULE_STRING
+					{
+						newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
+						}
+						addWithLastConsumed(
+							$current,
+							"values",
+							lv_values_3_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1());
+				}
+			)?
+		)*
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectResourceValue
-entryRuleEntityMockObjectResourceValue returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectResourceValue returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectResourceValueRule()); }
-	 iv_ruleEntityMockObjectResourceValue=ruleEntityMockObjectResourceValue 
-	 { $current=$iv_ruleEntityMockObjectResourceValue.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectResourceValue=ruleEntityMockObjectResourceValue
+	{ $current=$iv_ruleEntityMockObjectResourceValue.current; }
+	EOF;
 
 // Rule EntityMockObjectResourceValue
-ruleEntityMockObjectResourceValue returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectResourceValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectResourceValueRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='with' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2());
-    }
-(
-(
+ruleEntityMockObjectResourceValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); 
-	}
-
-)
-)(	otherlv_4='.' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0());
-    }
-(
-(
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='with'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); 
-	}
-
-)
-))?)
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0());
+				}
+			)
+		)
+		(
+			otherlv_4='.'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+						}
+					}
+					otherlv_5=RULE_ID
+					{
+						newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0());
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectArrayValue
-entryRuleEntityMockObjectArrayValue returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectArrayValue returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectArrayValueRule()); }
-	 iv_ruleEntityMockObjectArrayValue=ruleEntityMockObjectArrayValue 
-	 { $current=$iv_ruleEntityMockObjectArrayValue.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectArrayValue=ruleEntityMockObjectArrayValue
+	{ $current=$iv_ruleEntityMockObjectArrayValue.current; }
+	EOF;
 
 // Rule EntityMockObjectArrayValue
-ruleEntityMockObjectArrayValue returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='switch on' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2());
-    }
-(
-(
+ruleEntityMockObjectArrayValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); 
-	}
-
-)
-)	otherlv_4='{' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); 
-	    }
-		lv_items_5_0=ruleEntityMockObjectItemValue		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
-	        }
-       		add(
-       			$current, 
-       			"items",
-        		lv_items_5_0, 
-        		"EntityMockObjectItemValue");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_6='}' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6());
-    }
-)
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='switchOn'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0());
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0());
+				}
+				lv_items_5_0=ruleEntityMockObjectItemValue
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
+					}
+					add(
+						$current,
+						"items",
+						lv_items_5_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectItemValue");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectItemValue
-entryRuleEntityMockObjectItemValue returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectItemValue returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectItemValueRule()); }
-	 iv_ruleEntityMockObjectItemValue=ruleEntityMockObjectItemValue 
-	 { $current=$iv_ruleEntityMockObjectItemValue.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectItemValue=ruleEntityMockObjectItemValue
+	{ $current=$iv_ruleEntityMockObjectItemValue.current; }
+	EOF;
 
 // Rule EntityMockObjectItemValue
-ruleEntityMockObjectItemValue returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='when' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0());
-    }
-(
-(
+ruleEntityMockObjectItemValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='when'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2());
-    }
-((
-(
-		lv_values_3_0=RULE_STRING
-		{
-			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0());
 		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2='('
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
-	        }
-       		addWithLastConsumed(
-       			$current, 
-       			"values",
-        		lv_values_3_0, 
-        		"STRING");
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1());
-    }
-)?)*	otherlv_5=')' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				(
+					lv_values_3_0=RULE_STRING
+					{
+						newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
+						}
+						addWithLastConsumed(
+							$current,
+							"values",
+							lv_values_3_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1());
+				}
+			)?
+		)*
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectEmbed
-entryRuleEntityMockObjectEmbed returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectEmbed returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectEmbedRule()); }
-	 iv_ruleEntityMockObjectEmbed=ruleEntityMockObjectEmbed 
-	 { $current=$iv_ruleEntityMockObjectEmbed.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectEmbed=ruleEntityMockObjectEmbed
+	{ $current=$iv_ruleEntityMockObjectEmbed.current; }
+	EOF;
 
 // Rule EntityMockObjectEmbed
-ruleEntityMockObjectEmbed returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0(),
-            $current);
-    }
-)	otherlv_1='embed' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectEmbedAccess().getNameQualifiedNameParserRuleCall_2_0()); 
-	    }
-		lv_name_2_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectEmbedRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_2_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_3='defined as' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3());
-    }
-(
-(
+ruleEntityMockObjectEmbed returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='embed'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
-	        }
-        }
-	otherlv_4=RULE_ID
-	{
-		newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1());
+		}
+		(
+			(
+				lv_name_2_0=RULE_ID
+				{
+					newLeafNode(lv_name_2_0, grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_3='definedAs'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
+					}
+				}
+				otherlv_4=RULE_ID
+				{
+					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectFunction
-entryRuleEntityMockObjectFunction returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectFunction returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectFunctionRule()); }
-	 iv_ruleEntityMockObjectFunction=ruleEntityMockObjectFunction 
-	 { $current=$iv_ruleEntityMockObjectFunction.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectFunction=ruleEntityMockObjectFunction
+	{ $current=$iv_ruleEntityMockObjectFunction.current; }
+	EOF;
 
 // Rule EntityMockObjectFunction
-ruleEntityMockObjectFunction returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='calculate as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); 
-	    }
-		lv_oftype_3_0=ruleJvmParameterizedTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-	        }
-       		set(
-       			$current, 
-       			"oftype",
-        		lv_oftype_3_0, 
-        		"JvmParameterizedTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='based on' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4());
-    }
-	otherlv_5='(' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); 
-	    }
-		lv_params_6_0=ruleEntityMockObjectFunctionParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-	        }
-       		add(
-       			$current, 
-       			"params",
-        		lv_params_6_0, 
-        		"EntityMockObjectFunctionParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_7=',' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); 
-	    }
-		lv_params_8_0=ruleEntityMockObjectFunctionParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-	        }
-       		add(
-       			$current, 
-       			"params",
-        		lv_params_8_0, 
-        		"EntityMockObjectFunctionParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_9=')' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); 
-	    }
-		lv_body_10_0=ruleXBlockExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-	        }
-       		set(
-       			$current, 
-       			"body",
-        		lv_body_10_0, 
-        		"XBlockExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleEntityMockObjectFunction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectFunctionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='calculateAs'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0());
+				}
+				lv_oftype_3_0=ruleJvmParameterizedTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+					}
+					set(
+						$current,
+						"oftype",
+						lv_oftype_3_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='basedOn'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4());
+		}
+		otherlv_5='('
+		{
+			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0());
+					}
+					lv_params_6_0=ruleEntityMockObjectFunctionParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+						}
+						add(
+							$current,
+							"params",
+							lv_params_6_0,
+							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunctionParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_7=','
+				{
+					newLeafNode(otherlv_7, grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0());
+						}
+						lv_params_8_0=ruleEntityMockObjectFunctionParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+							}
+							add(
+								$current,
+								"params",
+								lv_params_8_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunctionParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_9=')'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0());
+				}
+				lv_body_10_0=ruleXBlockExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+					}
+					set(
+						$current,
+						"body",
+						lv_body_10_0,
+						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectFunctionParameter
-entryRuleEntityMockObjectFunctionParameter returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectFunctionParameter returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterRule()); }
-	 iv_ruleEntityMockObjectFunctionParameter=ruleEntityMockObjectFunctionParameter 
-	 { $current=$iv_ruleEntityMockObjectFunctionParameter.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectFunctionParameter=ruleEntityMockObjectFunctionParameter
+	{ $current=$iv_ruleEntityMockObjectFunctionParameter.current; }
+	EOF;
 
 // Rule EntityMockObjectFunctionParameter
-ruleEntityMockObjectFunctionParameter returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
-	    }
-		lv_parameterType_0_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionParameterRule());
-	        }
-       		set(
-       			$current, 
-       			"parameterType",
-        		lv_parameterType_0_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockObjectFunctionParameterRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); 
-	}
-
-)
-))
+ruleEntityMockObjectFunctionParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+				}
+				lv_parameterType_0_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionParameterRule());
+					}
+					set(
+						$current,
+						"parameterType",
+						lv_parameterType_0_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectFunctionParameterRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockObjectFill
-entryRuleEntityMockObjectFill returns [EObject current=null] 
-	:
+entryRuleEntityMockObjectFill returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockObjectFillRule()); }
-	 iv_ruleEntityMockObjectFill=ruleEntityMockObjectFill 
-	 { $current=$iv_ruleEntityMockObjectFill.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockObjectFill=ruleEntityMockObjectFill
+	{ $current=$iv_ruleEntityMockObjectFill.current; }
+	EOF;
 
 // Rule EntityMockObjectFill
-ruleEntityMockObjectFill returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='randomize' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
-	    }
-		lv_fillerType_3_0=rulePropertyFillerType		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
-	        }
-       		set(
-       			$current, 
-       			"fillerType",
-        		lv_fillerType_3_0, 
-        		"PropertyFillerType");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleEntityMockObjectFill returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockObjectFillRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='randomize'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0());
+				}
+				lv_fillerType_3_0=rulePropertyFillerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
+					}
+					set(
+						$current,
+						"fillerType",
+						lv_fillerType_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerType
-entryRulePropertyFillerType returns [EObject current=null] 
-	:
+entryRulePropertyFillerType returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerTypeRule()); }
-	 iv_rulePropertyFillerType=rulePropertyFillerType 
-	 { $current=$iv_rulePropertyFillerType.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerType=rulePropertyFillerType
+	{ $current=$iv_rulePropertyFillerType.current; }
+	EOF;
 
 // Rule PropertyFillerType
-rulePropertyFillerType returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); 
-    }
-    this_PropertyFillerDateFuture_0=rulePropertyFillerDateFuture
-    { 
-        $current = $this_PropertyFillerDateFuture_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); 
-    }
-    this_PropertyFillerDatePast_1=rulePropertyFillerDatePast
-    { 
-        $current = $this_PropertyFillerDatePast_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); 
-    }
-    this_PropertyFillerDateRange_2=rulePropertyFillerDateRange
-    { 
-        $current = $this_PropertyFillerDateRange_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); 
-    }
-    this_PropertyFillerBoolean_3=rulePropertyFillerBoolean
-    { 
-        $current = $this_PropertyFillerBoolean_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); 
-    }
-    this_PropertyFillerSignedDoubleRange_4=rulePropertyFillerSignedDoubleRange
-    { 
-        $current = $this_PropertyFillerSignedDoubleRange_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); 
-    }
-    this_PropertyFillerSignedDoubleRandom_5=rulePropertyFillerSignedDoubleRandom
-    { 
-        $current = $this_PropertyFillerSignedDoubleRandom_5.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); 
-    }
-    this_PropertyFillerSignedIntegerRange_6=rulePropertyFillerSignedIntegerRange
-    { 
-        $current = $this_PropertyFillerSignedIntegerRange_6.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); 
-    }
-    this_PropertyFillerSignedIntegerRandom_7=rulePropertyFillerSignedIntegerRandom
-    { 
-        $current = $this_PropertyFillerSignedIntegerRandom_7.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); 
-    }
-    this_PropertyFillerTextRandom_8=rulePropertyFillerTextRandom
-    { 
-        $current = $this_PropertyFillerTextRandom_8.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); 
-    }
-    this_PropertyFillerTextParagraphs_9=rulePropertyFillerTextParagraphs
-    { 
-        $current = $this_PropertyFillerTextParagraphs_9.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); 
-    }
-    this_PropertyFillerTextSentences_10=rulePropertyFillerTextSentences
-    { 
-        $current = $this_PropertyFillerTextSentences_10.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); 
-    }
-    this_PropertyFillerTextWords_11=rulePropertyFillerTextWords
-    { 
-        $current = $this_PropertyFillerTextWords_11.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); 
-    }
-    this_PropertyFillerUnsignedDoubleRange_12=rulePropertyFillerUnsignedDoubleRange
-    { 
-        $current = $this_PropertyFillerUnsignedDoubleRange_12.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); 
-    }
-    this_PropertyFillerUnsignedDoubleRandom_13=rulePropertyFillerUnsignedDoubleRandom
-    { 
-        $current = $this_PropertyFillerUnsignedDoubleRandom_13.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); 
-    }
-    this_PropertyFillerUnsignedIntegerRange_14=rulePropertyFillerUnsignedIntegerRange
-    { 
-        $current = $this_PropertyFillerUnsignedIntegerRange_14.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); 
-    }
-    this_PropertyFillerUnsignedIntegerRandom_15=rulePropertyFillerUnsignedIntegerRandom
-    { 
-        $current = $this_PropertyFillerUnsignedIntegerRandom_15.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+rulePropertyFillerType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0());
+		}
+		this_PropertyFillerDateFuture_0=rulePropertyFillerDateFuture
+		{
+			$current = $this_PropertyFillerDateFuture_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1());
+		}
+		this_PropertyFillerDatePast_1=rulePropertyFillerDatePast
+		{
+			$current = $this_PropertyFillerDatePast_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2());
+		}
+		this_PropertyFillerDateRange_2=rulePropertyFillerDateRange
+		{
+			$current = $this_PropertyFillerDateRange_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3());
+		}
+		this_PropertyFillerBoolean_3=rulePropertyFillerBoolean
+		{
+			$current = $this_PropertyFillerBoolean_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4());
+		}
+		this_PropertyFillerSignedDoubleRange_4=rulePropertyFillerSignedDoubleRange
+		{
+			$current = $this_PropertyFillerSignedDoubleRange_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5());
+		}
+		this_PropertyFillerSignedDoubleRandom_5=rulePropertyFillerSignedDoubleRandom
+		{
+			$current = $this_PropertyFillerSignedDoubleRandom_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6());
+		}
+		this_PropertyFillerSignedIntegerRange_6=rulePropertyFillerSignedIntegerRange
+		{
+			$current = $this_PropertyFillerSignedIntegerRange_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7());
+		}
+		this_PropertyFillerSignedIntegerRandom_7=rulePropertyFillerSignedIntegerRandom
+		{
+			$current = $this_PropertyFillerSignedIntegerRandom_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8());
+		}
+		this_PropertyFillerTextRandom_8=rulePropertyFillerTextRandom
+		{
+			$current = $this_PropertyFillerTextRandom_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9());
+		}
+		this_PropertyFillerTextParagraphs_9=rulePropertyFillerTextParagraphs
+		{
+			$current = $this_PropertyFillerTextParagraphs_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10());
+		}
+		this_PropertyFillerTextSentences_10=rulePropertyFillerTextSentences
+		{
+			$current = $this_PropertyFillerTextSentences_10.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11());
+		}
+		this_PropertyFillerTextWords_11=rulePropertyFillerTextWords
+		{
+			$current = $this_PropertyFillerTextWords_11.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12());
+		}
+		this_PropertyFillerUnsignedDoubleRange_12=rulePropertyFillerUnsignedDoubleRange
+		{
+			$current = $this_PropertyFillerUnsignedDoubleRange_12.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13());
+		}
+		this_PropertyFillerUnsignedDoubleRandom_13=rulePropertyFillerUnsignedDoubleRandom
+		{
+			$current = $this_PropertyFillerUnsignedDoubleRandom_13.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14());
+		}
+		this_PropertyFillerUnsignedIntegerRange_14=rulePropertyFillerUnsignedIntegerRange
+		{
+			$current = $this_PropertyFillerUnsignedIntegerRange_14.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15());
+		}
+		this_PropertyFillerUnsignedIntegerRandom_15=rulePropertyFillerUnsignedIntegerRandom
+		{
+			$current = $this_PropertyFillerUnsignedIntegerRandom_15.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerDateFuture
-entryRulePropertyFillerDateFuture returns [EObject current=null] 
-	:
+entryRulePropertyFillerDateFuture returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerDateFutureRule()); }
-	 iv_rulePropertyFillerDateFuture=rulePropertyFillerDateFuture 
-	 { $current=$iv_rulePropertyFillerDateFuture.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerDateFuture=rulePropertyFillerDateFuture
+	{ $current=$iv_rulePropertyFillerDateFuture.current; }
+	EOF;
 
 // Rule PropertyFillerDateFuture
-rulePropertyFillerDateFuture returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='future date' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateFutureAccess().getFutureDateKeyword_0());
-    }
-(
-(
-		lv_dateFutureYears_1_0=RULE_INT
+rulePropertyFillerDateFuture returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='future'
 		{
-			newLeafNode(lv_dateFutureYears_1_0, grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0());
 		}
+		(
+			(
+				lv_dateFutureYears_1_0=RULE_INT
+				{
+					newLeafNode(lv_dateFutureYears_1_0, grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerDateFutureRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"dateFutureYears",
+						lv_dateFutureYears_1_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_2='years'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerDateFutureRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"dateFutureYears",
-        		lv_dateFutureYears_1_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_2='years' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerDatePast
-entryRulePropertyFillerDatePast returns [EObject current=null] 
-	:
+entryRulePropertyFillerDatePast returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerDatePastRule()); }
-	 iv_rulePropertyFillerDatePast=rulePropertyFillerDatePast 
-	 { $current=$iv_rulePropertyFillerDatePast.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerDatePast=rulePropertyFillerDatePast
+	{ $current=$iv_rulePropertyFillerDatePast.current; }
+	EOF;
 
 // Rule PropertyFillerDatePast
-rulePropertyFillerDatePast returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='past date' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDatePastAccess().getPastDateKeyword_0());
-    }
-(
-(
-		lv_datePastYears_1_0=RULE_INT
+rulePropertyFillerDatePast returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='past'
 		{
-			newLeafNode(lv_datePastYears_1_0, grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0());
 		}
+		(
+			(
+				lv_datePastYears_1_0=RULE_INT
+				{
+					newLeafNode(lv_datePastYears_1_0, grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerDatePastRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"datePastYears",
+						lv_datePastYears_1_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_2='years'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerDatePastRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"datePastYears",
-        		lv_datePastYears_1_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_2='years' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2());
-    }
-)
+			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerBoolean
-entryRulePropertyFillerBoolean returns [EObject current=null] 
-	:
+entryRulePropertyFillerBoolean returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerBooleanRule()); }
-	 iv_rulePropertyFillerBoolean=rulePropertyFillerBoolean 
-	 { $current=$iv_rulePropertyFillerBoolean.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerBoolean=rulePropertyFillerBoolean
+	{ $current=$iv_rulePropertyFillerBoolean.current; }
+	EOF;
 
 // Rule PropertyFillerBoolean
-rulePropertyFillerBoolean returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0(),
-            $current);
-    }
-)	otherlv_1='boolean' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1());
-    }
-)
+rulePropertyFillerBoolean returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='boolean'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerDateRange
-entryRulePropertyFillerDateRange returns [EObject current=null] 
-	:
+entryRulePropertyFillerDateRange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerDateRangeRule()); }
-	 iv_rulePropertyFillerDateRange=rulePropertyFillerDateRange 
-	 { $current=$iv_rulePropertyFillerDateRange.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerDateRange=rulePropertyFillerDateRange
+	{ $current=$iv_rulePropertyFillerDateRange.current; }
+	EOF;
 
 // Rule PropertyFillerDateRange
-rulePropertyFillerDateRange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='date in range' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateRangeAccess().getDateInRangeKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_1_0()); 
-	    }
-		lv_dateBeginYears_1_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"dateBeginYears",
-        		lv_dateBeginYears_1_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='up to and including' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateRangeAccess().getUpToAndIncludingKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_3_0()); 
-	    }
-		lv_dateEndYears_3_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"dateEndYears",
-        		lv_dateEndYears_3_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='years' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_4());
-    }
-)
+rulePropertyFillerDateRange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='dateRange'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0());
+		}
+		otherlv_1='from'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0());
+				}
+				lv_dateBeginYears_2_0=ruleSINT
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
+					}
+					set(
+						$current,
+						"dateBeginYears",
+						lv_dateBeginYears_2_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='until'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0());
+				}
+				lv_dateEndYears_4_0=ruleSINT
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
+					}
+					set(
+						$current,
+						"dateEndYears",
+						lv_dateEndYears_4_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_5='years'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerSignedDoubleRange
-entryRulePropertyFillerSignedDoubleRange returns [EObject current=null] 
-	:
+entryRulePropertyFillerSignedDoubleRange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); }
-	 iv_rulePropertyFillerSignedDoubleRange=rulePropertyFillerSignedDoubleRange 
-	 { $current=$iv_rulePropertyFillerSignedDoubleRange.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerSignedDoubleRange=rulePropertyFillerSignedDoubleRange
+	{ $current=$iv_rulePropertyFillerSignedDoubleRange.current; }
+	EOF;
 
 // Rule PropertyFillerSignedDoubleRange
-rulePropertyFillerSignedDoubleRange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='signed double in range' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getSignedDoubleInRangeKeyword_0());
-    }
-(((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_1_0_0_0()); 
-	    }
-		lv_beginRange_1_0=ruleSignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"beginRange",
-        		lv_beginRange_1_0, 
-        		"SignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
+rulePropertyFillerSignedDoubleRange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='numberRange'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0()); 
-	}
-
-)
-))?	otherlv_3='up to and including' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUpToAndIncludingKeyword_1_1());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_1_2_0_0()); 
-	    }
-		lv_endRange_4_0=ruleSignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"endRange",
-        		lv_endRange_4_0, 
-        		"SignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0()); 
-	}
-
-)
-)))?	otherlv_6='with' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_2());
-    }
-(
-(
-		lv_decimals_7_0=RULE_INT
-		{
-			newLeafNode(lv_decimals_7_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0());
 		}
+		otherlv_1='from'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"decimals",
-        		lv_decimals_7_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_8='decimals' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_4());
-    }
-(	otherlv_9='round to' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_5_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0()); 
-	    }
-		lv_rounded_10_0=ruleUnsignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"rounded",
-        		lv_rounded_10_0, 
-        		"UnsignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1());
+		}
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0());
+						}
+						lv_beginRange_2_0=ruleSignedNumber
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+							}
+							set(
+								$current,
+								"beginRange",
+								lv_beginRange_2_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+							}
+						}
+						otherlv_3=RULE_ID
+						{
+							newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
+						}
+					)
+				)
+			)?
+			otherlv_4='until'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0());
+						}
+						lv_endRange_5_0=ruleSignedNumber
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+							}
+							set(
+								$current,
+								"endRange",
+								lv_endRange_5_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+							}
+						}
+						otherlv_6=RULE_ID
+						{
+							newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
+						}
+					)
+				)
+			)
+		)?
+		otherlv_7='with'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3());
+		}
+		(
+			(
+				lv_decimals_8_0=RULE_INT
+				{
+					newLeafNode(lv_decimals_8_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"decimals",
+						lv_decimals_8_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_9='decimals'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5());
+		}
+		(
+			otherlv_10='roundTo'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0());
+					}
+					lv_rounded_11_0=ruleUnsignedNumber
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+						}
+						set(
+							$current,
+							"rounded",
+							lv_rounded_11_0,
+							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerSignedDoubleRandom
-entryRulePropertyFillerSignedDoubleRandom returns [EObject current=null] 
-	:
+entryRulePropertyFillerSignedDoubleRandom returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); }
-	 iv_rulePropertyFillerSignedDoubleRandom=rulePropertyFillerSignedDoubleRandom 
-	 { $current=$iv_rulePropertyFillerSignedDoubleRandom.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerSignedDoubleRandom=rulePropertyFillerSignedDoubleRandom
+	{ $current=$iv_rulePropertyFillerSignedDoubleRandom.current; }
+	EOF;
 
 // Rule PropertyFillerSignedDoubleRandom
-rulePropertyFillerSignedDoubleRandom returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='signed double from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getSignedDoubleFromKeyword_0());
-    }
-	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); 
-	    }
-		lv_items_2_0=ruleSignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRandomRule());
-	        }
-       		add(
-       			$current, 
-       			"items",
-        		lv_items_2_0, 
-        		"SignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)+	otherlv_3=')' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3());
-    }
-)
+rulePropertyFillerSignedDoubleRandom returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='numberPick'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0());
+		}
+		otherlv_1='('
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0());
+				}
+				lv_items_2_0=ruleSignedNumber
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRandomRule());
+					}
+					add(
+						$current,
+						"items",
+						lv_items_2_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerSignedIntegerRange
-entryRulePropertyFillerSignedIntegerRange returns [EObject current=null] 
-	:
+entryRulePropertyFillerSignedIntegerRange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); }
-	 iv_rulePropertyFillerSignedIntegerRange=rulePropertyFillerSignedIntegerRange 
-	 { $current=$iv_rulePropertyFillerSignedIntegerRange.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerSignedIntegerRange=rulePropertyFillerSignedIntegerRange
+	{ $current=$iv_rulePropertyFillerSignedIntegerRange.current; }
+	EOF;
 
 // Rule PropertyFillerSignedIntegerRange
-rulePropertyFillerSignedIntegerRange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0(),
-            $current);
-    }
-)	otherlv_1='signed integer in range' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getSignedIntegerInRangeKeyword_1());
-    }
-(((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_2_0_0_0()); 
-	    }
-		lv_beginRange_2_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"beginRange",
-        		lv_beginRange_2_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
+rulePropertyFillerSignedIntegerRange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='integerRange'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
-	}
-
-)
-))?	otherlv_4='up to and including' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUpToAndIncludingKeyword_2_1());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_2_2_0_0()); 
-	    }
-		lv_endRange_5_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"endRange",
-        		lv_endRange_5_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-	        }
-        }
-	otherlv_6=RULE_ID
-	{
-		newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
-	}
-
-)
-)))?(	otherlv_7='round to' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_3_0());
-    }
-(
-(
-		lv_rounded_8_0=RULE_INT
-		{
-			newLeafNode(lv_rounded_8_0, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1());
 		}
+		otherlv_2='from'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"rounded",
-        		lv_rounded_8_0, 
-        		"INT");
-	    }
-
-)
-))?)
+			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2());
+		}
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0());
+						}
+						lv_beginRange_3_0=ruleSINT
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+							}
+							set(
+								$current,
+								"beginRange",
+								lv_beginRange_3_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+							}
+						}
+						otherlv_4=RULE_ID
+						{
+							newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0());
+						}
+					)
+				)
+			)?
+			otherlv_5='until'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0());
+						}
+						lv_endRange_6_0=ruleSINT
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+							}
+							set(
+								$current,
+								"endRange",
+								lv_endRange_6_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+							}
+						}
+						otherlv_7=RULE_ID
+						{
+							newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0());
+						}
+					)
+				)
+			)
+		)?
+		(
+			otherlv_8='roundTo'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0());
+			}
+			(
+				(
+					lv_rounded_9_0=RULE_INT
+					{
+						newLeafNode(lv_rounded_9_0, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"rounded",
+							lv_rounded_9_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerSignedIntegerRandom
-entryRulePropertyFillerSignedIntegerRandom returns [EObject current=null] 
-	:
+entryRulePropertyFillerSignedIntegerRandom returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); }
-	 iv_rulePropertyFillerSignedIntegerRandom=rulePropertyFillerSignedIntegerRandom 
-	 { $current=$iv_rulePropertyFillerSignedIntegerRandom.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerSignedIntegerRandom=rulePropertyFillerSignedIntegerRandom
+	{ $current=$iv_rulePropertyFillerSignedIntegerRandom.current; }
+	EOF;
 
 // Rule PropertyFillerSignedIntegerRandom
-rulePropertyFillerSignedIntegerRandom returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='signed integer from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getSignedIntegerFromKeyword_0());
-    }
-	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); 
-	    }
-		lv_items_2_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRandomRule());
-	        }
-       		add(
-       			$current, 
-       			"items",
-        		lv_items_2_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)+	otherlv_3=')' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3());
-    }
-)
+rulePropertyFillerSignedIntegerRandom returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='integerPick'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0());
+		}
+		otherlv_1='('
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0());
+				}
+				lv_items_2_0=ruleSINT
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRandomRule());
+					}
+					add(
+						$current,
+						"items",
+						lv_items_2_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerTextRandom
-entryRulePropertyFillerTextRandom returns [EObject current=null] 
-	:
+entryRulePropertyFillerTextRandom returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerTextRandomRule()); }
-	 iv_rulePropertyFillerTextRandom=rulePropertyFillerTextRandom 
-	 { $current=$iv_rulePropertyFillerTextRandom.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerTextRandom=rulePropertyFillerTextRandom
+	{ $current=$iv_rulePropertyFillerTextRandom.current; }
+	EOF;
 
 // Rule PropertyFillerTextRandom
-rulePropertyFillerTextRandom returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='text from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerTextRandomAccess().getTextFromKeyword_0());
-    }
-	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1());
-    }
-(
-(
-		lv_items_2_0=RULE_STRING
+rulePropertyFillerTextRandom returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='textPick'
 		{
-			newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0());
 		}
+		otherlv_1='('
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerTextRandomRule());
-	        }
-       		addWithLastConsumed(
-       			$current, 
-       			"items",
-        		lv_items_2_0, 
-        		"STRING");
-	    }
-
-)
-)+	otherlv_3=')' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3());
-    }
-)
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				lv_items_2_0=RULE_STRING
+				{
+					newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerTextRandomRule());
+					}
+					addWithLastConsumed(
+						$current,
+						"items",
+						lv_items_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)+
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerTextParagraphs
-entryRulePropertyFillerTextParagraphs returns [EObject current=null] 
-	:
+entryRulePropertyFillerTextParagraphs returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerTextParagraphsRule()); }
-	 iv_rulePropertyFillerTextParagraphs=rulePropertyFillerTextParagraphs 
-	 { $current=$iv_rulePropertyFillerTextParagraphs.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerTextParagraphs=rulePropertyFillerTextParagraphs
+	{ $current=$iv_rulePropertyFillerTextParagraphs.current; }
+	EOF;
 
 // Rule PropertyFillerTextParagraphs
-rulePropertyFillerTextParagraphs returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0(),
-            $current);
-    }
-)	otherlv_1='paragraps' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextParagraphsAccess().getParagrapsKeyword_1());
-    }
-(
-(
-		lv_count_2_0=RULE_INT
+rulePropertyFillerTextParagraphs returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='paragraphs'
 		{
-			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerTextParagraphsRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"count",
-        		lv_count_2_0, 
-        		"INT");
-	    }
-
-)
-)?)
+		(
+			(
+				lv_count_2_0=RULE_INT
+				{
+					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerTextParagraphsRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"count",
+						lv_count_2_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerTextSentences
-entryRulePropertyFillerTextSentences returns [EObject current=null] 
-	:
+entryRulePropertyFillerTextSentences returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerTextSentencesRule()); }
-	 iv_rulePropertyFillerTextSentences=rulePropertyFillerTextSentences 
-	 { $current=$iv_rulePropertyFillerTextSentences.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerTextSentences=rulePropertyFillerTextSentences
+	{ $current=$iv_rulePropertyFillerTextSentences.current; }
+	EOF;
 
 // Rule PropertyFillerTextSentences
-rulePropertyFillerTextSentences returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0(),
-            $current);
-    }
-)	otherlv_1='sentences' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1());
-    }
-(
-(
-		lv_count_2_0=RULE_INT
+rulePropertyFillerTextSentences returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='sentences'
 		{
-			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerTextSentencesRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"count",
-        		lv_count_2_0, 
-        		"INT");
-	    }
-
-)
-)?)
+		(
+			(
+				lv_count_2_0=RULE_INT
+				{
+					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerTextSentencesRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"count",
+						lv_count_2_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerTextWords
-entryRulePropertyFillerTextWords returns [EObject current=null] 
-	:
+entryRulePropertyFillerTextWords returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerTextWordsRule()); }
-	 iv_rulePropertyFillerTextWords=rulePropertyFillerTextWords 
-	 { $current=$iv_rulePropertyFillerTextWords.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerTextWords=rulePropertyFillerTextWords
+	{ $current=$iv_rulePropertyFillerTextWords.current; }
+	EOF;
 
 // Rule PropertyFillerTextWords
-rulePropertyFillerTextWords returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0(),
-            $current);
-    }
-)	otherlv_1='words' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1());
-    }
-(
-(
-		lv_count_2_0=RULE_INT
+rulePropertyFillerTextWords returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='words'
 		{
-			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerTextWordsRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"count",
-        		lv_count_2_0, 
-        		"INT");
-	    }
-
-)
-)?)
+		(
+			(
+				lv_count_2_0=RULE_INT
+				{
+					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerTextWordsRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"count",
+						lv_count_2_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerUnsignedDoubleRange
-entryRulePropertyFillerUnsignedDoubleRange returns [EObject current=null] 
-	:
+entryRulePropertyFillerUnsignedDoubleRange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); }
-	 iv_rulePropertyFillerUnsignedDoubleRange=rulePropertyFillerUnsignedDoubleRange 
-	 { $current=$iv_rulePropertyFillerUnsignedDoubleRange.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerUnsignedDoubleRange=rulePropertyFillerUnsignedDoubleRange
+	{ $current=$iv_rulePropertyFillerUnsignedDoubleRange.current; }
+	EOF;
 
 // Rule PropertyFillerUnsignedDoubleRange
-rulePropertyFillerUnsignedDoubleRange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='unsigned double in range' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedDoubleInRangeKeyword_0());
-    }
-(((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_1_0_0_0()); 
-	    }
-		lv_beginRange_1_0=ruleUnsignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"beginRange",
-        		lv_beginRange_1_0, 
-        		"UnsignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
+rulePropertyFillerUnsignedDoubleRange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='unsignedNumberRange'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0()); 
-	}
-
-)
-))?	otherlv_3='up to and including' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUpToAndIncludingKeyword_1_1());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_1_2_0_0()); 
-	    }
-		lv_endRange_4_0=ruleUnsignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"endRange",
-        		lv_endRange_4_0, 
-        		"UnsignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0()); 
-	}
-
-)
-)))?	otherlv_6='with' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_2());
-    }
-(
-(
-		lv_decimals_7_0=RULE_INT
-		{
-			newLeafNode(lv_decimals_7_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0());
 		}
+		otherlv_1='from'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"decimals",
-        		lv_decimals_7_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_8='decimals' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_4());
-    }
-(	otherlv_9='round to' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_5_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0()); 
-	    }
-		lv_rounded_10_0=ruleUnsignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-	        }
-       		set(
-       			$current, 
-       			"rounded",
-        		lv_rounded_10_0, 
-        		"UnsignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1());
+		}
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0());
+						}
+						lv_beginRange_2_0=ruleUnsignedNumber
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+							}
+							set(
+								$current,
+								"beginRange",
+								lv_beginRange_2_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+							}
+						}
+						otherlv_3=RULE_ID
+						{
+							newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
+						}
+					)
+				)
+			)?
+			otherlv_4='until'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0());
+						}
+						lv_endRange_5_0=ruleUnsignedNumber
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+							}
+							set(
+								$current,
+								"endRange",
+								lv_endRange_5_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+							}
+						}
+						otherlv_6=RULE_ID
+						{
+							newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
+						}
+					)
+				)
+			)
+		)?
+		otherlv_7='with'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3());
+		}
+		(
+			(
+				lv_decimals_8_0=RULE_INT
+				{
+					newLeafNode(lv_decimals_8_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"decimals",
+						lv_decimals_8_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		otherlv_9='decimals'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5());
+		}
+		(
+			otherlv_10='roundTo'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0());
+					}
+					lv_rounded_11_0=ruleUnsignedNumber
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+						}
+						set(
+							$current,
+							"rounded",
+							lv_rounded_11_0,
+							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerUnsignedDoubleRandom
-entryRulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] 
-	:
+entryRulePropertyFillerUnsignedDoubleRandom returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); }
-	 iv_rulePropertyFillerUnsignedDoubleRandom=rulePropertyFillerUnsignedDoubleRandom 
-	 { $current=$iv_rulePropertyFillerUnsignedDoubleRandom.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerUnsignedDoubleRandom=rulePropertyFillerUnsignedDoubleRandom
+	{ $current=$iv_rulePropertyFillerUnsignedDoubleRandom.current; }
+	EOF;
 
 // Rule PropertyFillerUnsignedDoubleRandom
-rulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='unsigned double from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedDoubleFromKeyword_0());
-    }
-	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); 
-	    }
-		lv_items_2_0=ruleUnsignedNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule());
-	        }
-       		add(
-       			$current, 
-       			"items",
-        		lv_items_2_0, 
-        		"UnsignedNumber");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)+	otherlv_3=')' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3());
-    }
-)
+rulePropertyFillerUnsignedDoubleRandom returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='unsignedNumberPick'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0());
+		}
+		otherlv_1='('
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0());
+				}
+				lv_items_2_0=ruleUnsignedNumber
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule());
+					}
+					add(
+						$current,
+						"items",
+						lv_items_2_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerUnsignedIntegerRange
-entryRulePropertyFillerUnsignedIntegerRange returns [EObject current=null] 
-	:
+entryRulePropertyFillerUnsignedIntegerRange returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); }
-	 iv_rulePropertyFillerUnsignedIntegerRange=rulePropertyFillerUnsignedIntegerRange 
-	 { $current=$iv_rulePropertyFillerUnsignedIntegerRange.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerUnsignedIntegerRange=rulePropertyFillerUnsignedIntegerRange
+	{ $current=$iv_rulePropertyFillerUnsignedIntegerRange.current; }
+	EOF;
 
 // Rule PropertyFillerUnsignedIntegerRange
-rulePropertyFillerUnsignedIntegerRange returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0(),
-            $current);
-    }
-)	otherlv_1='unsigned integer in range' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerInRangeKeyword_1());
-    }
-(((
-(
-		lv_beginRange_2_0=RULE_INT
+rulePropertyFillerUnsignedIntegerRange returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='unsignedIntegerRange'
 		{
-			newLeafNode(lv_beginRange_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_2_0_0_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1());
 		}
+		otherlv_2='from'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"beginRange",
-        		lv_beginRange_2_0, 
-        		"INT");
-	    }
-
-)
-)
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
-	}
-
-)
-))?	otherlv_4='up to and including' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUpToAndIncludingKeyword_2_1());
-    }
-((
-(
-		lv_endRange_5_0=RULE_INT
-		{
-			newLeafNode(lv_endRange_5_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_2_2_0_0()); 
+			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"endRange",
-        		lv_endRange_5_0, 
-        		"INT");
-	    }
-
-)
-)
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-	        }
-        }
-	otherlv_6=RULE_ID
-	{
-		newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
-	}
-
-)
-)))?(	otherlv_7='round to' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_3_0());
-    }
-(
-(
-		lv_rounded_8_0=RULE_INT
-		{
-			newLeafNode(lv_rounded_8_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"rounded",
-        		lv_rounded_8_0, 
-        		"INT");
-	    }
-
-)
-))?)
+		(
+			(
+				(
+					(
+						lv_beginRange_3_0=RULE_INT
+						{
+							newLeafNode(lv_beginRange_3_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+							}
+							setWithLastConsumed(
+								$current,
+								"beginRange",
+								lv_beginRange_3_0,
+								"org.eclipse.xtext.xbase.Xbase.INT");
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+							}
+						}
+						otherlv_4=RULE_ID
+						{
+							newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0());
+						}
+					)
+				)
+			)?
+			otherlv_5='until'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1());
+			}
+			(
+				(
+					(
+						lv_endRange_6_0=RULE_INT
+						{
+							newLeafNode(lv_endRange_6_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+							}
+							setWithLastConsumed(
+								$current,
+								"endRange",
+								lv_endRange_6_0,
+								"org.eclipse.xtext.xbase.Xbase.INT");
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+							}
+						}
+						otherlv_7=RULE_ID
+						{
+							newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0());
+						}
+					)
+				)
+			)
+		)?
+		(
+			otherlv_8='roundTo'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0());
+			}
+			(
+				(
+					lv_rounded_9_0=RULE_INT
+					{
+						newLeafNode(lv_rounded_9_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"rounded",
+							lv_rounded_9_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyFillerUnsignedIntegerRandom
-entryRulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] 
-	:
+entryRulePropertyFillerUnsignedIntegerRandom returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); }
-	 iv_rulePropertyFillerUnsignedIntegerRandom=rulePropertyFillerUnsignedIntegerRandom 
-	 { $current=$iv_rulePropertyFillerUnsignedIntegerRandom.current; } 
-	 EOF 
-;
+	iv_rulePropertyFillerUnsignedIntegerRandom=rulePropertyFillerUnsignedIntegerRandom
+	{ $current=$iv_rulePropertyFillerUnsignedIntegerRandom.current; }
+	EOF;
 
 // Rule PropertyFillerUnsignedIntegerRandom
-rulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='unsigned integer from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerFromKeyword_0());
-    }
-	otherlv_1='(' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
-    }
-(
-(
-		lv_items_2_0=RULE_INT
+rulePropertyFillerUnsignedIntegerRandom returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='unsignedIntegerPick'
 		{
-			newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0());
 		}
+		otherlv_1='('
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule());
-	        }
-       		addWithLastConsumed(
-       			$current, 
-       			"items",
-        		lv_items_2_0, 
-        		"INT");
-	    }
-
-)
-)+	otherlv_3=')' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3());
-    }
-)
+			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				lv_items_2_0=RULE_INT
+				{
+					newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule());
+					}
+					addWithLastConsumed(
+						$current,
+						"items",
+						lv_items_2_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)+
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3());
+		}
+	)
 ;
 
-
-
-
-
-// Entry rule entryRuleEntityMockDataType
-entryRuleEntityMockDataType returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getEntityMockDataTypeRule()); }
-	 iv_ruleEntityMockDataType=ruleEntityMockDataType 
-	 { $current=$iv_ruleEntityMockDataType.current; } 
-	 EOF 
-;
-
-// Rule EntityMockDataType
-ruleEntityMockDataType returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='datatype' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockDataTypeAccess().getDatatypeKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockDataTypeAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockDataTypeRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockDataTypeAccess().getLeftCurlyBracketKeyword_2());
-    }
-	otherlv_3='}' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockDataTypeAccess().getRightCurlyBracketKeyword_3());
-    }
-)
-;
-
-
-
-
-
 // Entry rule entryRuleEntityMockEntities
-entryRuleEntityMockEntities returns [EObject current=null] 
-	:
+entryRuleEntityMockEntities returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockEntitiesRule()); }
-	 iv_ruleEntityMockEntities=ruleEntityMockEntities 
-	 { $current=$iv_ruleEntityMockEntities.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockEntities=ruleEntityMockEntities
+	{ $current=$iv_ruleEntityMockEntities.current; }
+	EOF;
 
 // Rule EntityMockEntities
-ruleEntityMockEntities returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0(),
-            $current);
-    }
-)	otherlv_1='mock entities' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockEntitiesAccess().getMockEntitiesKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); 
-	    }
-		lv_entities_3_0=ruleEntityMockEntity		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntitiesRule());
-	        }
-       		add(
-       			$current, 
-       			"entities",
-        		lv_entities_3_0, 
-        		"EntityMockEntity");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4());
-    }
-)
+ruleEntityMockEntities returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='entities'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0());
+				}
+				lv_entities_3_0=ruleEntityMockEntity
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockEntitiesRule());
+					}
+					add(
+						$current,
+						"entities",
+						lv_entities_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntity");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockEntity
-entryRuleEntityMockEntity returns [EObject current=null] 
-	:
+entryRuleEntityMockEntity returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockEntityRule()); }
-	 iv_ruleEntityMockEntity=ruleEntityMockEntity 
-	 { $current=$iv_ruleEntityMockEntity.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockEntity=ruleEntityMockEntity
+	{ $current=$iv_ruleEntityMockEntity.current; }
+	EOF;
 
 // Rule EntityMockEntity
-ruleEntityMockEntity returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='mocking' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='for entity' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityAccess().getForEntityKeyword_2());
-    }
-(
-(
+ruleEntityMockEntity returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='mocking'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); 
-	}
-
-)
-)((	otherlv_4='rows' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0());
-    }
-(
-(
-		lv_minRows_5_0=RULE_INT
-		{
-			newLeafNode(lv_minRows_5_0, grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0());
 		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='entity'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"minRows",
-        		lv_minRows_5_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_6='to' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2());
-    }
-(
-(
-		lv_maxRows_7_0=RULE_INT
-		{
-			newLeafNode(lv_maxRows_7_0, grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); 
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"maxRows",
-        		lv_maxRows_7_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_8='{' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemporariesEntityMockTemporaryParserRuleCall_4_0_5_0()); 
-	    }
-		lv_temporaries_9_0=ruleEntityMockTemporary		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"temporaries",
-        		lv_temporaries_9_0, 
-        		"EntityMockTemporary");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); 
-	    }
-		lv_attributes_10_0=ruleIEntityMockAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"attributes",
-        		lv_attributes_10_0, 
-        		"IEntityMockAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); 
-	    }
-		lv_calculations_11_0=ruleEntityMockEntityFunction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"calculations",
-        		lv_calculations_11_0, 
-        		"EntityMockEntityFunction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_12='}' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8());
-    }
-)
-    |(	otherlv_13='by resource' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getEntityMockEntityAccess().getByResourceKeyword_4_1_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-        }
-	otherlv_14=RULE_ID
-	{
-		newLeafNode(otherlv_14, grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); 
-	}
-
-)
-)	otherlv_15='{' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0()); 
-	    }
-		lv_byResourceAttributes_16_0=ruleEntityMockByResourceAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"byResourceAttributes",
-        		lv_byResourceAttributes_16_0, 
-        		"EntityMockByResourceAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		lv_createBlobMapping_17_0=	'createBlobMapping' 
-    {
-        newLeafNode(lv_createBlobMapping_17_0, grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_4_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-       		setWithLastConsumed($current, "createBlobMapping", true, "createBlobMapping");
-	    }
-
-)
-)?	otherlv_18='}' 
-    {
-    	newLeafNode(otherlv_18, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_5());
-    }
-)
-    |(	otherlv_19='iterate' 
-    {
-    	newLeafNode(otherlv_19, grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityRule());
-	        }
-        }
-	otherlv_20=RULE_ID
-	{
-		newLeafNode(otherlv_20, grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); 
-	}
-
-)
-)	otherlv_21='with' 
-    {
-    	newLeafNode(otherlv_21, grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); 
-	    }
-		lv_iterate_22_0=ruleIIterate		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		set(
-       			$current, 
-       			"iterate",
-        		lv_iterate_22_0, 
-        		"IIterate");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_23='{' 
-    {
-    	newLeafNode(otherlv_23, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemporariesEntityMockTemporaryParserRuleCall_4_2_5_0()); 
-	    }
-		lv_temporaries_24_0=ruleEntityMockTemporary		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"temporaries",
-        		lv_temporaries_24_0, 
-        		"EntityMockTemporary");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); 
-	    }
-		lv_attributes_25_0=ruleIEntityMockAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"attributes",
-        		lv_attributes_25_0, 
-        		"IEntityMockAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); 
-	    }
-		lv_calculations_26_0=ruleEntityMockEntityFunction		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-	        }
-       		add(
-       			$current, 
-       			"calculations",
-        		lv_calculations_26_0, 
-        		"EntityMockEntityFunction");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_27='}' 
-    {
-    	newLeafNode(otherlv_27, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8());
-    }
-)))
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0());
+				}
+			)
+		)
+		(
+			(
+				otherlv_4='rows'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0());
+				}
+				(
+					(
+						lv_minRows_5_0=RULE_INT
+						{
+							newLeafNode(lv_minRows_5_0, grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+							}
+							setWithLastConsumed(
+								$current,
+								"minRows",
+								lv_minRows_5_0,
+								"org.eclipse.xtext.xbase.Xbase.INT");
+						}
+					)
+				)
+				otherlv_6='to'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2());
+				}
+				(
+					(
+						lv_maxRows_7_0=RULE_INT
+						{
+							newLeafNode(lv_maxRows_7_0, grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+							}
+							setWithLastConsumed(
+								$current,
+								"maxRows",
+								lv_maxRows_7_0,
+								"org.eclipse.xtext.xbase.Xbase.INT");
+						}
+					)
+				)
+				otherlv_8='{'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0());
+						}
+						lv_templates_9_0=ruleEntityMockTemplate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"templates",
+								lv_templates_9_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockTemplate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0());
+						}
+						lv_attributes_10_0=ruleIEntityMockAttribute
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"attributes",
+								lv_attributes_10_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockAttribute");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0());
+						}
+						lv_calculations_11_0=ruleEntityMockEntityFunction
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"calculations",
+								lv_calculations_11_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunction");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_12='}'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8());
+				}
+			)
+			    |
+			(
+				otherlv_13='resource'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0());
+				}
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+							}
+						}
+						otherlv_14=RULE_ID
+						{
+							newLeafNode(otherlv_14, grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0());
+						}
+					)
+				)
+				otherlv_15='{'
+				{
+					newLeafNode(otherlv_15, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2());
+				}
+				(
+					(
+						{ 
+						  getUnorderedGroupHelper().enter(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+						}
+						(
+							(
+					(
+						{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0)}?=>(
+							{
+								getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0);
+							}
+										({true}?=>((
+											{
+												newCompositeNode(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0());
+											}
+											lv_byResourceAttributes_17_0=ruleEntityMockByResourceAttribute
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+												}
+												add(
+													$current,
+													"byResourceAttributes",
+													lv_byResourceAttributes_17_0,
+													"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockByResourceAttribute");
+												afterParserOrEnumRuleCall();
+											}
+										)
+										))+
+							{ 
+								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+							}
+						)
+					)|
+					(
+						{getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1)}?=>(
+							{
+								getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1);
+							}
+										({true}?=>((
+											lv_createBlobMapping_18_0='createBlobMapping'
+											{
+												newLeafNode(lv_createBlobMapping_18_0, grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0());
+											}
+											{
+												if ($current==null) {
+													$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+												}
+												setWithLastConsumed($current, "createBlobMapping", true, "createBlobMapping");
+											}
+										)
+										))
+							{ 
+								getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+							}
+						)
+					)
+							)*
+						)
+					)
+						{ 
+						  getUnorderedGroupHelper().leave(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+						}
+				)
+				otherlv_19='}'
+				{
+					newLeafNode(otherlv_19, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4());
+				}
+			)
+			    |
+			(
+				otherlv_20='iterate'
+				{
+					newLeafNode(otherlv_20, grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEntityMockEntityRule());
+							}
+						}
+						otherlv_21=RULE_ID
+						{
+							newLeafNode(otherlv_21, grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0());
+						}
+					)
+				)
+				otherlv_22='with'
+				{
+					newLeafNode(otherlv_22, grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0());
+						}
+						lv_iterate_23_0=ruleIIterate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							set(
+								$current,
+								"iterate",
+								lv_iterate_23_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IIterate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_24='{'
+				{
+					newLeafNode(otherlv_24, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0());
+						}
+						lv_templates_25_0=ruleEntityMockTemplate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"templates",
+								lv_templates_25_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockTemplate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0());
+						}
+						lv_attributes_26_0=ruleIEntityMockAttribute
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"attributes",
+								lv_attributes_26_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockAttribute");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0());
+						}
+						lv_calculations_27_0=ruleEntityMockEntityFunction
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+							}
+							add(
+								$current,
+								"calculations",
+								lv_calculations_27_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunction");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_28='}'
+				{
+					newLeafNode(otherlv_28, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleIIterate
-entryRuleIIterate returns [EObject current=null] 
-	:
+entryRuleIIterate returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getIIterateRule()); }
-	 iv_ruleIIterate=ruleIIterate 
-	 { $current=$iv_ruleIIterate.current; } 
-	 EOF 
-;
+	iv_ruleIIterate=ruleIIterate
+	{ $current=$iv_ruleIIterate.current; }
+	EOF;
 
 // Rule IIterate
-ruleIIterate returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); 
-    }
-    this_IntegerIterate_0=ruleIntegerIterate
-    { 
-        $current = $this_IntegerIterate_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); 
-    }
-    this_DateIterate_1=ruleDateIterate
-    { 
-        $current = $this_DateIterate_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleIIterate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0());
+		}
+		this_IntegerIterate_0=ruleIntegerIterate
+		{
+			$current = $this_IntegerIterate_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1());
+		}
+		this_DateIterate_1=ruleDateIterate
+		{
+			$current = $this_DateIterate_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleIntegerIterate
-entryRuleIntegerIterate returns [EObject current=null] 
-	:
+entryRuleIntegerIterate returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getIntegerIterateRule()); }
-	 iv_ruleIntegerIterate=ruleIntegerIterate 
-	 { $current=$iv_ruleIntegerIterate.current; } 
-	 EOF 
-;
+	iv_ruleIntegerIterate=ruleIntegerIterate
+	{ $current=$iv_ruleIntegerIterate.current; }
+	EOF;
 
 // Rule IntegerIterate
-ruleIntegerIterate returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='integer from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0()); 
-	    }
-		lv_from_1_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
-	        }
-       		set(
-       			$current, 
-       			"from",
-        		lv_from_1_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='until' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getIntegerIterateAccess().getUntilKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0()); 
-	    }
-		lv_until_3_0=ruleSINT		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
-	        }
-       		set(
-       			$current, 
-       			"until",
-        		lv_until_3_0, 
-        		"SINT");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='step' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getIntegerIterateAccess().getStepKeyword_4());
-    }
-(
-(
-		lv_step_5_0=RULE_INT
+ruleIntegerIterate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='integerFrom'
 		{
-			newLeafNode(lv_step_5_0, grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0());
+				}
+				lv_from_1_0=ruleSINT
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
+					}
+					set(
+						$current,
+						"from",
+						lv_from_1_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='until'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getIntegerIterateRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"step",
-        		lv_step_5_0, 
-        		"INT");
-	    }
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getIntegerIterateAccess().getUntilKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0());
+				}
+				lv_until_3_0=ruleSINT
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
+					}
+					set(
+						$current,
+						"until",
+						lv_until_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='step'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getIntegerIterateAccess().getStepKeyword_4());
+		}
+		(
+			(
+				lv_step_5_0=RULE_INT
+				{
+					newLeafNode(lv_step_5_0, grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getIntegerIterateRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"step",
+						lv_step_5_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleDateIterate
-entryRuleDateIterate returns [EObject current=null] 
-	:
+entryRuleDateIterate returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getDateIterateRule()); }
-	 iv_ruleDateIterate=ruleDateIterate 
-	 { $current=$iv_ruleDateIterate.current; } 
-	 EOF 
-;
+	iv_ruleDateIterate=ruleDateIterate
+	{ $current=$iv_ruleDateIterate.current; }
+	EOF;
 
 // Rule DateIterate
-ruleDateIterate returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='date from' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getDateIterateAccess().getDateFromKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0()); 
-	    }
-		lv_from_1_0=ruleDate		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getDateIterateRule());
-	        }
-       		set(
-       			$current, 
-       			"from",
-        		lv_from_1_0, 
-        		"Date");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='until' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getDateIterateAccess().getUntilKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0()); 
-	    }
-		lv_until_3_0=ruleDate		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getDateIterateRule());
-	        }
-       		set(
-       			$current, 
-       			"until",
-        		lv_until_3_0, 
-        		"Date");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='every' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getDateIterateAccess().getEveryKeyword_4());
-    }
-(
-(
-		lv_stepCount_5_0=RULE_INT
+ruleDateIterate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='dateFrom'
 		{
-			newLeafNode(lv_stepCount_5_0, grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getDateIterateAccess().getDateFromKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0());
+				}
+				lv_from_1_0=ruleDate
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDateIterateRule());
+					}
+					set(
+						$current,
+						"from",
+						lv_from_1_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Date");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='until'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateIterateRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"stepCount",
-        		lv_stepCount_5_0, 
-        		"INT");
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0()); 
-	    }
-		lv_stepType_6_0=ruleEDateStepType		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getDateIterateRule());
-	        }
-       		set(
-       			$current, 
-       			"stepType",
-        		lv_stepType_6_0, 
-        		"EDateStepType");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getDateIterateAccess().getUntilKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0());
+				}
+				lv_until_3_0=ruleDate
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDateIterateRule());
+					}
+					set(
+						$current,
+						"until",
+						lv_until_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Date");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='every'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getDateIterateAccess().getEveryKeyword_4());
+		}
+		(
+			(
+				lv_stepCount_5_0=RULE_INT
+				{
+					newLeafNode(lv_stepCount_5_0, grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDateIterateRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"stepCount",
+						lv_stepCount_5_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0());
+				}
+				lv_stepType_6_0=ruleEDateStepType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDateIterateRule());
+					}
+					set(
+						$current,
+						"stepType",
+						lv_stepType_6_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EDateStepType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleDate
-entryRuleDate returns [EObject current=null] 
-	:
+entryRuleDate returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getDateRule()); }
-	 iv_ruleDate=ruleDate 
-	 { $current=$iv_ruleDate.current; } 
-	 EOF 
-;
+	iv_ruleDate=ruleDate
+	{ $current=$iv_ruleDate.current; }
+	EOF;
 
 // Rule Date
-ruleDate returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		lv_yesterday_0_0=	'yesterday' 
-    {
-        newLeafNode(lv_yesterday_0_0, grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed($current, "yesterday", true, "yesterday");
-	    }
-
-)
-)
-    |(
-(
-		lv_today_1_0=	'today' 
-    {
-        newLeafNode(lv_today_1_0, grammarAccess.getDateAccess().getTodayTodayKeyword_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed($current, "today", true, "today");
-	    }
-
-)
-)
-    |(
-(
-		lv_tomorrow_2_0=	'tomorrow' 
-    {
-        newLeafNode(lv_tomorrow_2_0, grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed($current, "tomorrow", true, "tomorrow");
-	    }
-
-)
-)
-    |((
-(
-		lv_year_3_0=RULE_INT
-		{
-			newLeafNode(lv_year_3_0, grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"year",
-        		lv_year_3_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_4='-' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1());
-    }
-(
-(
-		lv_month_5_0=RULE_INT
-		{
-			newLeafNode(lv_month_5_0, grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"month",
-        		lv_month_5_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_6='-' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3());
-    }
-(
-(
-		lv_day_7_0=RULE_INT
-		{
-			newLeafNode(lv_day_7_0, grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0()); 
-		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getDateRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"day",
-        		lv_day_7_0, 
-        		"INT");
-	    }
-
-)
-)))
+ruleDate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_yesterday_0_0='yesterday'
+				{
+					newLeafNode(lv_yesterday_0_0, grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDateRule());
+					}
+					setWithLastConsumed($current, "yesterday", true, "yesterday");
+				}
+			)
+		)
+		    |
+		(
+			(
+				lv_today_1_0='today'
+				{
+					newLeafNode(lv_today_1_0, grammarAccess.getDateAccess().getTodayTodayKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDateRule());
+					}
+					setWithLastConsumed($current, "today", true, "today");
+				}
+			)
+		)
+		    |
+		(
+			(
+				lv_tomorrow_2_0='tomorrow'
+				{
+					newLeafNode(lv_tomorrow_2_0, grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDateRule());
+					}
+					setWithLastConsumed($current, "tomorrow", true, "tomorrow");
+				}
+			)
+		)
+		    |
+		(
+			(
+				(
+					lv_year_3_0=RULE_INT
+					{
+						newLeafNode(lv_year_3_0, grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDateRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"year",
+							lv_year_3_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+			otherlv_4='-'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1());
+			}
+			(
+				(
+					lv_month_5_0=RULE_INT
+					{
+						newLeafNode(lv_month_5_0, grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDateRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"month",
+							lv_month_5_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+			otherlv_6='-'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3());
+			}
+			(
+				(
+					lv_day_7_0=RULE_INT
+					{
+						newLeafNode(lv_day_7_0, grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDateRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"day",
+							lv_day_7_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockByResourceAttribute
-entryRuleEntityMockByResourceAttribute returns [EObject current=null] 
-	:
+entryRuleEntityMockByResourceAttribute returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockByResourceAttributeRule()); }
-	 iv_ruleEntityMockByResourceAttribute=ruleEntityMockByResourceAttribute 
-	 { $current=$iv_ruleEntityMockByResourceAttribute.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockByResourceAttribute=ruleEntityMockByResourceAttribute
+	{ $current=$iv_ruleEntityMockByResourceAttribute.current; }
+	EOF;
 
 // Rule EntityMockByResourceAttribute
-ruleEntityMockByResourceAttribute returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0(),
-            $current);
-    }
-)	otherlv_1='var' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1());
-    }
-(
-(
+ruleEntityMockByResourceAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0()); 
-	}
-
-)
-)	otherlv_3='as' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3());
-    }
-(
-(
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0());
+				}
+			)
+		)
+		otherlv_3='as'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
-	        }
-        }
-	otherlv_4=RULE_ID
-	{
-		newLeafNode(otherlv_4, grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_3, grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
+					}
+				}
+				otherlv_4=RULE_ID
+				{
+					newLeafNode(otherlv_4, grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0());
+				}
+			)
+		)
+	)
 ;
 
+// Entry rule entryRuleEntityMockTemplate
+entryRuleEntityMockTemplate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEntityMockTemplateRule()); }
+	iv_ruleEntityMockTemplate=ruleEntityMockTemplate
+	{ $current=$iv_ruleEntityMockTemplate.current; }
+	EOF;
 
-
-
-
-// Entry rule entryRuleEntityMockTemporary
-entryRuleEntityMockTemporary returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getEntityMockTemporaryRule()); }
-	 iv_ruleEntityMockTemporary=ruleEntityMockTemporary 
-	 { $current=$iv_ruleEntityMockTemporary.current; } 
-	 EOF 
-;
-
-// Rule EntityMockTemporary
-ruleEntityMockTemporary returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='temporary' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockTemporaryAccess().getTemporaryKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockTemporaryAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockTemporaryRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='by object' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockTemporaryAccess().getByObjectKeyword_2());
-    }
-(
-(
+// Rule EntityMockTemplate
+ruleEntityMockTemplate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='template'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockTemporaryRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockTemporaryAccess().getObjectEntityMockObjectCrossReference_3_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0());
+		}
+		(
+			(
+				lv_name_1_0=RULE_ID
+				{
+					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockTemplateRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ID");
+				}
+			)
+		)
+		otherlv_2='byObject'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockTemplateRule());
+					}
+				}
+				otherlv_3=RULE_ID
+				{
+					newLeafNode(otherlv_3, grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
-
-
 // Entry rule entryRuleIEntityMockAttribute
-entryRuleIEntityMockAttribute returns [EObject current=null] 
-	:
+entryRuleIEntityMockAttribute returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getIEntityMockAttributeRule()); }
-	 iv_ruleIEntityMockAttribute=ruleIEntityMockAttribute 
-	 { $current=$iv_ruleIEntityMockAttribute.current; } 
-	 EOF 
-;
+	iv_ruleIEntityMockAttribute=ruleIEntityMockAttribute
+	{ $current=$iv_ruleIEntityMockAttribute.current; }
+	EOF;
 
 // Rule IEntityMockAttribute
-ruleIEntityMockAttribute returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0()); 
-    }
-    this_EntityMockAttributeByObject_0=ruleEntityMockAttributeByObject
-    { 
-        $current = $this_EntityMockAttributeByObject_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1()); 
-    }
-    this_EntityMockAttributeFiller_1=ruleEntityMockAttributeFiller
-    { 
-        $current = $this_EntityMockAttributeFiller_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2()); 
-    }
-    this_EntityMockAttributeByReference_2=ruleEntityMockAttributeByReference
-    { 
-        $current = $this_EntityMockAttributeByReference_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleIEntityMockAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0());
+		}
+		this_EntityMockAttributeByObject_0=ruleEntityMockAttributeByObject
+		{
+			$current = $this_EntityMockAttributeByObject_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1());
+		}
+		this_EntityMockAttributeFiller_1=ruleEntityMockAttributeFiller
+		{
+			$current = $this_EntityMockAttributeFiller_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2());
+		}
+		this_EntityMockAttributeByReference_2=ruleEntityMockAttributeByReference
+		{
+			$current = $this_EntityMockAttributeByReference_2.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockEntityFunction
-entryRuleEntityMockEntityFunction returns [EObject current=null] 
-	:
+entryRuleEntityMockEntityFunction returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockEntityFunctionRule()); }
-	 iv_ruleEntityMockEntityFunction=ruleEntityMockEntityFunction 
-	 { $current=$iv_ruleEntityMockEntityFunction.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockEntityFunction=ruleEntityMockEntityFunction
+	{ $current=$iv_ruleEntityMockEntityFunction.current; }
+	EOF;
 
 // Rule EntityMockEntityFunction
-ruleEntityMockEntityFunction returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0());
-    }
-(
-(
+ruleEntityMockEntityFunction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityFunctionRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2='calculate based on' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityFunctionAccess().getCalculateBasedOnKeyword_2());
-    }
-	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0()); 
-	    }
-		lv_params_4_0=ruleEntityMockEntityFunctionParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
-	        }
-       		add(
-       			$current, 
-       			"params",
-        		lv_params_4_0, 
-        		"EntityMockEntityFunctionParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_5=',' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0()); 
-	    }
-		lv_params_6_0=ruleEntityMockEntityFunctionParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
-	        }
-       		add(
-       			$current, 
-       			"params",
-        		lv_params_6_0, 
-        		"EntityMockEntityFunctionParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_7=')' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0()); 
-	    }
-		lv_body_8_0=ruleXBlockExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
-	        }
-       		set(
-       			$current, 
-       			"body",
-        		lv_body_8_0, 
-        		"XBlockExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityFunctionRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2='calculateOn'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2());
+		}
+		otherlv_3='('
+		{
+			newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0());
+					}
+					lv_params_4_0=ruleEntityMockEntityFunctionParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+						}
+						add(
+							$current,
+							"params",
+							lv_params_4_0,
+							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunctionParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_5=','
+				{
+					newLeafNode(otherlv_5, grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0());
+						}
+						lv_params_6_0=ruleEntityMockEntityFunctionParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+							}
+							add(
+								$current,
+								"params",
+								lv_params_6_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunctionParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_7=')'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0());
+				}
+				lv_body_8_0=ruleXBlockExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+					}
+					set(
+						$current,
+						"body",
+						lv_body_8_0,
+						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockEntityFunctionParameter
-entryRuleEntityMockEntityFunctionParameter returns [EObject current=null] 
-	:
+entryRuleEntityMockEntityFunctionParameter returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockEntityFunctionParameterRule()); }
-	 iv_ruleEntityMockEntityFunctionParameter=ruleEntityMockEntityFunctionParameter 
-	 { $current=$iv_ruleEntityMockEntityFunctionParameter.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockEntityFunctionParameter=ruleEntityMockEntityFunctionParameter
+	{ $current=$iv_ruleEntityMockEntityFunctionParameter.current; }
+	EOF;
 
 // Rule EntityMockEntityFunctionParameter
-ruleEntityMockEntityFunctionParameter returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
-	        }
-        }
-	otherlv_0=RULE_ID
-	{
-		newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0()); 
-	}
-
-)
-)
-    |((
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityFunctionParameterAccess().getReferencePathsLEntityReferenceCrossReference_1_0_0()); 
-	}
-
-)
-)((	otherlv_2='.' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityFunctionParameterAccess().getFullStopKeyword_1_1_0());
-    }
-)?(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityFunctionParameterAccess().getReferencePathsLEntityReferenceCrossReference_1_1_1_0()); 
-	}
-
-)
-))*	otherlv_4='.' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockEntityFunctionParameterAccess().getFullStopKeyword_1_2());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getEntityMockEntityFunctionParameterAccess().getReferenceRefLEntityAttributeCrossReference_1_3_0()); 
-	}
-
-)
-)))
+ruleEntityMockEntityFunctionParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
+					}
+				}
+				otherlv_0=RULE_ID
+				{
+					newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0());
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0());
+				}
+				lv_nestedAttribute_1_0=ruleEntityMockEntityNestedAttribute
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionParameterRule());
+					}
+					set(
+						$current,
+						"nestedAttribute",
+						lv_nestedAttribute_1_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityNestedAttribute");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
+// Entry rule entryRuleEntityMockEntityNestedAttribute
+entryRuleEntityMockEntityNestedAttribute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEntityMockEntityNestedAttributeRule()); }
+	iv_ruleEntityMockEntityNestedAttribute=ruleEntityMockEntityNestedAttribute
+	{ $current=$iv_ruleEntityMockEntityNestedAttribute.current; }
+	EOF;
 
-
-
+// Rule EntityMockEntityNestedAttribute
+ruleEntityMockEntityNestedAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityNestedAttributeRule());
+					}
+				}
+				otherlv_0=RULE_ID
+				{
+					newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0());
+				}
+			)
+		)
+		otherlv_1='.'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockEntityNestedAttributeRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0());
+				}
+			)
+		)
+	)
+;
 
 // Entry rule entryRuleEntityMockReferencedObjectAttribute
-entryRuleEntityMockReferencedObjectAttribute returns [EObject current=null] 
-	:
+entryRuleEntityMockReferencedObjectAttribute returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockReferencedObjectAttributeRule()); }
-	 iv_ruleEntityMockReferencedObjectAttribute=ruleEntityMockReferencedObjectAttribute 
-	 { $current=$iv_ruleEntityMockReferencedObjectAttribute.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockReferencedObjectAttribute=ruleEntityMockReferencedObjectAttribute
+	{ $current=$iv_ruleEntityMockReferencedObjectAttribute.current; }
+	EOF;
 
 // Rule EntityMockReferencedObjectAttribute
-ruleEntityMockReferencedObjectAttribute returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0(),
-            $current);
-    }
-)(
-(
+ruleEntityMockReferencedObjectAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0());
+				}
+			)
+		)
+		(
+			(
+				otherlv_2='.'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0());
+				}
+			)?
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+						}
+					}
+					otherlv_3=RULE_ID
+					{
+						newLeafNode(otherlv_3, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0());
+					}
+				)
+			)
+		)*
+		otherlv_4='.'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemporaryEntityMockTemporaryCrossReference_1_0()); 
-	}
-
-)
-)((	otherlv_2='.' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0());
-    }
-)?(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
-	        }
-        }
-	otherlv_3=RULE_ID
-	{
-		newLeafNode(otherlv_3, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0()); 
-	}
-
-)
-))*	otherlv_4='.' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0()); 
-	}
-
-)
-))
+			newLeafNode(otherlv_4, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+					}
+				}
+				otherlv_5=RULE_ID
+				{
+					newLeafNode(otherlv_5, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0());
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockAttributeByObject
-entryRuleEntityMockAttributeByObject returns [EObject current=null] 
-	:
+entryRuleEntityMockAttributeByObject returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockAttributeByObjectRule()); }
-	 iv_ruleEntityMockAttributeByObject=ruleEntityMockAttributeByObject 
-	 { $current=$iv_ruleEntityMockAttributeByObject.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockAttributeByObject=ruleEntityMockAttributeByObject
+	{ $current=$iv_ruleEntityMockAttributeByObject.current; }
+	EOF;
 
 // Rule EntityMockAttributeByObject
-ruleEntityMockAttributeByObject returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0()); 
-	}
-
-)
-)(	otherlv_2='as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0()); 
-	    }
-		lv_reference_3_0=ruleEntityMockReferencedObjectAttribute		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockAttributeByObjectRule());
-	        }
-       		set(
-       			$current, 
-       			"reference",
-        		lv_reference_3_0, 
-        		"EntityMockReferencedObjectAttribute");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-    |(	otherlv_4='using' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
-	        }
-        }
-	otherlv_5=RULE_ID
-	{
-		newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0()); 
-	}
-
-)
-)	otherlv_6='.' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
-	        }
-        }
-	otherlv_7=RULE_ID
-	{
-		newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0()); 
-	}
-
-)
-)))
+ruleEntityMockAttributeByObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='var'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+						}
+					}
+					otherlv_1=RULE_ID
+					{
+						newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0());
+					}
+				)
+			)
+			(
+				otherlv_2='as'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0());
+						}
+						lv_reference_3_0=ruleEntityMockReferencedObjectAttribute
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEntityMockAttributeByObjectRule());
+							}
+							set(
+								$current,
+								"reference",
+								lv_reference_3_0,
+								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockReferencedObjectAttribute");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		    |
+		(
+			otherlv_4='using'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+						}
+					}
+					otherlv_5=RULE_ID
+					{
+						newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0());
+					}
+				)
+			)
+			otherlv_6='.'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2());
+			}
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+						}
+					}
+					otherlv_7=RULE_ID
+					{
+						newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0());
+					}
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockAttributeFiller
-entryRuleEntityMockAttributeFiller returns [EObject current=null] 
-	:
+entryRuleEntityMockAttributeFiller returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockAttributeFillerRule()); }
-	 iv_ruleEntityMockAttributeFiller=ruleEntityMockAttributeFiller 
-	 { $current=$iv_ruleEntityMockAttributeFiller.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockAttributeFiller=ruleEntityMockAttributeFiller
+	{ $current=$iv_ruleEntityMockAttributeFiller.current; }
+	EOF;
 
 // Rule EntityMockAttributeFiller
-ruleEntityMockAttributeFiller returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='var' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0());
-    }
-(
-(
+ruleEntityMockAttributeFiller returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='var'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeFillerRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2='randomize' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
-	    }
-		lv_fillerType_3_0=rulePropertyFillerType		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEntityMockAttributeFillerRule());
-	        }
-       		set(
-       			$current, 
-       			"fillerType",
-        		lv_fillerType_3_0, 
-        		"PropertyFillerType");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockAttributeFillerRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2='randomize'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0());
+				}
+				lv_fillerType_3_0=rulePropertyFillerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEntityMockAttributeFillerRule());
+					}
+					set(
+						$current,
+						"fillerType",
+						lv_fillerType_3_0,
+						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEntityMockAttributeByReference
-entryRuleEntityMockAttributeByReference returns [EObject current=null] 
-	:
+entryRuleEntityMockAttributeByReference returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEntityMockAttributeByReferenceRule()); }
-	 iv_ruleEntityMockAttributeByReference=ruleEntityMockAttributeByReference 
-	 { $current=$iv_ruleEntityMockAttributeByReference.current; } 
-	 EOF 
-;
+	iv_ruleEntityMockAttributeByReference=ruleEntityMockAttributeByReference
+	{ $current=$iv_ruleEntityMockAttributeByReference.current; }
+	EOF;
 
 // Rule EntityMockAttributeByReference
-ruleEntityMockAttributeByReference returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='ref' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0());
-    }
-(
-(
+ruleEntityMockAttributeByReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='ref'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0()); 
-	}
-
-)
-)	otherlv_2='to' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2());
-    }
-(	otherlv_3='existing entities' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0());
-    }
-
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
-	        }
-        }
-	otherlv_4=RULE_ID
-	{
-		newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0()); 
-	}
-
-)
-))(	otherlv_5='optional for' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0());
-    }
-(
-(
-		lv_optionalFor_6_0=RULE_INT
-		{
-			newLeafNode(lv_optionalFor_6_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0());
 		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0());
+				}
+			)
+		)
+		otherlv_2='to'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"optionalFor",
-        		lv_optionalFor_6_0, 
-        		"INT");
-	    }
-
-)
-)	otherlv_7='percent' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2());
-    }
-)?)
+			newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2());
+		}
+		(
+			otherlv_3='existingEntities'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0());
+			}
+			    |
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+						}
+					}
+					otherlv_4=RULE_ID
+					{
+						newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0());
+					}
+				)
+			)
+		)
+		(
+			otherlv_5='optionalFor'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0());
+			}
+			(
+				(
+					lv_optionalFor_6_0=RULE_INT
+					{
+						newLeafNode(lv_optionalFor_6_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"optionalFor",
+							lv_optionalFor_6_0,
+							"org.eclipse.xtext.xbase.Xbase.INT");
+					}
+				)
+			)
+			otherlv_7='percent'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleSignedNumber
-entryRuleSignedNumber returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getSignedNumberRule()); } 
-	 iv_ruleSignedNumber=ruleSignedNumber 
-	 { $current=$iv_ruleSignedNumber.current.getText(); }  
-	 EOF 
-;
+entryRuleSignedNumber returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getSignedNumberRule()); }
+	iv_ruleSignedNumber=ruleSignedNumber
+	{ $current=$iv_ruleSignedNumber.current.getText(); }
+	EOF;
 
 // Rule SignedNumber
-ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-	kw='-' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0()); 
-    }
-)?
-    { 
-        newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1()); 
-    }
-    this_UnsignedNumber_1=ruleUnsignedNumber    {
-		$current.merge(this_UnsignedNumber_1);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleUnsignedNumber
-entryRuleUnsignedNumber returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getUnsignedNumberRule()); } 
-	 iv_ruleUnsignedNumber=ruleUnsignedNumber 
-	 { $current=$iv_ruleUnsignedNumber.current.getText(); }  
-	 EOF 
-;
-
-// Rule UnsignedNumber
-ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(    this_INT_0=RULE_INT    {
-		$current.merge(this_INT_0);
-    }
-
-    { 
-    newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0()); 
-    }
-(
-	kw='.' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0()); 
-    }
-    this_INT_2=RULE_INT    {
-		$current.merge(this_INT_2);
-    }
-
-    { 
-    newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1()); 
-    }
-)?)
-    ;
-
-
-
-
-
-// Entry rule entryRuleSINT
-entryRuleSINT returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getSINTRule()); } 
-	 iv_ruleSINT=ruleSINT 
-	 { $current=$iv_ruleSINT.current.getText(); }  
-	 EOF 
-;
-
-// Rule SINT
-ruleSINT returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-	kw='-' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getSINTAccess().getHyphenMinusKeyword_0()); 
-    }
-)?    this_INT_1=RULE_INT    {
-		$current.merge(this_INT_1);
-    }
-
-    { 
-    newLeafNode(this_INT_1, grammarAccess.getSINTAccess().getINTTerminalRuleCall_1()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleQualifiedName
-entryRuleQualifiedName returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); } 
-	 iv_ruleQualifiedName=ruleQualifiedName 
-	 { $current=$iv_ruleQualifiedName.current.getText(); }  
-	 EOF 
-;
-
-// Rule QualifiedName
-ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
-    }
-    this_ValidID_0=ruleValidID    {
-		$current.merge(this_ValidID_0);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-(((
-	'.' 
-)=>
-	kw='.' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
-    }
-)
-    { 
-        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
-    }
-    this_ValidID_2=ruleValidID    {
-		$current.merge(this_ValidID_2);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-)*)
-    ;
-
-
-
-
-
-// Entry rule entryRuleValidID
-entryRuleValidID returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getValidIDRule()); } 
-	 iv_ruleValidID=ruleValidID 
-	 { $current=$iv_ruleValidID.current.getText(); }  
-	 EOF 
-;
-
-// Rule ValidID
-ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-    this_ID_0=RULE_ID    {
-		$current.merge(this_ID_0);
-    }
-
-    { 
-    newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
-    }
-
-    ;
-
-
-
-
-
-// Entry rule entryRuleXAnnotation
-entryRuleXAnnotation returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
-	 iv_ruleXAnnotation=ruleXAnnotation 
-	 { $current=$iv_ruleXAnnotation.current; } 
-	 EOF 
-;
-
-// Rule XAnnotation
-ruleXAnnotation returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
-            $current);
-    }
-)	otherlv_1='@' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
-    }
-(
-(
+ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0());
+			}
+		)?
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAnnotationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(((	'(' 
-)=>	otherlv_3='(' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
-    }
-)((((((
-(
-		ruleValidID
-)
-)	'=' 
-))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
-	    }
-		lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
-	        }
-       		add(
-       			$current, 
-       			"elementValuePairs",
-        		lv_elementValuePairs_4_0, 
-        		"XAnnotationElementValuePair");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_5=',' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
-    }
-((((
-(
-		ruleValidID
-)
-)	'=' 
-))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
-	    }
-		lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
-	        }
-       		add(
-       			$current, 
-       			"elementValuePairs",
-        		lv_elementValuePairs_6_0, 
-        		"XAnnotationElementValuePair");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
-	    }
-		lv_value_7_0=ruleXAnnotationElementValueOrCommaList		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_7_0, 
-        		"XAnnotationElementValueOrCommaList");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?	otherlv_8=')' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
-    }
-)?)
-;
-
-
-
-
-
-// Entry rule entryRuleXAnnotationElementValuePair
-entryRuleXAnnotationElementValuePair returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
-	 iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair 
-	 { $current=$iv_ruleXAnnotationElementValuePair.current; } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValuePair
-ruleXAnnotationElementValuePair returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((((
-(
-		ruleValidID
-)
-)	'=' 
-))=>((
-(
+			newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1());
+		}
+		this_UnsignedNumber_1=ruleUnsignedNumber
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
-	    }
-		ruleValidID		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_1='=' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
-	    }
-		lv_value_2_0=ruleXAnnotationElementValue		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_2_0, 
-        		"XAnnotationElementValue");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXAnnotationElementValueOrCommaList
-entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
-	 iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList 
-	 { $current=$iv_ruleXAnnotationElementValueOrCommaList.current; } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValueOrCommaList
-ruleXAnnotationElementValueOrCommaList returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((((((
-)	'#' 
-	'[' 
-))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
-            $current);
-    }
-)	otherlv_1='#' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
-    }
-	otherlv_2='[' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
-    }
-))((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
-	    }
-		lv_elements_3_0=ruleXAnnotationOrExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_3_0, 
-        		"XAnnotationOrExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
-	    }
-		lv_elements_5_0=ruleXAnnotationOrExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_5_0, 
-        		"XAnnotationOrExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_6=']' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
-    }
-)
-    |(
-    { 
-        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
-    }
-    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
-    { 
-        $current = $this_XAnnotationOrExpression_7.current; 
-        afterParserOrEnumRuleCall();
-    }
-((
-    {
-        $current = forceCreateModelElementAndAdd(
-            grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
-            $current);
-    }
-)(	otherlv_9=',' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
-	    }
-		lv_elements_10_0=ruleXAnnotationOrExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_10_0, 
-        		"XAnnotationOrExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))+)?))
-;
-
-
-
-
-
-// Entry rule entryRuleXAnnotationElementValue
-entryRuleXAnnotationElementValue returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
-	 iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue 
-	 { $current=$iv_ruleXAnnotationElementValue.current; } 
-	 EOF 
-;
-
-// Rule XAnnotationElementValue
-ruleXAnnotationElementValue returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((((((
-)	'#' 
-	'[' 
-))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
-            $current);
-    }
-)	otherlv_1='#' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
-    }
-	otherlv_2='[' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
-    }
-))((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
-	    }
-		lv_elements_3_0=ruleXAnnotationOrExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_3_0, 
-        		"XAnnotationOrExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
-	    }
-		lv_elements_5_0=ruleXAnnotationOrExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_5_0, 
-        		"XAnnotationOrExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_6=']' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
-    }
-)
-    |
-    { 
-        newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
-    }
-    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
-    { 
-        $current = $this_XAnnotationOrExpression_7.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXAnnotationOrExpression
-entryRuleXAnnotationOrExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
-	 iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression 
-	 { $current=$iv_ruleXAnnotationOrExpression.current; } 
-	 EOF 
-;
-
-// Rule XAnnotationOrExpression
-ruleXAnnotationOrExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
-    }
-    this_XAnnotation_0=ruleXAnnotation
-    { 
-        $current = $this_XAnnotation_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
-    }
-    this_XExpression_1=ruleXExpression
-    { 
-        $current = $this_XExpression_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXExpression
-entryRuleXExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
-	 iv_ruleXExpression=ruleXExpression 
-	 { $current=$iv_ruleXExpression.current; } 
-	 EOF 
-;
-
-// Rule XExpression
-ruleXExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-
-    { 
-        newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
-    }
-    this_XAssignment_0=ruleXAssignment
-    { 
-        $current = $this_XAssignment_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-;
-
-
-
-
-
-// Entry rule entryRuleXAssignment
-entryRuleXAssignment returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
-	 iv_ruleXAssignment=ruleXAssignment 
-	 { $current=$iv_ruleXAssignment.current; } 
-	 EOF 
-;
-
-// Rule XAssignment
-ruleXAssignment returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAssignmentRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
-	    }
-		ruleFeatureCallID		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    { 
-        newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
-    }
-ruleOpSingleAssign
-    { 
-        afterParserOrEnumRuleCall();
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
-	    }
-		lv_value_3_0=ruleXAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_3_0, 
-        		"XAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-    |(
-    { 
-        newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
-    }
-    this_XOrExpression_4=ruleXOrExpression
-    { 
-        $current = $this_XOrExpression_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpMultiAssign
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAssignmentRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
-	    }
-		ruleOpMultiAssign		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
-	    }
-		lv_rightOperand_7_0=ruleXAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAssignmentRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_7_0, 
-        		"XAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?))
-;
-
-
-
-
-
-// Entry rule entryRuleOpSingleAssign
-entryRuleOpSingleAssign returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); } 
-	 iv_ruleOpSingleAssign=ruleOpSingleAssign 
-	 { $current=$iv_ruleOpSingleAssign.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpSingleAssign
-ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-
-	kw='=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
-    }
-
-    ;
-
-
-
-
-
-// Entry rule entryRuleOpMultiAssign
-entryRuleOpMultiAssign returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); } 
-	 iv_ruleOpMultiAssign=ruleOpMultiAssign 
-	 { $current=$iv_ruleOpMultiAssign.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpMultiAssign
-ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='+=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
-    }
-
-    |
-	kw='-=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
-    }
-
-    |
-	kw='*=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
-    }
-
-    |
-	kw='/=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
-    }
-
-    |
-	kw='%=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
-    }
-
-    |(
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
-    }
-
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
-    }
-
-	kw='=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
-    }
-)
-    |(
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
-    }
-(
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
-    }
-)?
-	kw='>=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
-    }
-))
-    ;
-
-
-
-
-
-// Entry rule entryRuleXOrExpression
-entryRuleXOrExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
-	 iv_ruleXOrExpression=ruleXOrExpression 
-	 { $current=$iv_ruleXOrExpression.current; } 
-	 EOF 
-;
-
-// Rule XOrExpression
-ruleXOrExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
-    }
-    this_XAndExpression_0=ruleXAndExpression
-    { 
-        $current = $this_XAndExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpOr
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXOrExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpOr		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXAndExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XAndExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpOr
-entryRuleOpOr returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpOrRule()); } 
-	 iv_ruleOpOr=ruleOpOr 
-	 { $current=$iv_ruleOpOr.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpOr
-ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-
-	kw='||' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
-    }
-
-    ;
-
-
-
-
-
-// Entry rule entryRuleXAndExpression
-entryRuleXAndExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
-	 iv_ruleXAndExpression=ruleXAndExpression 
-	 { $current=$iv_ruleXAndExpression.current; } 
-	 EOF 
-;
-
-// Rule XAndExpression
-ruleXAndExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
-    }
-    this_XEqualityExpression_0=ruleXEqualityExpression
-    { 
-        $current = $this_XEqualityExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpAnd
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAndExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpAnd		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXEqualityExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XEqualityExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpAnd
-entryRuleOpAnd returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpAndRule()); } 
-	 iv_ruleOpAnd=ruleOpAnd 
-	 { $current=$iv_ruleOpAnd.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpAnd
-ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-
-	kw='&&' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
-    }
-
-    ;
-
-
-
-
-
-// Entry rule entryRuleXEqualityExpression
-entryRuleXEqualityExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
-	 iv_ruleXEqualityExpression=ruleXEqualityExpression 
-	 { $current=$iv_ruleXEqualityExpression.current; } 
-	 EOF 
-;
-
-// Rule XEqualityExpression
-ruleXEqualityExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
-    }
-    this_XRelationalExpression_0=ruleXRelationalExpression
-    { 
-        $current = $this_XRelationalExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpEquality
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXEqualityExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpEquality		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXRelationalExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XRelationalExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpEquality
-entryRuleOpEquality returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpEqualityRule()); } 
-	 iv_ruleOpEquality=ruleOpEquality 
-	 { $current=$iv_ruleOpEquality.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpEquality
-ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='==' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
-    }
-
-    |
-	kw='!=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
-    }
-
-    |
-	kw='===' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
-    }
-
-    |
-	kw='!==' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXRelationalExpression
-entryRuleXRelationalExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
-	 iv_ruleXRelationalExpression=ruleXRelationalExpression 
-	 { $current=$iv_ruleXRelationalExpression.current; } 
-	 EOF 
-;
-
-// Rule XRelationalExpression
-ruleXRelationalExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
-    }
-    this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
-    { 
-        $current = $this_XOtherOperatorExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-((((((
-)	'instanceof' 
-))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
-            $current);
-    }
-)	otherlv_2='instanceof' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
-	    }
-		lv_type_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"type",
-        		lv_type_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-    |(((((
-)(
-(
-		ruleOpCompare
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXRelationalExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
-	    }
-		ruleOpCompare		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
-	    }
-		lv_rightOperand_6_0=ruleXOtherOperatorExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_6_0, 
-        		"XOtherOperatorExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpCompare
-entryRuleOpCompare returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpCompareRule()); } 
-	 iv_ruleOpCompare=ruleOpCompare 
-	 { $current=$iv_ruleOpCompare.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpCompare
-ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='>=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
-    }
-
-    |(
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
-    }
-
-	kw='=' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
-    }
-)
-    |
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
-    }
-
-    |
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXOtherOperatorExpression
-entryRuleXOtherOperatorExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
-	 iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression 
-	 { $current=$iv_ruleXOtherOperatorExpression.current; } 
-	 EOF 
-;
-
-// Rule XOtherOperatorExpression
-ruleXOtherOperatorExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
-    }
-    this_XAdditiveExpression_0=ruleXAdditiveExpression
-    { 
-        $current = $this_XAdditiveExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpOther
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpOther		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXAdditiveExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XAdditiveExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpOther
-entryRuleOpOther returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpOtherRule()); } 
-	 iv_ruleOpOther=ruleOpOther 
-	 { $current=$iv_ruleOpOther.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpOther
-ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='->' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
-    }
-
-    |
-	kw='..<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
-    }
-
-    |(
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
-    }
-
-	kw='..' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
-    }
-)
-    |
-	kw='..' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
-    }
-
-    |
-	kw='=>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
-    }
-
-    |(
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
-    }
-((((
-	'>' 
-
-	'>' 
-))=>(
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
-    }
-
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
-    }
-))
-    |
-	kw='>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
-    }
-))
-    |(
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
-    }
-((((
-	'<' 
-
-	'<' 
-))=>(
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
-    }
-
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
-    }
-))
-    |
-	kw='<' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
-    }
-
-    |
-	kw='=>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
-    }
-))
-    |
-	kw='<>' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
-    }
-
-    |
-	kw='?:' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXAdditiveExpression
-entryRuleXAdditiveExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
-	 iv_ruleXAdditiveExpression=ruleXAdditiveExpression 
-	 { $current=$iv_ruleXAdditiveExpression.current; } 
-	 EOF 
-;
-
-// Rule XAdditiveExpression
-ruleXAdditiveExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
-    }
-    this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
-    { 
-        $current = $this_XMultiplicativeExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpAdd
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpAdd		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXMultiplicativeExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XMultiplicativeExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpAdd
-entryRuleOpAdd returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpAddRule()); } 
-	 iv_ruleOpAdd=ruleOpAdd 
-	 { $current=$iv_ruleOpAdd.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpAdd
-ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='+' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
-    }
-
-    |
-	kw='-' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXMultiplicativeExpression
-entryRuleXMultiplicativeExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
-	 iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression 
-	 { $current=$iv_ruleXMultiplicativeExpression.current; } 
-	 EOF 
-;
-
-// Rule XMultiplicativeExpression
-ruleXMultiplicativeExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
-    }
-    this_XUnaryOperation_0=ruleXUnaryOperation
-    { 
-        $current = $this_XUnaryOperation_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)(
-(
-		ruleOpMulti
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
-	    }
-		ruleOpMulti		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
-	    }
-		lv_rightOperand_3_0=ruleXUnaryOperation		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"rightOperand",
-        		lv_rightOperand_3_0, 
-        		"XUnaryOperation");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleOpMulti
-entryRuleOpMulti returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpMultiRule()); } 
-	 iv_ruleOpMulti=ruleOpMulti 
-	 { $current=$iv_ruleOpMulti.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpMulti
-ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='*' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
-    }
-
-    |
-	kw='**' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
-    }
-
-    |
-	kw='/' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
-    }
-
-    |
-	kw='%' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXUnaryOperation
-entryRuleXUnaryOperation returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
-	 iv_ruleXUnaryOperation=ruleXUnaryOperation 
-	 { $current=$iv_ruleXUnaryOperation.current; } 
-	 EOF 
-;
-
-// Rule XUnaryOperation
-ruleXUnaryOperation returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXUnaryOperationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
-	    }
-		ruleOpUnary		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
-	    }
-		lv_operand_2_0=ruleXUnaryOperation		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
-	        }
-       		set(
-       			$current, 
-       			"operand",
-        		lv_operand_2_0, 
-        		"XUnaryOperation");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-    |
-    { 
-        newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
-    }
-    this_XCastedExpression_3=ruleXCastedExpression
-    { 
-        $current = $this_XCastedExpression_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleOpUnary
-entryRuleOpUnary returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpUnaryRule()); } 
-	 iv_ruleOpUnary=ruleOpUnary 
-	 { $current=$iv_ruleOpUnary.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpUnary
-ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='!' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
-    }
-
-    |
-	kw='-' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
-    }
-
-    |
-	kw='+' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXCastedExpression
-entryRuleXCastedExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
-	 iv_ruleXCastedExpression=ruleXCastedExpression 
-	 { $current=$iv_ruleXCastedExpression.current; } 
-	 EOF 
-;
-
-// Rule XCastedExpression
-ruleXCastedExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
-    }
-    this_XPostfixOperation_0=ruleXPostfixOperation
-    { 
-        $current = $this_XPostfixOperation_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-(((((
-)	'as' 
-))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
-            $current);
-    }
-)	otherlv_2='as' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
-	    }
-		lv_type_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"type",
-        		lv_type_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
-;
-
-
-
-
-
-// Entry rule entryRuleXPostfixOperation
-entryRuleXPostfixOperation returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
-	 iv_ruleXPostfixOperation=ruleXPostfixOperation 
-	 { $current=$iv_ruleXPostfixOperation.current; } 
-	 EOF 
-;
-
-// Rule XPostfixOperation
-ruleXPostfixOperation returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
-    }
-    this_XMemberFeatureCall_0=ruleXMemberFeatureCall
-    { 
-        $current = $this_XMemberFeatureCall_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-((((
-)(
-(
-		ruleOpPostfix
-)
-)))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXPostfixOperationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
-	    }
-		ruleOpPostfix		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))?)
-;
-
-
-
-
-
-// Entry rule entryRuleOpPostfix
-entryRuleOpPostfix returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getOpPostfixRule()); } 
-	 iv_ruleOpPostfix=ruleOpPostfix 
-	 { $current=$iv_ruleOpPostfix.current.getText(); }  
-	 EOF 
-;
-
-// Rule OpPostfix
-ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-	kw='++' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
-    }
-
-    |
-	kw='--' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXMemberFeatureCall
-entryRuleXMemberFeatureCall returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
-	 iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall 
-	 { $current=$iv_ruleXMemberFeatureCall.current; } 
-	 EOF 
-;
-
-// Rule XMemberFeatureCall
-ruleXMemberFeatureCall returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
-    }
-    this_XPrimaryExpression_0=ruleXPrimaryExpression
-    { 
-        $current = $this_XPrimaryExpression_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-((((((
-)(	'.' 
-
-    |(
-(
-	'::' 
- 
-
-)
-))(
-(
-		ruleFeatureCallID
-)
-)	ruleOpSingleAssign))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
-            $current);
-    }
-)(	otherlv_2='.' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
-    }
-
-    |(
-(
-		lv_explicitStatic_3_0=	'::' 
-    {
-        newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		setWithLastConsumed($current, "explicitStatic", true, "::");
-	    }
-
-)
-))(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
-	    }
-		ruleFeatureCallID		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    { 
-        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
-    }
-ruleOpSingleAssign
-    { 
-        afterParserOrEnumRuleCall();
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
-	    }
-		lv_value_6_0=ruleXAssignment		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_6_0, 
-        		"XAssignment");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-    |(((((
-)(	'.' 
-
-    |(
-(
-	'?.' 
- 
-
-)
-)
-    |(
-(
-	'::' 
- 
-
-)
-))))=>((
-    {
-        $current = forceCreateModelElementAndSet(
-            grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
-            $current);
-    }
-)(	otherlv_8='.' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
-    }
-
-    |(
-(
-		lv_nullSafe_9_0=	'?.' 
-    {
-        newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		setWithLastConsumed($current, "nullSafe", true, "?.");
-	    }
-
-)
-)
-    |(
-(
-		lv_explicitStatic_10_0=	'::' 
-    {
-        newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		setWithLastConsumed($current, "explicitStatic", true, "::");
-	    }
-
-)
-))))(	otherlv_11='<' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
-	    }
-		lv_typeArguments_12_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_12_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_13=',' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
-	    }
-		lv_typeArguments_14_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_14_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_15='>' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
-    }
-)?(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
-	    }
-		ruleIdOrSuper		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(((
-(
-	'(' 
- 
-
-)
-)=>
-(
-		lv_explicitOperationCall_17_0=	'(' 
-    {
-        newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		setWithLastConsumed($current, "explicitOperationCall", true, "(");
-	    }
-
-)
-)(((((
-)((
-(
-ruleJvmFormalParameter
-)
-)(	',' 
-(
-(
-ruleJvmFormalParameter
-)
-))*)?(
-(
-	'|' 
- 
-
-)
-)))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
-	    }
-		lv_memberCallArguments_18_0=ruleXShortClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"memberCallArguments",
-        		lv_memberCallArguments_18_0, 
-        		"XShortClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
-	    }
-		lv_memberCallArguments_19_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"memberCallArguments",
-        		lv_memberCallArguments_19_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_20=',' 
-    {
-    	newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
-	    }
-		lv_memberCallArguments_21_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"memberCallArguments",
-        		lv_memberCallArguments_21_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*))?	otherlv_22=')' 
-    {
-    	newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
-    }
-)?((((
-)	'[' 
-))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
-	    }
-		lv_memberCallArguments_23_0=ruleXClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"memberCallArguments",
-        		lv_memberCallArguments_23_0, 
-        		"XClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?))*)
-;
-
-
-
-
-
-// Entry rule entryRuleXPrimaryExpression
-entryRuleXPrimaryExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
-	 iv_ruleXPrimaryExpression=ruleXPrimaryExpression 
-	 { $current=$iv_ruleXPrimaryExpression.current; } 
-	 EOF 
-;
-
-// Rule XPrimaryExpression
-ruleXPrimaryExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
-    }
-    this_XConstructorCall_0=ruleXConstructorCall
-    { 
-        $current = $this_XConstructorCall_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
-    }
-    this_XBlockExpression_1=ruleXBlockExpression
-    { 
-        $current = $this_XBlockExpression_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
-    }
-    this_XSwitchExpression_2=ruleXSwitchExpression
-    { 
-        $current = $this_XSwitchExpression_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |((((
-)	'synchronized' 
-	'(' 
-))=>
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
-    }
-    this_XSynchronizedExpression_3=ruleXSynchronizedExpression
-    { 
-        $current = $this_XSynchronizedExpression_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
-    }
-    this_XFeatureCall_4=ruleXFeatureCall
-    { 
-        $current = $this_XFeatureCall_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
-    }
-    this_XLiteral_5=ruleXLiteral
-    { 
-        $current = $this_XLiteral_5.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
-    }
-    this_XIfExpression_6=ruleXIfExpression
-    { 
-        $current = $this_XIfExpression_6.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |((((
-)	'for' 
-	'(' 
-(
-(
-ruleJvmFormalParameter
-)
-)	':' 
-))=>
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
-    }
-    this_XForLoopExpression_7=ruleXForLoopExpression
-    { 
-        $current = $this_XForLoopExpression_7.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
-    }
-    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
-    { 
-        $current = $this_XBasicForLoopExpression_8.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
-    }
-    this_XWhileExpression_9=ruleXWhileExpression
-    { 
-        $current = $this_XWhileExpression_9.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
-    }
-    this_XDoWhileExpression_10=ruleXDoWhileExpression
-    { 
-        $current = $this_XDoWhileExpression_10.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
-    }
-    this_XThrowExpression_11=ruleXThrowExpression
-    { 
-        $current = $this_XThrowExpression_11.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
-    }
-    this_XReturnExpression_12=ruleXReturnExpression
-    { 
-        $current = $this_XReturnExpression_12.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
-    }
-    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
-    { 
-        $current = $this_XTryCatchFinallyExpression_13.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
-    }
-    this_XParenthesizedExpression_14=ruleXParenthesizedExpression
-    { 
-        $current = $this_XParenthesizedExpression_14.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXLiteral
-entryRuleXLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
-	 iv_ruleXLiteral=ruleXLiteral 
-	 { $current=$iv_ruleXLiteral.current; } 
-	 EOF 
-;
-
-// Rule XLiteral
-ruleXLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
-    }
-    this_XCollectionLiteral_0=ruleXCollectionLiteral
-    { 
-        $current = $this_XCollectionLiteral_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |((((
-)	'[' 
-))=>
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
-    }
-    this_XClosure_1=ruleXClosure
-    { 
-        $current = $this_XClosure_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-    |
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
-    }
-    this_XBooleanLiteral_2=ruleXBooleanLiteral
-    { 
-        $current = $this_XBooleanLiteral_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
-    }
-    this_XNumberLiteral_3=ruleXNumberLiteral
-    { 
-        $current = $this_XNumberLiteral_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
-    }
-    this_XNullLiteral_4=ruleXNullLiteral
-    { 
-        $current = $this_XNullLiteral_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
-    }
-    this_XStringLiteral_5=ruleXStringLiteral
-    { 
-        $current = $this_XStringLiteral_5.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
-    }
-    this_XTypeLiteral_6=ruleXTypeLiteral
-    { 
-        $current = $this_XTypeLiteral_6.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXCollectionLiteral
-entryRuleXCollectionLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
-	 iv_ruleXCollectionLiteral=ruleXCollectionLiteral 
-	 { $current=$iv_ruleXCollectionLiteral.current; } 
-	 EOF 
-;
-
-// Rule XCollectionLiteral
-ruleXCollectionLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
-    }
-    this_XSetLiteral_0=ruleXSetLiteral
-    { 
-        $current = $this_XSetLiteral_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
-    }
-    this_XListLiteral_1=ruleXListLiteral
-    { 
-        $current = $this_XListLiteral_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXSetLiteral
-entryRuleXSetLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
-	 iv_ruleXSetLiteral=ruleXSetLiteral 
-	 { $current=$iv_ruleXSetLiteral.current; } 
-	 EOF 
-;
-
-// Rule XSetLiteral
-ruleXSetLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
-            $current);
-    }
-)	otherlv_1='#' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
-    }
-	otherlv_2='{' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
-	    }
-		lv_elements_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
-	    }
-		lv_elements_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_6='}' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXListLiteral
-entryRuleXListLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
-	 iv_ruleXListLiteral=ruleXListLiteral 
-	 { $current=$iv_ruleXListLiteral.current; } 
-	 EOF 
-;
-
-// Rule XListLiteral
-ruleXListLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
-            $current);
-    }
-)	otherlv_1='#' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
-    }
-	otherlv_2='[' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
-	    }
-		lv_elements_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXListLiteralRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
-	    }
-		lv_elements_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXListLiteralRule());
-	        }
-       		add(
-       			$current, 
-       			"elements",
-        		lv_elements_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_6=']' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXClosure
-entryRuleXClosure returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXClosureRule()); }
-	 iv_ruleXClosure=ruleXClosure 
-	 { $current=$iv_ruleXClosure.current; } 
-	 EOF 
-;
-
-// Rule XClosure
-ruleXClosure returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((((
-)	'[' 
-))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
-            $current);
-    }
-)	otherlv_1='[' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
-    }
-))(((((
-(
-ruleJvmFormalParameter
-)
-)(	',' 
-(
-(
-ruleJvmFormalParameter
-)
-))*)?(
-(
-	'|' 
- 
-
-)
-)))=>(((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
-	    }
-		lv_declaredFormalParameters_2_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
-	        }
-       		add(
-       			$current, 
-       			"declaredFormalParameters",
-        		lv_declaredFormalParameters_2_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_3=',' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
-	    }
-		lv_declaredFormalParameters_4_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
-	        }
-       		add(
-       			$current, 
-       			"declaredFormalParameters",
-        		lv_declaredFormalParameters_4_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?(
-(
-		lv_explicitSyntax_5_0=	'|' 
-    {
-        newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXClosureRule());
-	        }
-       		setWithLastConsumed($current, "explicitSyntax", true, "|");
-	    }
-
-)
-)))?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
-	    }
-		lv_expression_6_0=ruleXExpressionInClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXClosureRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_6_0, 
-        		"XExpressionInClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_7=']' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXExpressionInClosure
-entryRuleXExpressionInClosure returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
-	 iv_ruleXExpressionInClosure=ruleXExpressionInClosure 
-	 { $current=$iv_ruleXExpressionInClosure.current; } 
-	 EOF 
-;
-
-// Rule XExpressionInClosure
-ruleXExpressionInClosure returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
-            $current);
-    }
-)((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
-	    }
-		lv_expressions_1_0=ruleXExpressionOrVarDeclaration		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
-	        }
-       		add(
-       			$current, 
-       			"expressions",
-        		lv_expressions_1_0, 
-        		"XExpressionOrVarDeclaration");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_2=';' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
-    }
-)?)*)
-;
-
-
-
-
-
-// Entry rule entryRuleXShortClosure
-entryRuleXShortClosure returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
-	 iv_ruleXShortClosure=ruleXShortClosure 
-	 { $current=$iv_ruleXShortClosure.current; } 
-	 EOF 
-;
-
-// Rule XShortClosure
-ruleXShortClosure returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((((
-)((
-(
-ruleJvmFormalParameter
-)
-)(	',' 
-(
-(
-ruleJvmFormalParameter
-)
-))*)?(
-(
-	'|' 
- 
-
-)
-)))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
-            $current);
-    }
-)((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
-	    }
-		lv_declaredFormalParameters_1_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
-	        }
-       		add(
-       			$current, 
-       			"declaredFormalParameters",
-        		lv_declaredFormalParameters_1_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_2=',' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
-	    }
-		lv_declaredFormalParameters_3_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
-	        }
-       		add(
-       			$current, 
-       			"declaredFormalParameters",
-        		lv_declaredFormalParameters_3_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?(
-(
-		lv_explicitSyntax_4_0=	'|' 
-    {
-        newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXShortClosureRule());
-	        }
-       		setWithLastConsumed($current, "explicitSyntax", true, "|");
-	    }
-
-)
-)))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
-	    }
-		lv_expression_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXShortClosureRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXParenthesizedExpression
-entryRuleXParenthesizedExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
-	 iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression 
-	 { $current=$iv_ruleXParenthesizedExpression.current; } 
-	 EOF 
-;
-
-// Rule XParenthesizedExpression
-ruleXParenthesizedExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='(' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
-    }
-
-    { 
-        newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
-    }
-    this_XExpression_1=ruleXExpression
-    { 
-        $current = $this_XExpression_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-	otherlv_2=')' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXIfExpression
-entryRuleXIfExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXIfExpressionRule()); }
-	 iv_ruleXIfExpression=ruleXIfExpression 
-	 { $current=$iv_ruleXIfExpression.current; } 
-	 EOF 
-;
-
-// Rule XIfExpression
-ruleXIfExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='if' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); 
-	    }
-		lv_if_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"if",
-        		lv_if_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4=')' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); 
-	    }
-		lv_then_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"then",
-        		lv_then_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(((	'else' 
-)=>	otherlv_6='else' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); 
-	    }
-		lv_else_7_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"else",
-        		lv_else_7_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
-;
-
-
-
-
-
-// Entry rule entryRuleXSwitchExpression
-entryRuleXSwitchExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXSwitchExpressionRule()); }
-	 iv_ruleXSwitchExpression=ruleXSwitchExpression 
-	 { $current=$iv_ruleXSwitchExpression.current; } 
-	 EOF 
-;
-
-// Rule XSwitchExpression
-ruleXSwitchExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='switch' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
-    }
-(((((	'(' 
-(
-(
-ruleJvmFormalParameter
-)
-)	':' 
-))=>(	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); 
-	    }
-		lv_declaredParam_3_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"declaredParam",
-        		lv_declaredParam_3_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4=':' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); 
-	    }
-		lv_switch_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"switch",
-        		lv_switch_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_6=')' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
-    }
-)
-    |(((((
-(
-ruleJvmFormalParameter
-)
-)	':' 
-))=>((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); 
-	    }
-		lv_declaredParam_7_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"declaredParam",
-        		lv_declaredParam_7_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_8=':' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
-    }
-))?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); 
-	    }
-		lv_switch_9_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"switch",
-        		lv_switch_9_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))	otherlv_10='{' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); 
-	    }
-		lv_cases_11_0=ruleXCasePart		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"cases",
-        		lv_cases_11_0, 
-        		"XCasePart");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*(	otherlv_12='default' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
-    }
-	otherlv_13=':' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); 
-	    }
-		lv_default_14_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"default",
-        		lv_default_14_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?	otherlv_15='}' 
-    {
-    	newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXCasePart
-entryRuleXCasePart returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXCasePartRule()); }
-	 iv_ruleXCasePart=ruleXCasePart 
-	 { $current=$iv_ruleXCasePart.current; } 
-	 EOF 
-;
-
-// Rule XCasePart
-ruleXCasePart returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); 
-	    }
-		lv_typeGuard_1_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXCasePartRule());
-	        }
-       		set(
-       			$current, 
-       			"typeGuard",
-        		lv_typeGuard_1_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(	otherlv_2='case' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); 
-	    }
-		lv_case_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXCasePartRule());
-	        }
-       		set(
-       			$current, 
-       			"case",
-        		lv_case_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?((	otherlv_4=':' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); 
-	    }
-		lv_then_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXCasePartRule());
-	        }
-       		set(
-       			$current, 
-       			"then",
-        		lv_then_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-    |(
-(
-		lv_fallThrough_6_0=	',' 
-    {
-        newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXCasePartRule());
-	        }
-       		setWithLastConsumed($current, "fallThrough", true, ",");
-	    }
-
-)
-)))
-;
-
-
-
-
-
-// Entry rule entryRuleXForLoopExpression
-entryRuleXForLoopExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXForLoopExpressionRule()); }
-	 iv_ruleXForLoopExpression=ruleXForLoopExpression 
-	 { $current=$iv_ruleXForLoopExpression.current; } 
-	 EOF 
-;
-
-// Rule XForLoopExpression
-ruleXForLoopExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((((
-)	'for' 
-	'(' 
-(
-(
-ruleJvmFormalParameter
-)
-)	':' 
-))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
-            $current);
-    }
-)	otherlv_1='for' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); 
-	    }
-		lv_declaredParam_3_0=ruleJvmFormalParameter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"declaredParam",
-        		lv_declaredParam_3_0, 
-        		"JvmFormalParameter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4=':' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); 
-	    }
-		lv_forExpression_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"forExpression",
-        		lv_forExpression_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_6=')' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); 
-	    }
-		lv_eachExpression_7_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"eachExpression",
-        		lv_eachExpression_7_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXBasicForLoopExpression
-entryRuleXBasicForLoopExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); }
-	 iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression 
-	 { $current=$iv_ruleXBasicForLoopExpression.current; } 
-	 EOF 
-;
-
-// Rule XBasicForLoopExpression
-ruleXBasicForLoopExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='for' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); 
-	    }
-		lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"initExpressions",
-        		lv_initExpressions_3_0, 
-        		"XExpressionOrVarDeclaration");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4=',' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); 
-	    }
-		lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"initExpressions",
-        		lv_initExpressions_5_0, 
-        		"XExpressionOrVarDeclaration");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_6=';' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); 
-	    }
-		lv_expression_7_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_7_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?	otherlv_8=';' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); 
-	    }
-		lv_updateExpressions_9_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"updateExpressions",
-        		lv_updateExpressions_9_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_10=',' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); 
-	    }
-		lv_updateExpressions_11_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"updateExpressions",
-        		lv_updateExpressions_11_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)?	otherlv_12=')' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); 
-	    }
-		lv_eachExpression_13_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"eachExpression",
-        		lv_eachExpression_13_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXWhileExpression
-entryRuleXWhileExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXWhileExpressionRule()); }
-	 iv_ruleXWhileExpression=ruleXWhileExpression 
-	 { $current=$iv_ruleXWhileExpression.current; } 
-	 EOF 
-;
-
-// Rule XWhileExpression
-ruleXWhileExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='while' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); 
-	    }
-		lv_predicate_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"predicate",
-        		lv_predicate_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4=')' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); 
-	    }
-		lv_body_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"body",
-        		lv_body_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXDoWhileExpression
-entryRuleXDoWhileExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); }
-	 iv_ruleXDoWhileExpression=ruleXDoWhileExpression 
-	 { $current=$iv_ruleXDoWhileExpression.current; } 
-	 EOF 
-;
-
-// Rule XDoWhileExpression
-ruleXDoWhileExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='do' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); 
-	    }
-		lv_body_2_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"body",
-        		lv_body_2_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_3='while' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
-    }
-	otherlv_4='(' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); 
-	    }
-		lv_predicate_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"predicate",
-        		lv_predicate_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_6=')' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXBlockExpression
-entryRuleXBlockExpression returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXBlockExpressionRule()); }
-	 iv_ruleXBlockExpression=ruleXBlockExpression 
-	 { $current=$iv_ruleXBlockExpression.current; } 
-	 EOF 
-;
-
-// Rule XBlockExpression
-ruleXBlockExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='{' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
-    }
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); 
-	    }
-		lv_expressions_2_0=ruleXExpressionOrVarDeclaration		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"expressions",
-        		lv_expressions_2_0, 
-        		"XExpressionOrVarDeclaration");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_3=';' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
-    }
-)?)*	otherlv_4='}' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXExpressionOrVarDeclaration
-entryRuleXExpressionOrVarDeclaration returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); }
-	 iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration 
-	 { $current=$iv_ruleXExpressionOrVarDeclaration.current; } 
-	 EOF 
-;
-
-// Rule XExpressionOrVarDeclaration
-ruleXExpressionOrVarDeclaration returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); 
-    }
-    this_XVariableDeclaration_0=ruleXVariableDeclaration
-    { 
-        $current = $this_XVariableDeclaration_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); 
-    }
-    this_XExpression_1=ruleXExpression
-    { 
-        $current = $this_XExpression_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXVariableDeclaration
-entryRuleXVariableDeclaration returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXVariableDeclarationRule()); }
-	 iv_ruleXVariableDeclaration=ruleXVariableDeclaration 
-	 { $current=$iv_ruleXVariableDeclaration.current; } 
-	 EOF 
-;
-
-// Rule XVariableDeclaration
-ruleXVariableDeclaration returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
-            $current);
-    }
-)((
-(
-		lv_writeable_1_0=	'var' 
-    {
-        newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXVariableDeclarationRule());
-	        }
-       		setWithLastConsumed($current, "writeable", true, "var");
-	    }
-
-)
-)
-    |	otherlv_2='val' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
-    }
-)(((((
-(
-ruleJvmTypeReference
-)
-)(
-(
-ruleValidID
-)
-)))=>((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); 
-	    }
-		lv_type_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"type",
-        		lv_type_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); 
-	    }
-		lv_name_4_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_4_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); 
-	    }
-		lv_name_5_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_5_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))(	otherlv_6='=' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); 
-	    }
-		lv_right_7_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"right",
-        		lv_right_7_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
-;
-
-
-
-
-
-// Entry rule entryRuleJvmFormalParameter
-entryRuleJvmFormalParameter returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getJvmFormalParameterRule()); }
-	 iv_ruleJvmFormalParameter=ruleJvmFormalParameter 
-	 { $current=$iv_ruleJvmFormalParameter.current; } 
-	 EOF 
-;
-
-// Rule JvmFormalParameter
-ruleJvmFormalParameter returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
-	    }
-		lv_parameterType_0_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
-	        }
-       		set(
-       			$current, 
-       			"parameterType",
-        		lv_parameterType_0_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleFullJvmFormalParameter
-entryRuleFullJvmFormalParameter returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); }
-	 iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter 
-	 { $current=$iv_ruleFullJvmFormalParameter.current; } 
-	 EOF 
-;
-
-// Rule FullJvmFormalParameter
-ruleFullJvmFormalParameter returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
-	    }
-		lv_parameterType_0_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
-	        }
-       		set(
-       			$current, 
-       			"parameterType",
-        		lv_parameterType_0_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
-	    }
-		lv_name_1_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
-	        }
-       		set(
-       			$current, 
-       			"name",
-        		lv_name_1_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXFeatureCall
-entryRuleXFeatureCall returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXFeatureCallRule()); }
-	 iv_ruleXFeatureCall=ruleXFeatureCall 
-	 { $current=$iv_ruleXFeatureCall.current; } 
-	 EOF 
-;
-
-// Rule XFeatureCall
-ruleXFeatureCall returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
-            $current);
-    }
-)(	otherlv_1='<' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
-	    }
-		lv_typeArguments_2_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_2_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_3=',' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
-	    }
-		lv_typeArguments_4_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_4_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_5='>' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
-    }
-)?(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXFeatureCallRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); 
-	    }
-		ruleIdOrSuper		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(((
-(
-	'(' 
- 
-
-)
-)=>
-(
-		lv_explicitOperationCall_7_0=	'(' 
-    {
-        newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXFeatureCallRule());
-	        }
-       		setWithLastConsumed($current, "explicitOperationCall", true, "(");
-	    }
-
-)
-)(((((
-)((
-(
-ruleJvmFormalParameter
-)
-)(	',' 
-(
-(
-ruleJvmFormalParameter
-)
-))*)?(
-(
-	'|' 
- 
-
-)
-)))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); 
-	    }
-		lv_featureCallArguments_8_0=ruleXShortClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"featureCallArguments",
-        		lv_featureCallArguments_8_0, 
-        		"XShortClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); 
-	    }
-		lv_featureCallArguments_9_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"featureCallArguments",
-        		lv_featureCallArguments_9_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_10=',' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); 
-	    }
-		lv_featureCallArguments_11_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"featureCallArguments",
-        		lv_featureCallArguments_11_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*))?	otherlv_12=')' 
-    {
-    	newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
-    }
-)?((((
-)	'[' 
-))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); 
-	    }
-		lv_featureCallArguments_13_0=ruleXClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
-	        }
-       		add(
-       			$current, 
-       			"featureCallArguments",
-        		lv_featureCallArguments_13_0, 
-        		"XClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
-;
-
-
-
-
-
-// Entry rule entryRuleFeatureCallID
-entryRuleFeatureCallID returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getFeatureCallIDRule()); } 
-	 iv_ruleFeatureCallID=ruleFeatureCallID 
-	 { $current=$iv_ruleFeatureCallID.current.getText(); }  
-	 EOF 
-;
-
-// Rule FeatureCallID
-ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); 
-    }
-    this_ValidID_0=ruleValidID    {
-		$current.merge(this_ValidID_0);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-	kw='extends' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); 
-    }
-
-    |
-	kw='static' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); 
-    }
-
-    |
-	kw='import' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); 
-    }
-
-    |
-	kw='extension' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleIdOrSuper
-entryRuleIdOrSuper returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getIdOrSuperRule()); } 
-	 iv_ruleIdOrSuper=ruleIdOrSuper 
-	 { $current=$iv_ruleIdOrSuper.current.getText(); }  
-	 EOF 
-;
-
-// Rule IdOrSuper
-ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); 
-    }
-    this_FeatureCallID_0=ruleFeatureCallID    {
-		$current.merge(this_FeatureCallID_0);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-	kw='super' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); 
-    }
-)
-    ;
-
-
-
-
-
-// Entry rule entryRuleXConstructorCall
-entryRuleXConstructorCall returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXConstructorCallRule()); }
-	 iv_ruleXConstructorCall=ruleXConstructorCall 
-	 { $current=$iv_ruleXConstructorCall.current; } 
-	 EOF 
-;
-
-// Rule XConstructorCall
-ruleXConstructorCall returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
-            $current);
-    }
-)	otherlv_1='new' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
-    }
-(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXConstructorCallRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(((	'<' 
-)=>	otherlv_3='<' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); 
-	    }
-		lv_typeArguments_4_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_4_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_5=',' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); 
-	    }
-		lv_typeArguments_6_0=ruleJvmArgumentTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"typeArguments",
-        		lv_typeArguments_6_0, 
-        		"JvmArgumentTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*	otherlv_7='>' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
-    }
-)?(((
-(
-	'(' 
- 
-
-)
-)=>
-(
-		lv_explicitConstructorCall_8_0=	'(' 
-    {
-        newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXConstructorCallRule());
-	        }
-       		setWithLastConsumed($current, "explicitConstructorCall", true, "(");
-	    }
-
-)
-)(((((
-)((
-(
-ruleJvmFormalParameter
-)
-)(	',' 
-(
-(
-ruleJvmFormalParameter
-)
-))*)?(
-(
-	'|' 
- 
-
-)
-)))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); 
-	    }
-		lv_arguments_9_0=ruleXShortClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"arguments",
-        		lv_arguments_9_0, 
-        		"XShortClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |((
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); 
-	    }
-		lv_arguments_10_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"arguments",
-        		lv_arguments_10_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_11=',' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); 
-	    }
-		lv_arguments_12_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"arguments",
-        		lv_arguments_12_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*))?	otherlv_13=')' 
-    {
-    	newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
-    }
-)?((((
-)	'[' 
-))=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); 
-	    }
-		lv_arguments_14_0=ruleXClosure		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
-	        }
-       		add(
-       			$current, 
-       			"arguments",
-        		lv_arguments_14_0, 
-        		"XClosure");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
-;
-
-
-
-
-
-// Entry rule entryRuleXBooleanLiteral
-entryRuleXBooleanLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXBooleanLiteralRule()); }
-	 iv_ruleXBooleanLiteral=ruleXBooleanLiteral 
-	 { $current=$iv_ruleXBooleanLiteral.current; } 
-	 EOF 
-;
-
-// Rule XBooleanLiteral
-ruleXBooleanLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
-            $current);
-    }
-)(	otherlv_1='false' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
-    }
-
-    |(
-(
-		lv_isTrue_2_0=	'true' 
-    {
-        newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXBooleanLiteralRule());
-	        }
-       		setWithLastConsumed($current, "isTrue", true, "true");
-	    }
-
-)
-)))
-;
-
-
-
-
-
-// Entry rule entryRuleXNullLiteral
-entryRuleXNullLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXNullLiteralRule()); }
-	 iv_ruleXNullLiteral=ruleXNullLiteral 
-	 { $current=$iv_ruleXNullLiteral.current; } 
-	 EOF 
-;
-
-// Rule XNullLiteral
-ruleXNullLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
-            $current);
-    }
-)	otherlv_1='null' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
-    }
-)
-;
-
-
-
-
-
-// Entry rule entryRuleXNumberLiteral
-entryRuleXNumberLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXNumberLiteralRule()); }
-	 iv_ruleXNumberLiteral=ruleXNumberLiteral 
-	 { $current=$iv_ruleXNumberLiteral.current; } 
-	 EOF 
-;
-
-// Rule XNumberLiteral
-ruleXNumberLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
-            $current);
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); 
-	    }
-		lv_value_1_0=ruleNumber		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_1_0, 
-        		"Number");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
-;
-
-
-
-
-
-// Entry rule entryRuleXStringLiteral
-entryRuleXStringLiteral returns [EObject current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getXStringLiteralRule()); }
-	 iv_ruleXStringLiteral=ruleXStringLiteral 
-	 { $current=$iv_ruleXStringLiteral.current; } 
-	 EOF 
-;
-
-// Rule XStringLiteral
-ruleXStringLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
-            $current);
-    }
-)(
-(
-		lv_value_1_0=RULE_STRING
-		{
-			newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); 
+			$current.merge(this_UnsignedNumber_1);
 		}
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXStringLiteralRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"value",
-        		lv_value_1_0, 
-        		"STRING");
-	    }
-
-)
-))
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
+// Entry rule entryRuleUnsignedNumber
+entryRuleUnsignedNumber returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getUnsignedNumberRule()); }
+	iv_ruleUnsignedNumber=ruleUnsignedNumber
+	{ $current=$iv_ruleUnsignedNumber.current.getText(); }
+	EOF;
 
+// Rule UnsignedNumber
+ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		this_INT_0=RULE_INT
+		{
+			$current.merge(this_INT_0);
+		}
+		{
+			newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0());
+		}
+		(
+			kw='.'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0());
+			}
+			this_INT_2=RULE_INT
+			{
+				$current.merge(this_INT_2);
+			}
+			{
+				newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1());
+			}
+		)?
+	)
+;
 
+// Entry rule entryRuleSINT
+entryRuleSINT returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getSINTRule()); }
+	iv_ruleSINT=ruleSINT
+	{ $current=$iv_ruleSINT.current.getText(); }
+	EOF;
 
+// Rule SINT
+ruleSINT returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getSINTAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		this_INT_1=RULE_INT
+		{
+			$current.merge(this_INT_1);
+		}
+		{
+			newLeafNode(this_INT_1, grammarAccess.getSINTAccess().getINTTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXImportDeclaration
+entryRuleXImportDeclaration returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
+	iv_ruleXImportDeclaration=ruleXImportDeclaration
+	{ $current=$iv_ruleXImportDeclaration.current; }
+	EOF;
+
+// Rule XImportDeclaration
+ruleXImportDeclaration returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='import'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
+		}
+		(
+			(
+				(
+					(
+						lv_static_2_0='static'
+						{
+							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+							}
+							setWithLastConsumed($current, "static", true, "static");
+						}
+					)
+				)
+				(
+					(
+						lv_extension_3_0='extension'
+						{
+							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+							}
+							setWithLastConsumed($current, "extension", true, "extension");
+						}
+					)
+				)?
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
+						}
+						ruleQualifiedNameInStaticImport
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						(
+							lv_wildcard_5_0='*'
+							{
+								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+								}
+								setWithLastConsumed($current, "wildcard", true, "*");
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
+							}
+							lv_memberName_6_0=ruleValidID
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+								}
+								set(
+									$current,
+									"memberName",
+									lv_memberName_6_0,
+									"org.eclipse.xtext.xbase.Xtype.ValidID");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			    |
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
+					}
+					ruleQualifiedName
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
+					}
+					lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+						}
+						set(
+							$current,
+							"importedNamespace",
+							lv_importedNamespace_8_0,
+							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					(
+						lv_fqnImport_9_0='ns'
+						{
+							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+							}
+							setWithLastConsumed($current, "fqnImport", true, "ns");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
+						}
+						lv_importedFullyQualifiedName_10_0=ruleQualifiedName
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+							}
+							set(
+								$current,
+								"importedFullyQualifiedName",
+								lv_importedFullyQualifiedName_10_0,
+								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		(
+			otherlv_11=';'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleXAnnotation
+entryRuleXAnnotation returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
+	iv_ruleXAnnotation=ruleXAnnotation
+	{ $current=$iv_ruleXAnnotation.current; }
+	EOF;
+
+// Rule XAnnotation
+ruleXAnnotation returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='@'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXAnnotationRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
+				}
+				ruleQualifiedName
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				('(')=>
+				otherlv_3='('
+				{
+					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
+				}
+			)
+			(
+				(
+					(
+						((
+							(
+								(
+									ruleValidID
+								)
+							)
+							'='
+						)
+						)=>
+						(
+							{
+								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
+							}
+							lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+								}
+								add(
+									$current,
+									"elementValuePairs",
+									lv_elementValuePairs_4_0,
+									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_5=','
+						{
+							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
+						}
+						(
+							((
+								(
+									(
+										ruleValidID
+									)
+								)
+								'='
+							)
+							)=>
+							(
+								{
+									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
+								}
+								lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+									}
+									add(
+										$current,
+										"elementValuePairs",
+										lv_elementValuePairs_6_0,
+										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
+						}
+						lv_value_7_0=ruleXAnnotationElementValueOrCommaList
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+							}
+							set(
+								$current,
+								"value",
+								lv_value_7_0,
+								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleXAnnotationElementValuePair
+entryRuleXAnnotationElementValuePair returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
+	iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair
+	{ $current=$iv_ruleXAnnotationElementValuePair.current; }
+	EOF;
+
+// Rule XAnnotationElementValuePair
+ruleXAnnotationElementValuePair returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			((
+				(
+					(
+						ruleValidID
+					)
+				)
+				'='
+			)
+			)=>
+			(
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
+						}
+						ruleValidID
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_1='='
+				{
+					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
+				}
+				lv_value_2_0=ruleXAnnotationElementValue
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXAnnotationElementValueOrCommaList
+entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
+	iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList
+	{ $current=$iv_ruleXAnnotationElementValueOrCommaList.current; }
+	EOF;
+
+// Rule XAnnotationElementValueOrCommaList
+ruleXAnnotationElementValueOrCommaList returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				((
+					(
+					)
+					'#'
+					'['
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElement(
+								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
+								$current);
+						}
+					)
+					otherlv_1='#'
+					{
+						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
+					}
+					otherlv_2='['
+					{
+						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+						}
+						lv_elements_3_0=ruleXAnnotationOrExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+							}
+							add(
+								$current,
+								"elements",
+								lv_elements_3_0,
+								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4=','
+					{
+						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+							}
+							lv_elements_5_0=ruleXAnnotationOrExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+								}
+								add(
+									$current,
+									"elements",
+									lv_elements_5_0,
+									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)?
+			otherlv_6=']'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
+			}
+		)
+		    |
+		(
+			{
+				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
+			}
+			this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
+			{
+				$current = $this_XAnnotationOrExpression_7.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				(
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
+							$current);
+					}
+				)
+				(
+					otherlv_9=','
+					{
+						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
+							}
+							lv_elements_10_0=ruleXAnnotationOrExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+								}
+								add(
+									$current,
+									"elements",
+									lv_elements_10_0,
+									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)+
+			)?
+		)
+	)
+;
+
+// Entry rule entryRuleXAnnotationElementValue
+entryRuleXAnnotationElementValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
+	iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue
+	{ $current=$iv_ruleXAnnotationElementValue.current; }
+	EOF;
+
+// Rule XAnnotationElementValue
+ruleXAnnotationElementValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				((
+					(
+					)
+					'#'
+					'['
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElement(
+								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
+								$current);
+						}
+					)
+					otherlv_1='#'
+					{
+						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
+					}
+					otherlv_2='['
+					{
+						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+						}
+						lv_elements_3_0=ruleXAnnotationOrExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+							}
+							add(
+								$current,
+								"elements",
+								lv_elements_3_0,
+								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4=','
+					{
+						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+							}
+							lv_elements_5_0=ruleXAnnotationOrExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+								}
+								add(
+									$current,
+									"elements",
+									lv_elements_5_0,
+									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)?
+			otherlv_6=']'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
+			}
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
+		}
+		this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
+		{
+			$current = $this_XAnnotationOrExpression_7.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXAnnotationOrExpression
+entryRuleXAnnotationOrExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
+	iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression
+	{ $current=$iv_ruleXAnnotationOrExpression.current; }
+	EOF;
+
+// Rule XAnnotationOrExpression
+ruleXAnnotationOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
+		}
+		this_XAnnotation_0=ruleXAnnotation
+		{
+			$current = $this_XAnnotation_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
+		}
+		this_XExpression_1=ruleXExpression
+		{
+			$current = $this_XExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXExpression
+entryRuleXExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
+	iv_ruleXExpression=ruleXExpression
+	{ $current=$iv_ruleXExpression.current; }
+	EOF;
+
+// Rule XExpression
+ruleXExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
+	}
+	this_XAssignment_0=ruleXAssignment
+	{
+		$current = $this_XAssignment_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleXAssignment
+entryRuleXAssignment returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
+	iv_ruleXAssignment=ruleXAssignment
+	{ $current=$iv_ruleXAssignment.current; }
+	EOF;
+
+// Rule XAssignment
+ruleXAssignment returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXAssignmentRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+					}
+					ruleFeatureCallID
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			{
+				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
+			}
+			ruleOpSingleAssign
+			{
+				afterParserOrEnumRuleCall();
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
+					}
+					lv_value_3_0=ruleXAssignment
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+						}
+						set(
+							$current,
+							"value",
+							lv_value_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XAssignment");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			{
+				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
+			}
+			this_XOrExpression_4=ruleXOrExpression
+			{
+				$current = $this_XOrExpression_4.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				(
+					((
+						(
+						)
+						(
+							(
+								ruleOpMultiAssign
+							)
+						)
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+									$current);
+							}
+						)
+						(
+							(
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getXAssignmentRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+								}
+								ruleOpMultiAssign
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
+						}
+						lv_rightOperand_7_0=ruleXAssignment
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+							}
+							set(
+								$current,
+								"rightOperand",
+								lv_rightOperand_7_0,
+								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+		)
+	)
+;
+
+// Entry rule entryRuleOpSingleAssign
+entryRuleOpSingleAssign returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); }
+	iv_ruleOpSingleAssign=ruleOpSingleAssign
+	{ $current=$iv_ruleOpSingleAssign.current.getText(); }
+	EOF;
+
+// Rule OpSingleAssign
+ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	kw='='
+	{
+		$current.merge(kw);
+		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
+	}
+;
+
+// Entry rule entryRuleOpMultiAssign
+entryRuleOpMultiAssign returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); }
+	iv_ruleOpMultiAssign=ruleOpMultiAssign
+	{ $current=$iv_ruleOpMultiAssign.current.getText(); }
+	EOF;
+
+// Rule OpMultiAssign
+ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='+='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
+		}
+		    |
+		kw='-='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
+		}
+		    |
+		kw='*='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
+		}
+		    |
+		kw='/='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
+		}
+		    |
+		kw='%='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
+		}
+		    |
+		(
+			kw='<'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
+			}
+			kw='<'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
+			}
+			kw='='
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
+			}
+		)
+		    |
+		(
+			kw='>'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
+			}
+			(
+				kw='>'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
+				}
+			)?
+			kw='>='
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleXOrExpression
+entryRuleXOrExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
+	iv_ruleXOrExpression=ruleXOrExpression
+	{ $current=$iv_ruleXOrExpression.current; }
+	EOF;
+
+// Rule XOrExpression
+ruleXOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
+		}
+		this_XAndExpression_0=ruleXAndExpression
+		{
+			$current = $this_XAndExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpOr
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXOrExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpOr
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXAndExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpOr
+entryRuleOpOr returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpOrRule()); }
+	iv_ruleOpOr=ruleOpOr
+	{ $current=$iv_ruleOpOr.current.getText(); }
+	EOF;
+
+// Rule OpOr
+ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	kw='||'
+	{
+		$current.merge(kw);
+		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
+	}
+;
+
+// Entry rule entryRuleXAndExpression
+entryRuleXAndExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
+	iv_ruleXAndExpression=ruleXAndExpression
+	{ $current=$iv_ruleXAndExpression.current; }
+	EOF;
+
+// Rule XAndExpression
+ruleXAndExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
+		}
+		this_XEqualityExpression_0=ruleXEqualityExpression
+		{
+			$current = $this_XEqualityExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpAnd
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXAndExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpAnd
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXEqualityExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpAnd
+entryRuleOpAnd returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpAndRule()); }
+	iv_ruleOpAnd=ruleOpAnd
+	{ $current=$iv_ruleOpAnd.current.getText(); }
+	EOF;
+
+// Rule OpAnd
+ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	kw='&&'
+	{
+		$current.merge(kw);
+		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
+	}
+;
+
+// Entry rule entryRuleXEqualityExpression
+entryRuleXEqualityExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
+	iv_ruleXEqualityExpression=ruleXEqualityExpression
+	{ $current=$iv_ruleXEqualityExpression.current; }
+	EOF;
+
+// Rule XEqualityExpression
+ruleXEqualityExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
+		}
+		this_XRelationalExpression_0=ruleXRelationalExpression
+		{
+			$current = $this_XRelationalExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpEquality
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXEqualityExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpEquality
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXRelationalExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpEquality
+entryRuleOpEquality returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpEqualityRule()); }
+	iv_ruleOpEquality=ruleOpEquality
+	{ $current=$iv_ruleOpEquality.current.getText(); }
+	EOF;
+
+// Rule OpEquality
+ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='=='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
+		}
+		    |
+		kw='!='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
+		}
+		    |
+		kw='==='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+		}
+		    |
+		kw='!=='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXRelationalExpression
+entryRuleXRelationalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
+	iv_ruleXRelationalExpression=ruleXRelationalExpression
+	{ $current=$iv_ruleXRelationalExpression.current; }
+	EOF;
+
+// Rule XRelationalExpression
+ruleXRelationalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
+		}
+		this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
+		{
+			$current = $this_XOtherOperatorExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				(
+					((
+						(
+						)
+						'instanceof'
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
+									$current);
+							}
+						)
+						otherlv_2='instanceof'
+						{
+							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
+						}
+						lv_type_3_0=ruleJvmTypeReference
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+							}
+							set(
+								$current,
+								"type",
+								lv_type_3_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				(
+					((
+						(
+						)
+						(
+							(
+								ruleOpCompare
+							)
+						)
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+									$current);
+							}
+						)
+						(
+							(
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getXRelationalExpressionRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+								}
+								ruleOpCompare
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
+						}
+						lv_rightOperand_6_0=ruleXOtherOperatorExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+							}
+							set(
+								$current,
+								"rightOperand",
+								lv_rightOperand_6_0,
+								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpCompare
+entryRuleOpCompare returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpCompareRule()); }
+	iv_ruleOpCompare=ruleOpCompare
+	{ $current=$iv_ruleOpCompare.current.getText(); }
+	EOF;
+
+// Rule OpCompare
+ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='>='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
+		}
+		    |
+		(
+			kw='<'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
+			}
+			kw='='
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
+			}
+		)
+		    |
+		kw='>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
+		}
+		    |
+		kw='<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXOtherOperatorExpression
+entryRuleXOtherOperatorExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
+	iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression
+	{ $current=$iv_ruleXOtherOperatorExpression.current; }
+	EOF;
+
+// Rule XOtherOperatorExpression
+ruleXOtherOperatorExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
+		}
+		this_XAdditiveExpression_0=ruleXAdditiveExpression
+		{
+			$current = $this_XAdditiveExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpOther
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpOther
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXAdditiveExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpOther
+entryRuleOpOther returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpOtherRule()); }
+	iv_ruleOpOther=ruleOpOther
+	{ $current=$iv_ruleOpOther.current.getText(); }
+	EOF;
+
+// Rule OpOther
+ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='->'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
+		}
+		    |
+		kw='..<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
+		}
+		    |
+		(
+			kw='>'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
+			}
+			kw='..'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
+			}
+		)
+		    |
+		kw='..'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
+		}
+		    |
+		kw='=>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
+		}
+		    |
+		(
+			kw='>'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
+			}
+			(
+				(
+					((
+						'>'
+						'>'
+					)
+					)=>
+					(
+						kw='>'
+						{
+							$current.merge(kw);
+							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
+						}
+						kw='>'
+						{
+							$current.merge(kw);
+							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
+						}
+					)
+				)
+				    |
+				kw='>'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
+				}
+			)
+		)
+		    |
+		(
+			kw='<'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
+			}
+			(
+				(
+					((
+						'<'
+						'<'
+					)
+					)=>
+					(
+						kw='<'
+						{
+							$current.merge(kw);
+							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
+						}
+						kw='<'
+						{
+							$current.merge(kw);
+							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
+						}
+					)
+				)
+				    |
+				kw='<'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
+				}
+				    |
+				kw='=>'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
+				}
+			)
+		)
+		    |
+		kw='<>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
+		}
+		    |
+		kw='?:'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
+		}
+	)
+;
+
+// Entry rule entryRuleXAdditiveExpression
+entryRuleXAdditiveExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
+	iv_ruleXAdditiveExpression=ruleXAdditiveExpression
+	{ $current=$iv_ruleXAdditiveExpression.current; }
+	EOF;
+
+// Rule XAdditiveExpression
+ruleXAdditiveExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
+		}
+		this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
+		{
+			$current = $this_XMultiplicativeExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpAdd
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpAdd
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXMultiplicativeExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpAdd
+entryRuleOpAdd returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpAddRule()); }
+	iv_ruleOpAdd=ruleOpAdd
+	{ $current=$iv_ruleOpAdd.current.getText(); }
+	EOF;
+
+// Rule OpAdd
+ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='+'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
+		}
+		    |
+		kw='-'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXMultiplicativeExpression
+entryRuleXMultiplicativeExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
+	iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression
+	{ $current=$iv_ruleXMultiplicativeExpression.current; }
+	EOF;
+
+// Rule XMultiplicativeExpression
+ruleXMultiplicativeExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
+		}
+		this_XUnaryOperation_0=ruleXUnaryOperation
+		{
+			$current = $this_XUnaryOperation_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					(
+						(
+							ruleOpMulti
+						)
+					)
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+							}
+							ruleOpMulti
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
+					}
+					lv_rightOperand_3_0=ruleXUnaryOperation
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
+						}
+						set(
+							$current,
+							"rightOperand",
+							lv_rightOperand_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleOpMulti
+entryRuleOpMulti returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpMultiRule()); }
+	iv_ruleOpMulti=ruleOpMulti
+	{ $current=$iv_ruleOpMulti.current.getText(); }
+	EOF;
+
+// Rule OpMulti
+ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='*'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
+		}
+		    |
+		kw='**'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
+		}
+		    |
+		kw='/'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
+		}
+		    |
+		kw='%'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXUnaryOperation
+entryRuleXUnaryOperation returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
+	iv_ruleXUnaryOperation=ruleXUnaryOperation
+	{ $current=$iv_ruleXUnaryOperation.current; }
+	EOF;
+
+// Rule XUnaryOperation
+ruleXUnaryOperation returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXUnaryOperationRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+					}
+					ruleOpUnary
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
+					}
+					lv_operand_2_0=ruleXUnaryOperation
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
+						}
+						set(
+							$current,
+							"operand",
+							lv_operand_2_0,
+							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
+		}
+		this_XCastedExpression_3=ruleXCastedExpression
+		{
+			$current = $this_XCastedExpression_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleOpUnary
+entryRuleOpUnary returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpUnaryRule()); }
+	iv_ruleOpUnary=ruleOpUnary
+	{ $current=$iv_ruleOpUnary.current.getText(); }
+	EOF;
+
+// Rule OpUnary
+ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='!'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
+		}
+		    |
+		kw='-'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
+		}
+		    |
+		kw='+'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleXCastedExpression
+entryRuleXCastedExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
+	iv_ruleXCastedExpression=ruleXCastedExpression
+	{ $current=$iv_ruleXCastedExpression.current; }
+	EOF;
+
+// Rule XCastedExpression
+ruleXCastedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
+		}
+		this_XPostfixOperation_0=ruleXPostfixOperation
+		{
+			$current = $this_XPostfixOperation_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				((
+					(
+					)
+					'as'
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
+								$current);
+						}
+					)
+					otherlv_2='as'
+					{
+						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
+					}
+					lv_type_3_0=ruleJvmTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_3_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleXPostfixOperation
+entryRuleXPostfixOperation returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
+	iv_ruleXPostfixOperation=ruleXPostfixOperation
+	{ $current=$iv_ruleXPostfixOperation.current; }
+	EOF;
+
+// Rule XPostfixOperation
+ruleXPostfixOperation returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
+		}
+		this_XMemberFeatureCall_0=ruleXMemberFeatureCall
+		{
+			$current = $this_XMemberFeatureCall_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			((
+				(
+				)
+				(
+					(
+						ruleOpPostfix
+					)
+				)
+			)
+			)=>
+			(
+				(
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
+							$current);
+					}
+				)
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXPostfixOperationRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
+						}
+						ruleOpPostfix
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleOpPostfix
+entryRuleOpPostfix returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getOpPostfixRule()); }
+	iv_ruleOpPostfix=ruleOpPostfix
+	{ $current=$iv_ruleOpPostfix.current.getText(); }
+	EOF;
+
+// Rule OpPostfix
+ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='++'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
+		}
+		    |
+		kw='--'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXMemberFeatureCall
+entryRuleXMemberFeatureCall returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
+	iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall
+	{ $current=$iv_ruleXMemberFeatureCall.current; }
+	EOF;
+
+// Rule XMemberFeatureCall
+ruleXMemberFeatureCall returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
+		}
+		this_XPrimaryExpression_0=ruleXPrimaryExpression
+		{
+			$current = $this_XPrimaryExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				(
+					((
+						(
+						)
+						(
+							'.'
+							    |
+							(
+								(
+									'::'
+								)
+							)
+						)
+						(
+							(
+								ruleFeatureCallID
+							)
+						)
+						ruleOpSingleAssign
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
+									$current);
+							}
+						)
+						(
+							otherlv_2='.'
+							{
+								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
+							}
+							    |
+							(
+								(
+									lv_explicitStatic_3_0='::'
+									{
+										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+										}
+										setWithLastConsumed($current, "explicitStatic", true, "::");
+									}
+								)
+							)
+						)
+						(
+							(
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
+								}
+								ruleFeatureCallID
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						{
+							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
+						}
+						ruleOpSingleAssign
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
+						}
+						lv_value_6_0=ruleXAssignment
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+							}
+							set(
+								$current,
+								"value",
+								lv_value_6_0,
+								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				(
+					((
+						(
+						)
+						(
+							'.'
+							    |
+							(
+								(
+									'?.'
+								)
+							)
+							    |
+							(
+								(
+									'::'
+								)
+							)
+						)
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
+									$current);
+							}
+						)
+						(
+							otherlv_8='.'
+							{
+								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
+							}
+							    |
+							(
+								(
+									lv_nullSafe_9_0='?.'
+									{
+										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+										}
+										setWithLastConsumed($current, "nullSafe", true, "?.");
+									}
+								)
+							)
+							    |
+							(
+								(
+									lv_explicitStatic_10_0='::'
+									{
+										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+										}
+										setWithLastConsumed($current, "explicitStatic", true, "::");
+									}
+								)
+							)
+						)
+					)
+				)
+				(
+					otherlv_11='<'
+					{
+						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
+							}
+							lv_typeArguments_12_0=ruleJvmArgumentTypeReference
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+								}
+								add(
+									$current,
+									"typeArguments",
+									lv_typeArguments_12_0,
+									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_13=','
+						{
+							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
+								}
+								lv_typeArguments_14_0=ruleJvmArgumentTypeReference
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+									}
+									add(
+										$current,
+										"typeArguments",
+										lv_typeArguments_14_0,
+										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+					otherlv_15='>'
+					{
+						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
+					}
+				)?
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
+						}
+						ruleIdOrSuper
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						((
+							'('
+						)
+						)=>
+						(
+							lv_explicitOperationCall_17_0='('
+							{
+								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+								}
+								setWithLastConsumed($current, "explicitOperationCall", true, "(");
+							}
+						)
+					)
+					(
+						(
+							((
+								(
+								)
+								(
+									(
+										(
+											ruleJvmFormalParameter
+										)
+									)
+									(
+										','
+										(
+											(
+												ruleJvmFormalParameter
+											)
+										)
+									)*
+								)?
+								(
+									(
+										'|'
+									)
+								)
+							)
+							)=>
+							(
+								{
+									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
+								}
+								lv_memberCallArguments_18_0=ruleXShortClosure
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+									}
+									add(
+										$current,
+										"memberCallArguments",
+										lv_memberCallArguments_18_0,
+										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
+									}
+									lv_memberCallArguments_19_0=ruleXExpression
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+										}
+										add(
+											$current,
+											"memberCallArguments",
+											lv_memberCallArguments_19_0,
+											"org.eclipse.xtext.xbase.Xbase.XExpression");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							(
+								otherlv_20=','
+								{
+									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
+										}
+										lv_memberCallArguments_21_0=ruleXExpression
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+											}
+											add(
+												$current,
+												"memberCallArguments",
+												lv_memberCallArguments_21_0,
+												"org.eclipse.xtext.xbase.Xbase.XExpression");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+							)*
+						)
+					)?
+					otherlv_22=')'
+					{
+						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
+					}
+				)?
+				(
+					((
+						(
+						)
+						'['
+					)
+					)=>
+					(
+						{
+							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
+						}
+						lv_memberCallArguments_23_0=ruleXClosure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+							}
+							add(
+								$current,
+								"memberCallArguments",
+								lv_memberCallArguments_23_0,
+								"org.eclipse.xtext.xbase.Xbase.XClosure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)?
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleXPrimaryExpression
+entryRuleXPrimaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
+	iv_ruleXPrimaryExpression=ruleXPrimaryExpression
+	{ $current=$iv_ruleXPrimaryExpression.current; }
+	EOF;
+
+// Rule XPrimaryExpression
+ruleXPrimaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
+		}
+		this_XConstructorCall_0=ruleXConstructorCall
+		{
+			$current = $this_XConstructorCall_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
+		}
+		this_XBlockExpression_1=ruleXBlockExpression
+		{
+			$current = $this_XBlockExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
+		}
+		this_XSwitchExpression_2=ruleXSwitchExpression
+		{
+			$current = $this_XSwitchExpression_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		(
+			((
+				(
+				)
+				'synchronized'
+				'('
+			)
+			)=>
+			{
+				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
+			}
+			this_XSynchronizedExpression_3=ruleXSynchronizedExpression
+			{
+				$current = $this_XSynchronizedExpression_3.current;
+				afterParserOrEnumRuleCall();
+			}
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
+		}
+		this_XFeatureCall_4=ruleXFeatureCall
+		{
+			$current = $this_XFeatureCall_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
+		}
+		this_XLiteral_5=ruleXLiteral
+		{
+			$current = $this_XLiteral_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
+		}
+		this_XIfExpression_6=ruleXIfExpression
+		{
+			$current = $this_XIfExpression_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		(
+			((
+				(
+				)
+				'for'
+				'('
+				(
+					(
+						ruleJvmFormalParameter
+					)
+				)
+				':'
+			)
+			)=>
+			{
+				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
+			}
+			this_XForLoopExpression_7=ruleXForLoopExpression
+			{
+				$current = $this_XForLoopExpression_7.current;
+				afterParserOrEnumRuleCall();
+			}
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
+		}
+		this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
+		{
+			$current = $this_XBasicForLoopExpression_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
+		}
+		this_XWhileExpression_9=ruleXWhileExpression
+		{
+			$current = $this_XWhileExpression_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
+		}
+		this_XDoWhileExpression_10=ruleXDoWhileExpression
+		{
+			$current = $this_XDoWhileExpression_10.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
+		}
+		this_XThrowExpression_11=ruleXThrowExpression
+		{
+			$current = $this_XThrowExpression_11.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
+		}
+		this_XReturnExpression_12=ruleXReturnExpression
+		{
+			$current = $this_XReturnExpression_12.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
+		}
+		this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
+		{
+			$current = $this_XTryCatchFinallyExpression_13.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
+		}
+		this_XParenthesizedExpression_14=ruleXParenthesizedExpression
+		{
+			$current = $this_XParenthesizedExpression_14.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXLiteral
+entryRuleXLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
+	iv_ruleXLiteral=ruleXLiteral
+	{ $current=$iv_ruleXLiteral.current; }
+	EOF;
+
+// Rule XLiteral
+ruleXLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
+		}
+		this_XCollectionLiteral_0=ruleXCollectionLiteral
+		{
+			$current = $this_XCollectionLiteral_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		(
+			((
+				(
+				)
+				'['
+			)
+			)=>
+			{
+				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
+			}
+			this_XClosure_1=ruleXClosure
+			{
+				$current = $this_XClosure_1.current;
+				afterParserOrEnumRuleCall();
+			}
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
+		}
+		this_XBooleanLiteral_2=ruleXBooleanLiteral
+		{
+			$current = $this_XBooleanLiteral_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
+		}
+		this_XNumberLiteral_3=ruleXNumberLiteral
+		{
+			$current = $this_XNumberLiteral_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
+		}
+		this_XNullLiteral_4=ruleXNullLiteral
+		{
+			$current = $this_XNullLiteral_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
+		}
+		this_XStringLiteral_5=ruleXStringLiteral
+		{
+			$current = $this_XStringLiteral_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
+		}
+		this_XTypeLiteral_6=ruleXTypeLiteral
+		{
+			$current = $this_XTypeLiteral_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXCollectionLiteral
+entryRuleXCollectionLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
+	iv_ruleXCollectionLiteral=ruleXCollectionLiteral
+	{ $current=$iv_ruleXCollectionLiteral.current; }
+	EOF;
+
+// Rule XCollectionLiteral
+ruleXCollectionLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
+		}
+		this_XSetLiteral_0=ruleXSetLiteral
+		{
+			$current = $this_XSetLiteral_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
+		}
+		this_XListLiteral_1=ruleXListLiteral
+		{
+			$current = $this_XListLiteral_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXSetLiteral
+entryRuleXSetLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
+	iv_ruleXSetLiteral=ruleXSetLiteral
+	{ $current=$iv_ruleXSetLiteral.current; }
+	EOF;
+
+// Rule XSetLiteral
+ruleXSetLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='#'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+					}
+					lv_elements_3_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+						}
+						add(
+							$current,
+							"elements",
+							lv_elements_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+						}
+						lv_elements_5_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+							}
+							add(
+								$current,
+								"elements",
+								lv_elements_5_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleXListLiteral
+entryRuleXListLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
+	iv_ruleXListLiteral=ruleXListLiteral
+	{ $current=$iv_ruleXListLiteral.current; }
+	EOF;
+
+// Rule XListLiteral
+ruleXListLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='#'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
+		}
+		otherlv_2='['
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+					}
+					lv_elements_3_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+						}
+						add(
+							$current,
+							"elements",
+							lv_elements_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+						}
+						lv_elements_5_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+							}
+							add(
+								$current,
+								"elements",
+								lv_elements_5_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_6=']'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleXClosure
+entryRuleXClosure returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXClosureRule()); }
+	iv_ruleXClosure=ruleXClosure
+	{ $current=$iv_ruleXClosure.current; }
+	EOF;
+
+// Rule XClosure
+ruleXClosure returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			((
+				(
+				)
+				'['
+			)
+			)=>
+			(
+				(
+					{
+						$current = forceCreateModelElement(
+							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
+							$current);
+					}
+				)
+				otherlv_1='['
+				{
+					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
+				}
+			)
+		)
+		(
+			((
+				(
+					(
+						(
+							ruleJvmFormalParameter
+						)
+					)
+					(
+						','
+						(
+							(
+								ruleJvmFormalParameter
+							)
+						)
+					)*
+				)?
+				(
+					(
+						'|'
+					)
+				)
+			)
+			)=>
+			(
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
+							}
+							lv_declaredFormalParameters_2_0=ruleJvmFormalParameter
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXClosureRule());
+								}
+								add(
+									$current,
+									"declaredFormalParameters",
+									lv_declaredFormalParameters_2_0,
+									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_3=','
+						{
+							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
+								}
+								lv_declaredFormalParameters_4_0=ruleJvmFormalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXClosureRule());
+									}
+									add(
+										$current,
+										"declaredFormalParameters",
+										lv_declaredFormalParameters_4_0,
+										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)?
+				(
+					(
+						lv_explicitSyntax_5_0='|'
+						{
+							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXClosureRule());
+							}
+							setWithLastConsumed($current, "explicitSyntax", true, "|");
+						}
+					)
+				)
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
+				}
+				lv_expression_6_0=ruleXExpressionInClosure
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXClosureRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_6_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_7=']'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXExpressionInClosure
+entryRuleXExpressionInClosure returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
+	iv_ruleXExpressionInClosure=ruleXExpressionInClosure
+	{ $current=$iv_ruleXExpressionInClosure.current; }
+	EOF;
+
+// Rule XExpressionInClosure
+ruleXExpressionInClosure returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
+					}
+					lv_expressions_1_0=ruleXExpressionOrVarDeclaration
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
+						}
+						add(
+							$current,
+							"expressions",
+							lv_expressions_1_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_2=';'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+				}
+			)?
+		)*
+	)
+;
+
+// Entry rule entryRuleXShortClosure
+entryRuleXShortClosure returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
+	iv_ruleXShortClosure=ruleXShortClosure
+	{ $current=$iv_ruleXShortClosure.current; }
+	EOF;
+
+// Rule XShortClosure
+ruleXShortClosure returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			((
+				(
+				)
+				(
+					(
+						(
+							ruleJvmFormalParameter
+						)
+					)
+					(
+						','
+						(
+							(
+								ruleJvmFormalParameter
+							)
+						)
+					)*
+				)?
+				(
+					(
+						'|'
+					)
+				)
+			)
+			)=>
+			(
+				(
+					{
+						$current = forceCreateModelElement(
+							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
+							$current);
+					}
+				)
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
+							}
+							lv_declaredFormalParameters_1_0=ruleJvmFormalParameter
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+								}
+								add(
+									$current,
+									"declaredFormalParameters",
+									lv_declaredFormalParameters_1_0,
+									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_2=','
+						{
+							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
+								}
+								lv_declaredFormalParameters_3_0=ruleJvmFormalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+									}
+									add(
+										$current,
+										"declaredFormalParameters",
+										lv_declaredFormalParameters_3_0,
+										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)?
+				(
+					(
+						lv_explicitSyntax_4_0='|'
+						{
+							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXShortClosureRule());
+							}
+							setWithLastConsumed($current, "explicitSyntax", true, "|");
+						}
+					)
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
+				}
+				lv_expression_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXParenthesizedExpression
+entryRuleXParenthesizedExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
+	iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression
+	{ $current=$iv_ruleXParenthesizedExpression.current; }
+	EOF;
+
+// Rule XParenthesizedExpression
+ruleXParenthesizedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='('
+		{
+			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
+		}
+		{
+			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
+		}
+		this_XExpression_1=ruleXExpression
+		{
+			$current = $this_XExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		otherlv_2=')'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleXIfExpression
+entryRuleXIfExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXIfExpressionRule()); }
+	iv_ruleXIfExpression=ruleXIfExpression
+	{ $current=$iv_ruleXIfExpression.current; }
+	EOF;
+
+// Rule XIfExpression
+ruleXIfExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='if'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
+		}
+		otherlv_2='('
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
+				}
+				lv_if_3_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+					}
+					set(
+						$current,
+						"if",
+						lv_if_3_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4=')'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
+				}
+				lv_then_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+					}
+					set(
+						$current,
+						"then",
+						lv_then_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				('else')=>
+				otherlv_6='else'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
+					}
+					lv_else_7_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+						}
+						set(
+							$current,
+							"else",
+							lv_else_7_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleXSwitchExpression
+entryRuleXSwitchExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXSwitchExpressionRule()); }
+	iv_ruleXSwitchExpression=ruleXSwitchExpression
+	{ $current=$iv_ruleXSwitchExpression.current; }
+	EOF;
+
+// Rule XSwitchExpression
+ruleXSwitchExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='switch'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
+		}
+		(
+			(
+				(
+					((
+						'('
+						(
+							(
+								ruleJvmFormalParameter
+							)
+						)
+						':'
+					)
+					)=>
+					(
+						otherlv_2='('
+						{
+							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
+								}
+								lv_declaredParam_3_0=ruleJvmFormalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+									}
+									set(
+										$current,
+										"declaredParam",
+										lv_declaredParam_3_0,
+										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						otherlv_4=':'
+						{
+							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
+						}
+						lv_switch_5_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+							}
+							set(
+								$current,
+								"switch",
+								lv_switch_5_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_6=')'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
+				}
+			)
+			    |
+			(
+				(
+					((
+						(
+							(
+								ruleJvmFormalParameter
+							)
+						)
+						':'
+					)
+					)=>
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
+								}
+								lv_declaredParam_7_0=ruleJvmFormalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+									}
+									set(
+										$current,
+										"declaredParam",
+										lv_declaredParam_7_0,
+										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						otherlv_8=':'
+						{
+							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
+						}
+					)
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
+						}
+						lv_switch_9_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+							}
+							set(
+								$current,
+								"switch",
+								lv_switch_9_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		otherlv_10='{'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
+				}
+				lv_cases_11_0=ruleXCasePart
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+					}
+					add(
+						$current,
+						"cases",
+						lv_cases_11_0,
+						"org.eclipse.xtext.xbase.Xbase.XCasePart");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			otherlv_12='default'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
+			}
+			otherlv_13=':'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
+					}
+					lv_default_14_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+						}
+						set(
+							$current,
+							"default",
+							lv_default_14_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		otherlv_15='}'
+		{
+			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleXCasePart
+entryRuleXCasePart returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXCasePartRule()); }
+	iv_ruleXCasePart=ruleXCasePart
+	{ $current=$iv_ruleXCasePart.current; }
+	EOF;
+
+// Rule XCasePart
+ruleXCasePart returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_typeGuard_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXCasePartRule());
+					}
+					set(
+						$current,
+						"typeGuard",
+						lv_typeGuard_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='case'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
+					}
+					lv_case_3_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXCasePartRule());
+						}
+						set(
+							$current,
+							"case",
+							lv_case_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				otherlv_4=':'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
+						}
+						lv_then_5_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXCasePartRule());
+							}
+							set(
+								$current,
+								"then",
+								lv_then_5_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				(
+					lv_fallThrough_6_0=','
+					{
+						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXCasePartRule());
+						}
+						setWithLastConsumed($current, "fallThrough", true, ",");
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXForLoopExpression
+entryRuleXForLoopExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXForLoopExpressionRule()); }
+	iv_ruleXForLoopExpression=ruleXForLoopExpression
+	{ $current=$iv_ruleXForLoopExpression.current; }
+	EOF;
+
+// Rule XForLoopExpression
+ruleXForLoopExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			((
+				(
+				)
+				'for'
+				'('
+				(
+					(
+						ruleJvmFormalParameter
+					)
+				)
+				':'
+			)
+			)=>
+			(
+				(
+					{
+						$current = forceCreateModelElement(
+							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
+							$current);
+					}
+				)
+				otherlv_1='for'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
+				}
+				otherlv_2='('
+				{
+					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
+						}
+						lv_declaredParam_3_0=ruleJvmFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+							}
+							set(
+								$current,
+								"declaredParam",
+								lv_declaredParam_3_0,
+								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_4=':'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
+				}
+				lv_forExpression_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+					}
+					set(
+						$current,
+						"forExpression",
+						lv_forExpression_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6=')'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
+				}
+				lv_eachExpression_7_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+					}
+					set(
+						$current,
+						"eachExpression",
+						lv_eachExpression_7_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXBasicForLoopExpression
+entryRuleXBasicForLoopExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); }
+	iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression
+	{ $current=$iv_ruleXBasicForLoopExpression.current; }
+	EOF;
+
+// Rule XBasicForLoopExpression
+ruleXBasicForLoopExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='for'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
+		}
+		otherlv_2='('
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
+					}
+					lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+						}
+						add(
+							$current,
+							"initExpressions",
+							lv_initExpressions_3_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
+						}
+						lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+							}
+							add(
+								$current,
+								"initExpressions",
+								lv_initExpressions_5_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_6=';'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
+				}
+				lv_expression_7_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_7_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_8=';'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
+					}
+					lv_updateExpressions_9_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+						}
+						add(
+							$current,
+							"updateExpressions",
+							lv_updateExpressions_9_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_10=','
+				{
+					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
+						}
+						lv_updateExpressions_11_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+							}
+							add(
+								$current,
+								"updateExpressions",
+								lv_updateExpressions_11_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_12=')'
+		{
+			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
+				}
+				lv_eachExpression_13_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+					}
+					set(
+						$current,
+						"eachExpression",
+						lv_eachExpression_13_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXWhileExpression
+entryRuleXWhileExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXWhileExpressionRule()); }
+	iv_ruleXWhileExpression=ruleXWhileExpression
+	{ $current=$iv_ruleXWhileExpression.current; }
+	EOF;
+
+// Rule XWhileExpression
+ruleXWhileExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='while'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
+		}
+		otherlv_2='('
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
+				}
+				lv_predicate_3_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
+					}
+					set(
+						$current,
+						"predicate",
+						lv_predicate_3_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4=')'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
+				}
+				lv_body_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
+					}
+					set(
+						$current,
+						"body",
+						lv_body_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXDoWhileExpression
+entryRuleXDoWhileExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); }
+	iv_ruleXDoWhileExpression=ruleXDoWhileExpression
+	{ $current=$iv_ruleXDoWhileExpression.current; }
+	EOF;
+
+// Rule XDoWhileExpression
+ruleXDoWhileExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='do'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
+				}
+				lv_body_2_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
+					}
+					set(
+						$current,
+						"body",
+						lv_body_2_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='while'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
+		}
+		otherlv_4='('
+		{
+			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
+				}
+				lv_predicate_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
+					}
+					set(
+						$current,
+						"predicate",
+						lv_predicate_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6=')'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleXBlockExpression
+entryRuleXBlockExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXBlockExpressionRule()); }
+	iv_ruleXBlockExpression=ruleXBlockExpression
+	{ $current=$iv_ruleXBlockExpression.current; }
+	EOF;
+
+// Rule XBlockExpression
+ruleXBlockExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='{'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
+					}
+					lv_expressions_2_0=ruleXExpressionOrVarDeclaration
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
+						}
+						add(
+							$current,
+							"expressions",
+							lv_expressions_2_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_3=';'
+				{
+					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
+				}
+			)?
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXExpressionOrVarDeclaration
+entryRuleXExpressionOrVarDeclaration returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); }
+	iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration
+	{ $current=$iv_ruleXExpressionOrVarDeclaration.current; }
+	EOF;
+
+// Rule XExpressionOrVarDeclaration
+ruleXExpressionOrVarDeclaration returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
+		}
+		this_XVariableDeclaration_0=ruleXVariableDeclaration
+		{
+			$current = $this_XVariableDeclaration_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
+		}
+		this_XExpression_1=ruleXExpression
+		{
+			$current = $this_XExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXVariableDeclaration
+entryRuleXVariableDeclaration returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXVariableDeclarationRule()); }
+	iv_ruleXVariableDeclaration=ruleXVariableDeclaration
+	{ $current=$iv_ruleXVariableDeclaration.current; }
+	EOF;
+
+// Rule XVariableDeclaration
+ruleXVariableDeclaration returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_writeable_1_0='var'
+					{
+						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXVariableDeclarationRule());
+						}
+						setWithLastConsumed($current, "writeable", true, "var");
+					}
+				)
+			)
+			    |
+			otherlv_2='val'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
+			}
+		)
+		(
+			(
+				((
+					(
+						(
+							ruleJvmTypeReference
+						)
+					)
+					(
+						(
+							ruleValidID
+						)
+					)
+				)
+				)=>
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
+							}
+							lv_type_3_0=ruleJvmTypeReference
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+								}
+								set(
+									$current,
+									"type",
+									lv_type_3_0,
+									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
+							}
+							lv_name_4_0=ruleValidID
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+								}
+								set(
+									$current,
+									"name",
+									lv_name_4_0,
+									"org.eclipse.xtext.xbase.Xtype.ValidID");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
+					}
+					lv_name_5_0=ruleValidID
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_5_0,
+							"org.eclipse.xtext.xbase.Xtype.ValidID");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		(
+			otherlv_6='='
+			{
+				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
+					}
+					lv_right_7_0=ruleXExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+						}
+						set(
+							$current,
+							"right",
+							lv_right_7_0,
+							"org.eclipse.xtext.xbase.Xbase.XExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleJvmFormalParameter
+entryRuleJvmFormalParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmFormalParameterRule()); }
+	iv_ruleJvmFormalParameter=ruleJvmFormalParameter
+	{ $current=$iv_ruleJvmFormalParameter.current; }
+	EOF;
+
+// Rule JvmFormalParameter
+ruleJvmFormalParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+				}
+				lv_parameterType_0_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
+					}
+					set(
+						$current,
+						"parameterType",
+						lv_parameterType_0_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleValidID
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ValidID");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleFullJvmFormalParameter
+entryRuleFullJvmFormalParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); }
+	iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter
+	{ $current=$iv_ruleFullJvmFormalParameter.current; }
+	EOF;
+
+// Rule FullJvmFormalParameter
+ruleFullJvmFormalParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+				}
+				lv_parameterType_0_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
+					}
+					set(
+						$current,
+						"parameterType",
+						lv_parameterType_0_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleValidID
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.xtext.xbase.Xtype.ValidID");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXFeatureCall
+entryRuleXFeatureCall returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXFeatureCallRule()); }
+	iv_ruleXFeatureCall=ruleXFeatureCall
+	{ $current=$iv_ruleXFeatureCall.current; }
+	EOF;
+
+// Rule XFeatureCall
+ruleXFeatureCall returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='<'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+					}
+					lv_typeArguments_2_0=ruleJvmArgumentTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+						}
+						add(
+							$current,
+							"typeArguments",
+							lv_typeArguments_2_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_3=','
+				{
+					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+						}
+						lv_typeArguments_4_0=ruleJvmArgumentTypeReference
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+							}
+							add(
+								$current,
+								"typeArguments",
+								lv_typeArguments_4_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_5='>'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
+			}
+		)?
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXFeatureCallRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
+				}
+				ruleIdOrSuper
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				((
+					'('
+				)
+				)=>
+				(
+					lv_explicitOperationCall_7_0='('
+					{
+						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXFeatureCallRule());
+						}
+						setWithLastConsumed($current, "explicitOperationCall", true, "(");
+					}
+				)
+			)
+			(
+				(
+					((
+						(
+						)
+						(
+							(
+								(
+									ruleJvmFormalParameter
+								)
+							)
+							(
+								','
+								(
+									(
+										ruleJvmFormalParameter
+									)
+								)
+							)*
+						)?
+						(
+							(
+								'|'
+							)
+						)
+					)
+					)=>
+					(
+						{
+							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
+						}
+						lv_featureCallArguments_8_0=ruleXShortClosure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+							}
+							add(
+								$current,
+								"featureCallArguments",
+								lv_featureCallArguments_8_0,
+								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
+							}
+							lv_featureCallArguments_9_0=ruleXExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+								}
+								add(
+									$current,
+									"featureCallArguments",
+									lv_featureCallArguments_9_0,
+									"org.eclipse.xtext.xbase.Xbase.XExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_10=','
+						{
+							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
+								}
+								lv_featureCallArguments_11_0=ruleXExpression
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+									}
+									add(
+										$current,
+										"featureCallArguments",
+										lv_featureCallArguments_11_0,
+										"org.eclipse.xtext.xbase.Xbase.XExpression");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)
+			)?
+			otherlv_12=')'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
+			}
+		)?
+		(
+			((
+				(
+				)
+				'['
+			)
+			)=>
+			(
+				{
+					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
+				}
+				lv_featureCallArguments_13_0=ruleXClosure
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+					}
+					add(
+						$current,
+						"featureCallArguments",
+						lv_featureCallArguments_13_0,
+						"org.eclipse.xtext.xbase.Xbase.XClosure");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleFeatureCallID
+entryRuleFeatureCallID returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getFeatureCallIDRule()); }
+	iv_ruleFeatureCallID=ruleFeatureCallID
+	{ $current=$iv_ruleFeatureCallID.current.getText(); }
+	EOF;
+
+// Rule FeatureCallID
+ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
+		}
+		this_ValidID_0=ruleValidID
+		{
+			$current.merge(this_ValidID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		kw='extends'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
+		}
+		    |
+		kw='static'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
+		}
+		    |
+		kw='import'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
+		}
+		    |
+		kw='extension'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleIdOrSuper
+entryRuleIdOrSuper returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getIdOrSuperRule()); }
+	iv_ruleIdOrSuper=ruleIdOrSuper
+	{ $current=$iv_ruleIdOrSuper.current.getText(); }
+	EOF;
+
+// Rule IdOrSuper
+ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
+		}
+		this_FeatureCallID_0=ruleFeatureCallID
+		{
+			$current.merge(this_FeatureCallID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		kw='super'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXConstructorCall
+entryRuleXConstructorCall returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXConstructorCallRule()); }
+	iv_ruleXConstructorCall=ruleXConstructorCall
+	{ $current=$iv_ruleXConstructorCall.current; }
+	EOF;
+
+// Rule XConstructorCall
+ruleXConstructorCall returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='new'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXConstructorCallRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
+				}
+				ruleQualifiedName
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				('<')=>
+				otherlv_3='<'
+				{
+					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
+					}
+					lv_typeArguments_4_0=ruleJvmArgumentTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+						}
+						add(
+							$current,
+							"typeArguments",
+							lv_typeArguments_4_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_5=','
+				{
+					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
+						}
+						lv_typeArguments_6_0=ruleJvmArgumentTypeReference
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+							}
+							add(
+								$current,
+								"typeArguments",
+								lv_typeArguments_6_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_7='>'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
+			}
+		)?
+		(
+			(
+				((
+					'('
+				)
+				)=>
+				(
+					lv_explicitConstructorCall_8_0='('
+					{
+						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXConstructorCallRule());
+						}
+						setWithLastConsumed($current, "explicitConstructorCall", true, "(");
+					}
+				)
+			)
+			(
+				(
+					((
+						(
+						)
+						(
+							(
+								(
+									ruleJvmFormalParameter
+								)
+							)
+							(
+								','
+								(
+									(
+										ruleJvmFormalParameter
+									)
+								)
+							)*
+						)?
+						(
+							(
+								'|'
+							)
+						)
+					)
+					)=>
+					(
+						{
+							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
+						}
+						lv_arguments_9_0=ruleXShortClosure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+							}
+							add(
+								$current,
+								"arguments",
+								lv_arguments_9_0,
+								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
+							}
+							lv_arguments_10_0=ruleXExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+								}
+								add(
+									$current,
+									"arguments",
+									lv_arguments_10_0,
+									"org.eclipse.xtext.xbase.Xbase.XExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_11=','
+						{
+							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
+								}
+								lv_arguments_12_0=ruleXExpression
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+									}
+									add(
+										$current,
+										"arguments",
+										lv_arguments_12_0,
+										"org.eclipse.xtext.xbase.Xbase.XExpression");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)
+			)?
+			otherlv_13=')'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
+			}
+		)?
+		(
+			((
+				(
+				)
+				'['
+			)
+			)=>
+			(
+				{
+					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
+				}
+				lv_arguments_14_0=ruleXClosure
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+					}
+					add(
+						$current,
+						"arguments",
+						lv_arguments_14_0,
+						"org.eclipse.xtext.xbase.Xbase.XClosure");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleXBooleanLiteral
+entryRuleXBooleanLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXBooleanLiteralRule()); }
+	iv_ruleXBooleanLiteral=ruleXBooleanLiteral
+	{ $current=$iv_ruleXBooleanLiteral.current; }
+	EOF;
+
+// Rule XBooleanLiteral
+ruleXBooleanLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='false'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
+			}
+			    |
+			(
+				(
+					lv_isTrue_2_0='true'
+					{
+						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXBooleanLiteralRule());
+						}
+						setWithLastConsumed($current, "isTrue", true, "true");
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXNullLiteral
+entryRuleXNullLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXNullLiteralRule()); }
+	iv_ruleXNullLiteral=ruleXNullLiteral
+	{ $current=$iv_ruleXNullLiteral.current; }
+	EOF;
+
+// Rule XNullLiteral
+ruleXNullLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='null'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXNumberLiteral
+entryRuleXNumberLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXNumberLiteralRule()); }
+	iv_ruleXNumberLiteral=ruleXNumberLiteral
+	{ $current=$iv_ruleXNumberLiteral.current; }
+	EOF;
+
+// Rule XNumberLiteral
+ruleXNumberLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleNumber
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.xtext.xbase.Xbase.Number");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXStringLiteral
+entryRuleXStringLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXStringLiteralRule()); }
+	iv_ruleXStringLiteral=ruleXStringLiteral
+	{ $current=$iv_ruleXStringLiteral.current; }
+	EOF;
+
+// Rule XStringLiteral
+ruleXStringLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_value_1_0=RULE_STRING
+				{
+					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXStringLiteralRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
+;
 
 // Entry rule entryRuleXTypeLiteral
-entryRuleXTypeLiteral returns [EObject current=null] 
-	:
+entryRuleXTypeLiteral returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXTypeLiteralRule()); }
-	 iv_ruleXTypeLiteral=ruleXTypeLiteral 
-	 { $current=$iv_ruleXTypeLiteral.current; } 
-	 EOF 
-;
+	iv_ruleXTypeLiteral=ruleXTypeLiteral
+	{ $current=$iv_ruleXTypeLiteral.current; }
+	EOF;
 
 // Rule XTypeLiteral
-ruleXTypeLiteral returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
-            $current);
-    }
-)	otherlv_1='typeof' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
-    }
-(
-(
+ruleXTypeLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='typeof'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXTypeLiteralRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); 
-	    }
-		lv_arrayDimensions_4_0=ruleArrayBrackets		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
-	        }
-       		add(
-       			$current, 
-       			"arrayDimensions",
-        		lv_arrayDimensions_4_0, 
-        		"ArrayBrackets");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_5=')' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
-    }
-)
+			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
+		}
+		otherlv_2='('
+		{
+			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXTypeLiteralRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
+				}
+				ruleQualifiedName
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
+				}
+				lv_arrayDimensions_4_0=ruleArrayBrackets
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
+					}
+					add(
+						$current,
+						"arrayDimensions",
+						lv_arrayDimensions_4_0,
+						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXThrowExpression
-entryRuleXThrowExpression returns [EObject current=null] 
-	:
+entryRuleXThrowExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXThrowExpressionRule()); }
-	 iv_ruleXThrowExpression=ruleXThrowExpression 
-	 { $current=$iv_ruleXThrowExpression.current; } 
-	 EOF 
-;
+	iv_ruleXThrowExpression=ruleXThrowExpression
+	{ $current=$iv_ruleXThrowExpression.current; }
+	EOF;
 
 // Rule XThrowExpression
-ruleXThrowExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='throw' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
-	    }
-		lv_expression_2_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_2_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleXThrowExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='throw'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+				}
+				lv_expression_2_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_2_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXReturnExpression
-entryRuleXReturnExpression returns [EObject current=null] 
-	:
+entryRuleXReturnExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXReturnExpressionRule()); }
-	 iv_ruleXReturnExpression=ruleXReturnExpression 
-	 { $current=$iv_ruleXReturnExpression.current; } 
-	 EOF 
-;
+	iv_ruleXReturnExpression=ruleXReturnExpression
+	{ $current=$iv_ruleXReturnExpression.current; }
+	EOF;
 
 // Rule XReturnExpression
-ruleXReturnExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='return' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
-    }
-((	'extends' 
- | 	'static' 
- | 	'import' 
- | 	'extension' 
- | 	'!' 
- | 	'-' 
- | 	'+' 
- | 	'new' 
- | 	'{' 
- | 	'switch' 
- | 	'synchronized' 
- | 	'<' 
- | 	'super' 
- | 	'#' 
- | 	'[' 
- | 	'false' 
- | 	'true' 
- | 	'null' 
- | 	'typeof' 
- | 	'if' 
- | 	'for' 
- | 	'while' 
- | 	'do' 
- | 	'throw' 
- | 	'return' 
- | 	'try' 
- | 	'(' 
- | 	RULE_ID | 	RULE_HEX | 	RULE_INT | 	RULE_DECIMAL | 	RULE_STRING)=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
-	    }
-		lv_expression_2_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_2_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+ruleXReturnExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='return'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
+		}
+		(
+			('extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING)=>
+			(
+				{
+					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+				}
+				lv_expression_2_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_2_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXTryCatchFinallyExpression
-entryRuleXTryCatchFinallyExpression returns [EObject current=null] 
-	:
+entryRuleXTryCatchFinallyExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); }
-	 iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression 
-	 { $current=$iv_ruleXTryCatchFinallyExpression.current; } 
-	 EOF 
-;
+	iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression
+	{ $current=$iv_ruleXTryCatchFinallyExpression.current; }
+	EOF;
 
 // Rule XTryCatchFinallyExpression
-ruleXTryCatchFinallyExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
-            $current);
-    }
-)	otherlv_1='try' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
-	    }
-		lv_expression_2_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_2_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)((((	'catch' 
-)=>
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); 
-	    }
-		lv_catchClauses_3_0=ruleXCatchClause		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
-	        }
-       		add(
-       			$current, 
-       			"catchClauses",
-        		lv_catchClauses_3_0, 
-        		"XCatchClause");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)+(((	'finally' 
-)=>	otherlv_4='finally' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
-    }
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); 
-	    }
-		lv_finallyExpression_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"finallyExpression",
-        		lv_finallyExpression_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))?)
-    |(	otherlv_6='finally' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); 
-	    }
-		lv_finallyExpression_7_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"finallyExpression",
-        		lv_finallyExpression_7_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))))
+ruleXTryCatchFinallyExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='try'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+				}
+				lv_expression_2_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_2_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					('catch')=>
+					(
+						{
+							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
+						}
+						lv_catchClauses_3_0=ruleXCatchClause
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+							}
+							add(
+								$current,
+								"catchClauses",
+								lv_catchClauses_3_0,
+								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)+
+				(
+					(
+						('finally')=>
+						otherlv_4='finally'
+						{
+							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
+							}
+							lv_finallyExpression_5_0=ruleXExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+								}
+								set(
+									$current,
+									"finallyExpression",
+									lv_finallyExpression_5_0,
+									"org.eclipse.xtext.xbase.Xbase.XExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)?
+			)
+			    |
+			(
+				otherlv_6='finally'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
+						}
+						lv_finallyExpression_7_0=ruleXExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+							}
+							set(
+								$current,
+								"finallyExpression",
+								lv_finallyExpression_7_0,
+								"org.eclipse.xtext.xbase.Xbase.XExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleXSynchronizedExpression
-entryRuleXSynchronizedExpression returns [EObject current=null] 
-	:
+entryRuleXSynchronizedExpression returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); }
-	 iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression 
-	 { $current=$iv_ruleXSynchronizedExpression.current; } 
-	 EOF 
-;
+	iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression
+	{ $current=$iv_ruleXSynchronizedExpression.current; }
+	EOF;
 
 // Rule XSynchronizedExpression
-ruleXSynchronizedExpression returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(((((
-)	'synchronized' 
-	'(' 
-))=>((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
-            $current);
-    }
-)	otherlv_1='synchronized' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
-    }
-	otherlv_2='(' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
-    }
-))(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); 
-	    }
-		lv_param_3_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"param",
-        		lv_param_3_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
+ruleXSynchronizedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			((
+				(
+				)
+				'synchronized'
+				'('
+			)
+			)=>
+			(
+				(
+					{
+						$current = forceCreateModelElement(
+							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
+							$current);
+					}
+				)
+				otherlv_1='synchronized'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
+				}
+				otherlv_2='('
+				{
+					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
+				}
+				lv_param_3_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
+					}
+					set(
+						$current,
+						"param",
+						lv_param_3_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4=')'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
+				}
+				lv_expression_5_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_5_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
 
-)
-)	otherlv_4=')' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); 
-	    }
-		lv_expression_5_0=ruleXExpression		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
-	        }
-       		set(
-       			$current, 
-       			"expression",
-        		lv_expression_5_0, 
-        		"XExpression");
-	        afterParserOrEnumRuleCall();
-	    }
+// Entry rule entryRuleXCatchClause
+entryRuleXCatchClause returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXCatchClauseRule()); }
+	iv_ruleXCatchClause=ruleXCatchClause
+	{ $current=$iv_ruleXCatchClause.current; }
+	EOF;
+
+// Rule XCatchClause
+ruleXCatchClause returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			('catch')=>
+			otherlv_0='catch'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
+			}
+		)
+		otherlv_1='('
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
+				}
+				lv_declaredParam_2_0=ruleFullJvmFormalParameter
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
+					}
+					set(
+						$current,
+						"declaredParam",
+						lv_declaredParam_2_0,
+						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3=')'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
+				}
+				lv_expression_4_0=ruleXExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_4_0,
+						"org.eclipse.xtext.xbase.Xbase.XExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleQualifiedName
+entryRuleQualifiedName returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); }
+	iv_ruleQualifiedName=ruleQualifiedName
+	{ $current=$iv_ruleQualifiedName.current.getText(); }
+	EOF;
+
+// Rule QualifiedName
+ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
+		}
+		this_ValidID_0=ruleValidID
+		{
+			$current.merge(this_ValidID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				('.')=>
+				kw='.'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
+				}
+			)
+			{
+				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
+			}
+			this_ValidID_2=ruleValidID
+			{
+				$current.merge(this_ValidID_2);
+			}
+			{
+				afterParserOrEnumRuleCall();
+			}
+		)*
+	)
+;
+
+// Entry rule entryRuleNumber
+entryRuleNumber returns [String current=null]@init {
+	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+}:
+	{ newCompositeNode(grammarAccess.getNumberRule()); }
+	iv_ruleNumber=ruleNumber
+	{ $current=$iv_ruleNumber.current.getText(); }
+	EOF;
+finally {
+	myHiddenTokenState.restore();
+}
+
+// Rule Number
+ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+}
+@after {
+	leaveRule();
+}:
+	(
+		this_HEX_0=RULE_HEX
+		{
+			$current.merge(this_HEX_0);
+		}
+		{
+			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
+		}
+		    |
+		(
+			(
+				this_INT_1=RULE_INT
+				{
+					$current.merge(this_INT_1);
+				}
+				{
+					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
+				}
+				    |
+				this_DECIMAL_2=RULE_DECIMAL
+				{
+					$current.merge(this_DECIMAL_2);
+				}
+				{
+					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
+				}
+			)
+			(
+				kw='.'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
+				}
+				(
+					this_INT_4=RULE_INT
+					{
+						$current.merge(this_INT_4);
+					}
+					{
+						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
+					}
+					    |
+					this_DECIMAL_5=RULE_DECIMAL
+					{
+						$current.merge(this_DECIMAL_5);
+					}
+					{
+						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
+					}
+				)
+			)?
+		)
+	)
+;
+finally {
+	myHiddenTokenState.restore();
+}
+
+// Entry rule entryRuleJvmTypeReference
+entryRuleJvmTypeReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
+	iv_ruleJvmTypeReference=ruleJvmTypeReference
+	{ $current=$iv_ruleJvmTypeReference.current; }
+	EOF;
+
+// Rule JvmTypeReference
+ruleJvmTypeReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
+			}
+			this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference
+			{
+				$current = $this_JvmParameterizedTypeReference_0.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				((
+					(
+					)
+					ruleArrayBrackets
+				)
+				)=>
+				(
+					(
+						{
+							$current = forceCreateModelElementAndSet(
+								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
+								$current);
+						}
+					)
+					{
+						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
+					}
+					ruleArrayBrackets
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+		)
+		    |
+		{
+			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
+		}
+		this_XFunctionTypeRef_3=ruleXFunctionTypeRef
+		{
+			$current = $this_XFunctionTypeRef_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleArrayBrackets
+entryRuleArrayBrackets returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getArrayBracketsRule()); }
+	iv_ruleArrayBrackets=ruleArrayBrackets
+	{ $current=$iv_ruleArrayBrackets.current.getText(); }
+	EOF;
+
+// Rule ArrayBrackets
+ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='['
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
+		}
+		kw=']'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleXFunctionTypeRef
+entryRuleXFunctionTypeRef returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
+	iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef
+	{ $current=$iv_ruleXFunctionTypeRef.current; }
+	EOF;
+
+// Rule XFunctionTypeRef
+ruleXFunctionTypeRef returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='('
+			{
+				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
+						}
+						lv_paramTypes_1_0=ruleJvmTypeReference
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+							}
+							add(
+								$current,
+								"paramTypes",
+								lv_paramTypes_1_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_2=','
+					{
+						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
+							}
+							lv_paramTypes_3_0=ruleJvmTypeReference
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+								}
+								add(
+									$current,
+									"paramTypes",
+									lv_paramTypes_3_0,
+									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)?
+			otherlv_4=')'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+			}
+		)?
+		otherlv_5='=>'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
+				}
+				lv_returnType_6_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+					}
+					set(
+						$current,
+						"returnType",
+						lv_returnType_6_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleJvmParameterizedTypeReference
+entryRuleJvmParameterizedTypeReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
+	iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference
+	{ $current=$iv_ruleJvmParameterizedTypeReference.current; }
+	EOF;
+
+// Rule JvmParameterizedTypeReference
+ruleJvmParameterizedTypeReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
+				}
+				ruleQualifiedName
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				('<')=>
+				otherlv_1='<'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+					}
+					lv_arguments_2_0=ruleJvmArgumentTypeReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+						}
+						add(
+							$current,
+							"arguments",
+							lv_arguments_2_0,
+							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_3=','
+				{
+					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+						}
+						lv_arguments_4_0=ruleJvmArgumentTypeReference
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+							}
+							add(
+								$current,
+								"arguments",
+								lv_arguments_4_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_5='>'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
+			}
+			(
+				(
+					((
+						(
+						)
+						'.'
+					)
+					)=>
+					(
+						(
+							{
+								$current = forceCreateModelElementAndSet(
+									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
+									$current);
+							}
+						)
+						otherlv_7='.'
+						{
+							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+						}
+					)
+				)
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
+						}
+						ruleValidID
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						('<')=>
+						otherlv_9='<'
+						{
+							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
+							}
+							lv_arguments_10_0=ruleJvmArgumentTypeReference
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+								}
+								add(
+									$current,
+									"arguments",
+									lv_arguments_10_0,
+									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_11=','
+						{
+							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
+								}
+								lv_arguments_12_0=ruleJvmArgumentTypeReference
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+									}
+									add(
+										$current,
+										"arguments",
+										lv_arguments_12_0,
+										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+					otherlv_13='>'
+					{
+						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+					}
+				)?
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleJvmArgumentTypeReference
+entryRuleJvmArgumentTypeReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
+	iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference
+	{ $current=$iv_ruleJvmArgumentTypeReference.current; }
+	EOF;
+
+// Rule JvmArgumentTypeReference
+ruleJvmArgumentTypeReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
+		}
+		this_JvmTypeReference_0=ruleJvmTypeReference
+		{
+			$current = $this_JvmTypeReference_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
+		}
+		this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference
+		{
+			$current = $this_JvmWildcardTypeReference_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleJvmWildcardTypeReference
+entryRuleJvmWildcardTypeReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
+	iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference
+	{ $current=$iv_ruleJvmWildcardTypeReference.current; }
+	EOF;
+
+// Rule JvmWildcardTypeReference
+ruleJvmWildcardTypeReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='?'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+		}
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
+						}
+						lv_constraints_2_0=ruleJvmUpperBound
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+							}
+							add(
+								$current,
+								"constraints",
+								lv_constraints_2_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
+						}
+						lv_constraints_3_0=ruleJvmUpperBoundAnded
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+							}
+							add(
+								$current,
+								"constraints",
+								lv_constraints_3_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
+						}
+						lv_constraints_4_0=ruleJvmLowerBound
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+							}
+							add(
+								$current,
+								"constraints",
+								lv_constraints_4_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
+						}
+						lv_constraints_5_0=ruleJvmLowerBoundAnded
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+							}
+							add(
+								$current,
+								"constraints",
+								lv_constraints_5_0,
+								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleJvmUpperBound
+entryRuleJvmUpperBound returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
+	iv_ruleJvmUpperBound=ruleJvmUpperBound
+	{ $current=$iv_ruleJvmUpperBound.current; }
+	EOF;
+
+// Rule JvmUpperBound
+ruleJvmUpperBound returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='extends'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_typeReference_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
+					}
+					set(
+						$current,
+						"typeReference",
+						lv_typeReference_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleJvmUpperBoundAnded
+entryRuleJvmUpperBoundAnded returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
+	iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded
+	{ $current=$iv_ruleJvmUpperBoundAnded.current; }
+	EOF;
+
+// Rule JvmUpperBoundAnded
+ruleJvmUpperBoundAnded returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='&'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_typeReference_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
+					}
+					set(
+						$current,
+						"typeReference",
+						lv_typeReference_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleJvmLowerBound
+entryRuleJvmLowerBound returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
+	iv_ruleJvmLowerBound=ruleJvmLowerBound
+	{ $current=$iv_ruleJvmLowerBound.current; }
+	EOF;
+
+// Rule JvmLowerBound
+ruleJvmLowerBound returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='super'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_typeReference_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
+					}
+					set(
+						$current,
+						"typeReference",
+						lv_typeReference_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleJvmLowerBoundAnded
+entryRuleJvmLowerBoundAnded returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
+	iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded
+	{ $current=$iv_ruleJvmLowerBoundAnded.current; }
+	EOF;
+
+// Rule JvmLowerBoundAnded
+ruleJvmLowerBoundAnded returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='&'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_typeReference_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
+					}
+					set(
+						$current,
+						"typeReference",
+						lv_typeReference_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleQualifiedNameWithWildcard
+entryRuleQualifiedNameWithWildcard returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); }
+	iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard
+	{ $current=$iv_ruleQualifiedNameWithWildcard.current.getText(); }
+	EOF;
+
+// Rule QualifiedNameWithWildcard
+ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
+		}
+		this_QualifiedName_0=ruleQualifiedName
+		{
+			$current.merge(this_QualifiedName_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		kw='.'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
+		}
+		kw='*'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleValidID
+entryRuleValidID returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getValidIDRule()); }
+	iv_ruleValidID=ruleValidID
+	{ $current=$iv_ruleValidID.current.getText(); }
+	EOF;
+
+// Rule ValidID
+ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_ID_0=RULE_ID
+	{
+		$current.merge(this_ID_0);
+	}
+	{
+		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleXImportSection
+entryRuleXImportSection returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXImportSectionRule()); }
+	iv_ruleXImportSection=ruleXImportSection
+	{ $current=$iv_ruleXImportSection.current; }
+	EOF;
+
+// Rule XImportSection
+ruleXImportSection returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
+			}
+			lv_importDeclarations_0_0=ruleXImportDeclaration
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getXImportSectionRule());
+				}
+				add(
+					$current,
+					"importDeclarations",
+					lv_importDeclarations_0_0,
+					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)+
+;
+
+// Entry rule entryRuleQualifiedNameInStaticImport
+entryRuleQualifiedNameInStaticImport returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); }
+	iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport
+	{ $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }
+	EOF;
+
+// Rule QualifiedNameInStaticImport
+ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
+		}
+		this_ValidID_0=ruleValidID
+		{
+			$current.merge(this_ValidID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		kw='.'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
+		}
+	)+
+;
+
+// Rule EDateStepType
+ruleEDateStepType returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='days'
+			{
+				$current = grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='weeks'
+			{
+				$current = grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='months'
+			{
+				$current = grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='years'
+			{
+				$current = grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+RULE_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;
+
+RULE_INT : '0'..'9' ('0'..'9'|'_')*;
+
+RULE_DECIMAL : RULE_INT (('e'|'E') ('+'|'-')? RULE_INT)? (('b'|'B') ('i'|'I'|'d'|'D')|('l'|'L'|'d'|'D'|'f'|'F'))?;
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'?|'\'' ('\\' .|~(('\\'|'\'')))* '\''?);
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens
index 1fb5127..1d79da1 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.tokens
@@ -1,155 +1,155 @@
-'!'=120
-'!='=106
-'!=='=108
-'#'=92
-'%'=119
-'%='=99
-'&&'=104
+'!'=123
+'!='=109
+'!=='=111
+'#'=95
+'%'=122
+'%='=102
+'&&'=107
 '&'=153
-'('=26
-')'=28
-'*'=19
-'**'=117
-'*='=97
-'+'=116
-'++'=121
-'+='=95
-','=27
-'-'=80
-'--'=122
-'-='=96
-'->'=110
-'.'=18
-'..'=112
-'..<'=111
-'/'=118
-'/='=98
-':'=130
-'::'=123
-';'=126
-'<'=100
-'<>'=114
-'='=91
-'=='=105
-'==='=107
-'=>'=113
-'>'=101
-'>='=102
+'('=25
+')'=27
+'*'=90
+'**'=120
+'*='=100
+'+'=119
+'++'=124
+'+='=98
+','=26
+'-'=77
+'--'=125
+'-='=99
+'->'=113
+'.'=34
+'..'=115
+'..<'=114
+'/'=121
+'/='=101
+':'=132
+'::'=126
+';'=92
+'<'=103
+'<>'=117
+'='=94
+'=='=108
+'==='=110
+'=>'=116
+'>'=104
+'>='=105
 '?'=152
-'?.'=124
-'?:'=115
-'@'=90
-'['=93
-']'=94
-'as'=81
-'attributes'=25
-'based on'=41
-'boolean'=46
-'by enum'=33
-'by object'=83
-'by resource'=69
-'calculate as'=40
-'calculate based on'=84
-'case'=132
+'?.'=127
+'?:'=118
+'@'=93
+'['=96
+']'=97
+'as'=78
+'attributes'=24
+'basedOn'=40
+'boolean'=45
+'byEnum'=32
+'byObject'=80
+'calculateAs'=39
+'calculateOn'=81
+'case'=134
 'catch'=151
-'createBlobMapping'=70
-'datainterchange import'=21
-'datainterchanges'=20
-'datatype'=63
-'datatypes'=34
-'date from'=75
-'date in range'=47
+'createBlobMapping'=68
+'datainterchange'=20
+'datainterchanges'=19
+'dateFrom'=72
+'dateRange'=46
 'days'=154
 'decimals'=50
-'default'=131
-'defined as'=39
-'do'=135
-'else'=128
-'embed'=38
-'every'=76
-'existing entities'=87
-'extends'=137
-'extension'=139
+'default'=133
+'definedAs'=38
+'describedBy'=17
+'do'=137
+'else'=130
+'embed'=37
+'entities'=63
+'entity'=65
+'every'=73
+'existingEntities'=84
+'extends'=139
+'extension'=89
 'false'=142
+'file'=21
 'finally'=149
-'for entity'=66
-'for'=133
-'from file'=22
-'future date'=43
-'if'=127
-'import'=16
-'instanceof'=109
-'integer from'=72
-'items'=29
-'iterate'=71
-'mock entities'=64
-'mock entitymodel for'=13
-'mocking'=65
+'for'=135
+'from'=47
+'future'=42
+'if'=129
+'import'=87
+'instanceof'=112
+'integerFrom'=70
+'integerPick'=54
+'integerRange'=53
+'items'=28
+'iterate'=69
+'mock'=16
+'mocking'=64
 'months'=156
 'new'=141
+'ns'=91
 'null'=144
-'object'=31
-'objects'=30
-'optional for'=88
-'paragraps'=56
-'past date'=45
-'percent'=89
-'randomize'=42
-'ref'=86
-'resource'=24
-'resources'=23
+'numberPick'=52
+'numberRange'=49
+'object'=30
+'objects'=29
+'optionalFor'=85
+'package'=13
+'paragraphs'=56
+'past'=44
+'percent'=86
+'priority'=18
+'randomize'=41
+'ref'=83
+'resource'=23
+'resources'=22
 'return'=147
-'round to'=51
-'rows'=67
-'run with priority'=15
+'roundTo'=51
+'rows'=66
 'sentences'=57
-'signed double from'=52
-'signed double in range'=49
-'signed integer from'=54
-'signed integer in range'=53
-'static'=138
-'step'=74
+'static'=88
+'step'=71
 'super'=140
-'switch on'=36
-'switch'=129
+'switch'=131
+'switchOn'=35
 'synchronized'=150
-'temporary'=82
-'text from'=55
+'template'=79
+'textPick'=55
 'throw'=146
-'to'=68
-'today'=78
-'tomorrow'=79
+'to'=67
+'today'=75
+'tomorrow'=76
 'true'=143
 'try'=148
 'typeof'=145
-'unsigned double from'=60
-'unsigned double in range'=59
-'unsigned integer from'=62
-'unsigned integer in range'=61
-'until'=73
-'up to and including'=48
-'using'=85
-'val'=136
-'var'=32
+'unsignedIntegerPick'=62
+'unsignedIntegerRange'=61
+'unsignedNumberPick'=60
+'unsignedNumberRange'=59
+'until'=48
+'using'=82
+'val'=138
+'var'=31
 'weeks'=155
-'when'=37
-'while'=134
-'with'=35
+'when'=36
+'while'=136
+'with'=33
 'words'=58
-'years'=44
-'yesterday'=77
+'years'=43
+'yesterday'=74
 '{'=14
-'|'=125
-'||'=103
-'}'=17
+'|'=128
+'||'=106
+'}'=15
 RULE_ANY_OTHER=12
 RULE_DECIMAL=8
 RULE_HEX=7
-RULE_ID=5
-RULE_INT=4
+RULE_ID=4
+RULE_INT=6
 RULE_ML_COMMENT=9
 RULE_SL_COMMENT=10
-RULE_STRING=6
+RULE_STRING=5
 RULE_WS=11
 T__100=100
 T__101=101
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLLexer.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLLexer.java
index 6160a0f..9fa9c4a 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLLexer.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLLexer.java
@@ -54,10 +54,10 @@
     public static final int T__135=135;
     public static final int T__61=61;
     public static final int T__134=134;
-    public static final int RULE_ID=5;
+    public static final int RULE_ID=4;
     public static final int T__131=131;
     public static final int T__130=130;
-    public static final int RULE_INT=4;
+    public static final int RULE_INT=6;
     public static final int T__66=66;
     public static final int RULE_ML_COMMENT=9;
     public static final int T__67=67;
@@ -141,7 +141,7 @@
     public static final int T__72=72;
     public static final int T__123=123;
     public static final int T__120=120;
-    public static final int RULE_STRING=6;
+    public static final int RULE_STRING=5;
     public static final int RULE_SL_COMMENT=10;
     public static final int T__77=77;
     public static final int T__119=119;
@@ -192,17 +192,17 @@
         super(input,state);
 
     }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g"; }
+    public String getGrammarFileName() { return "InternalEntityMockDSL.g"; }
 
     // $ANTLR start "T__13"
     public final void mT__13() throws RecognitionException {
         try {
             int _type = T__13;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11:7: ( 'mock entitymodel for' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11:9: 'mock entitymodel for'
+            // InternalEntityMockDSL.g:11:7: ( 'package' )
+            // InternalEntityMockDSL.g:11:9: 'package'
             {
-            match("mock entitymodel for"); 
+            match("package"); 
 
 
             }
@@ -220,8 +220,8 @@
         try {
             int _type = T__14;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:12:7: ( '{' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:12:9: '{'
+            // InternalEntityMockDSL.g:12:7: ( '{' )
+            // InternalEntityMockDSL.g:12:9: '{'
             {
             match('{'); 
 
@@ -240,11 +240,10 @@
         try {
             int _type = T__15;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:13:7: ( 'run with priority' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:13:9: 'run with priority'
+            // InternalEntityMockDSL.g:13:7: ( '}' )
+            // InternalEntityMockDSL.g:13:9: '}'
             {
-            match("run with priority"); 
-
+            match('}'); 
 
             }
 
@@ -261,10 +260,10 @@
         try {
             int _type = T__16;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:14:7: ( 'import' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:14:9: 'import'
+            // InternalEntityMockDSL.g:14:7: ( 'mock' )
+            // InternalEntityMockDSL.g:14:9: 'mock'
             {
-            match("import"); 
+            match("mock"); 
 
 
             }
@@ -282,10 +281,11 @@
         try {
             int _type = T__17;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:15:7: ( '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:15:9: '}'
+            // InternalEntityMockDSL.g:15:7: ( 'describedBy' )
+            // InternalEntityMockDSL.g:15:9: 'describedBy'
             {
-            match('}'); 
+            match("describedBy"); 
+
 
             }
 
@@ -302,10 +302,11 @@
         try {
             int _type = T__18;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:16:7: ( '.' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:16:9: '.'
+            // InternalEntityMockDSL.g:16:7: ( 'priority' )
+            // InternalEntityMockDSL.g:16:9: 'priority'
             {
-            match('.'); 
+            match("priority"); 
+
 
             }
 
@@ -322,10 +323,11 @@
         try {
             int _type = T__19;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:17:7: ( '*' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:17:9: '*'
+            // InternalEntityMockDSL.g:17:7: ( 'datainterchanges' )
+            // InternalEntityMockDSL.g:17:9: 'datainterchanges'
             {
-            match('*'); 
+            match("datainterchanges"); 
+
 
             }
 
@@ -342,10 +344,10 @@
         try {
             int _type = T__20;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:18:7: ( 'datainterchanges' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:18:9: 'datainterchanges'
+            // InternalEntityMockDSL.g:18:7: ( 'datainterchange' )
+            // InternalEntityMockDSL.g:18:9: 'datainterchange'
             {
-            match("datainterchanges"); 
+            match("datainterchange"); 
 
 
             }
@@ -363,10 +365,10 @@
         try {
             int _type = T__21;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:19:7: ( 'datainterchange import' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:19:9: 'datainterchange import'
+            // InternalEntityMockDSL.g:19:7: ( 'file' )
+            // InternalEntityMockDSL.g:19:9: 'file'
             {
-            match("datainterchange import"); 
+            match("file"); 
 
 
             }
@@ -384,10 +386,10 @@
         try {
             int _type = T__22;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:20:7: ( 'from file' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:20:9: 'from file'
+            // InternalEntityMockDSL.g:20:7: ( 'resources' )
+            // InternalEntityMockDSL.g:20:9: 'resources'
             {
-            match("from file"); 
+            match("resources"); 
 
 
             }
@@ -405,10 +407,10 @@
         try {
             int _type = T__23;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:21:7: ( 'resources' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:21:9: 'resources'
+            // InternalEntityMockDSL.g:21:7: ( 'resource' )
+            // InternalEntityMockDSL.g:21:9: 'resource'
             {
-            match("resources"); 
+            match("resource"); 
 
 
             }
@@ -426,10 +428,10 @@
         try {
             int _type = T__24;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:22:7: ( 'resource' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:22:9: 'resource'
+            // InternalEntityMockDSL.g:22:7: ( 'attributes' )
+            // InternalEntityMockDSL.g:22:9: 'attributes'
             {
-            match("resource"); 
+            match("attributes"); 
 
 
             }
@@ -447,11 +449,10 @@
         try {
             int _type = T__25;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:23:7: ( 'attributes' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:23:9: 'attributes'
+            // InternalEntityMockDSL.g:23:7: ( '(' )
+            // InternalEntityMockDSL.g:23:9: '('
             {
-            match("attributes"); 
-
+            match('('); 
 
             }
 
@@ -468,10 +469,10 @@
         try {
             int _type = T__26;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:24:7: ( '(' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:24:9: '('
+            // InternalEntityMockDSL.g:24:7: ( ',' )
+            // InternalEntityMockDSL.g:24:9: ','
             {
-            match('('); 
+            match(','); 
 
             }
 
@@ -488,10 +489,10 @@
         try {
             int _type = T__27;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:25:7: ( ',' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:25:9: ','
+            // InternalEntityMockDSL.g:25:7: ( ')' )
+            // InternalEntityMockDSL.g:25:9: ')'
             {
-            match(','); 
+            match(')'); 
 
             }
 
@@ -508,10 +509,11 @@
         try {
             int _type = T__28;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:26:7: ( ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:26:9: ')'
+            // InternalEntityMockDSL.g:26:7: ( 'items' )
+            // InternalEntityMockDSL.g:26:9: 'items'
             {
-            match(')'); 
+            match("items"); 
+
 
             }
 
@@ -528,10 +530,10 @@
         try {
             int _type = T__29;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:27:7: ( 'items' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:27:9: 'items'
+            // InternalEntityMockDSL.g:27:7: ( 'objects' )
+            // InternalEntityMockDSL.g:27:9: 'objects'
             {
-            match("items"); 
+            match("objects"); 
 
 
             }
@@ -549,10 +551,10 @@
         try {
             int _type = T__30;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:28:7: ( 'objects' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:28:9: 'objects'
+            // InternalEntityMockDSL.g:28:7: ( 'object' )
+            // InternalEntityMockDSL.g:28:9: 'object'
             {
-            match("objects"); 
+            match("object"); 
 
 
             }
@@ -570,10 +572,10 @@
         try {
             int _type = T__31;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:29:7: ( 'object' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:29:9: 'object'
+            // InternalEntityMockDSL.g:29:7: ( 'var' )
+            // InternalEntityMockDSL.g:29:9: 'var'
             {
-            match("object"); 
+            match("var"); 
 
 
             }
@@ -591,10 +593,10 @@
         try {
             int _type = T__32;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:30:7: ( 'var' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:30:9: 'var'
+            // InternalEntityMockDSL.g:30:7: ( 'byEnum' )
+            // InternalEntityMockDSL.g:30:9: 'byEnum'
             {
-            match("var"); 
+            match("byEnum"); 
 
 
             }
@@ -612,10 +614,10 @@
         try {
             int _type = T__33;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:31:7: ( 'by enum' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:31:9: 'by enum'
+            // InternalEntityMockDSL.g:31:7: ( 'with' )
+            // InternalEntityMockDSL.g:31:9: 'with'
             {
-            match("by enum"); 
+            match("with"); 
 
 
             }
@@ -633,11 +635,10 @@
         try {
             int _type = T__34;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:32:7: ( 'datatypes' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:32:9: 'datatypes'
+            // InternalEntityMockDSL.g:32:7: ( '.' )
+            // InternalEntityMockDSL.g:32:9: '.'
             {
-            match("datatypes"); 
-
+            match('.'); 
 
             }
 
@@ -654,10 +655,10 @@
         try {
             int _type = T__35;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:33:7: ( 'with' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:33:9: 'with'
+            // InternalEntityMockDSL.g:33:7: ( 'switchOn' )
+            // InternalEntityMockDSL.g:33:9: 'switchOn'
             {
-            match("with"); 
+            match("switchOn"); 
 
 
             }
@@ -675,10 +676,10 @@
         try {
             int _type = T__36;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:34:7: ( 'switch on' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:34:9: 'switch on'
+            // InternalEntityMockDSL.g:34:7: ( 'when' )
+            // InternalEntityMockDSL.g:34:9: 'when'
             {
-            match("switch on"); 
+            match("when"); 
 
 
             }
@@ -696,10 +697,10 @@
         try {
             int _type = T__37;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:35:7: ( 'when' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:35:9: 'when'
+            // InternalEntityMockDSL.g:35:7: ( 'embed' )
+            // InternalEntityMockDSL.g:35:9: 'embed'
             {
-            match("when"); 
+            match("embed"); 
 
 
             }
@@ -717,10 +718,10 @@
         try {
             int _type = T__38;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:36:7: ( 'embed' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:36:9: 'embed'
+            // InternalEntityMockDSL.g:36:7: ( 'definedAs' )
+            // InternalEntityMockDSL.g:36:9: 'definedAs'
             {
-            match("embed"); 
+            match("definedAs"); 
 
 
             }
@@ -738,10 +739,10 @@
         try {
             int _type = T__39;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:37:7: ( 'defined as' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:37:9: 'defined as'
+            // InternalEntityMockDSL.g:37:7: ( 'calculateAs' )
+            // InternalEntityMockDSL.g:37:9: 'calculateAs'
             {
-            match("defined as"); 
+            match("calculateAs"); 
 
 
             }
@@ -759,10 +760,10 @@
         try {
             int _type = T__40;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:38:7: ( 'calculate as' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:38:9: 'calculate as'
+            // InternalEntityMockDSL.g:38:7: ( 'basedOn' )
+            // InternalEntityMockDSL.g:38:9: 'basedOn'
             {
-            match("calculate as"); 
+            match("basedOn"); 
 
 
             }
@@ -780,10 +781,10 @@
         try {
             int _type = T__41;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:39:7: ( 'based on' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:39:9: 'based on'
+            // InternalEntityMockDSL.g:39:7: ( 'randomize' )
+            // InternalEntityMockDSL.g:39:9: 'randomize'
             {
-            match("based on"); 
+            match("randomize"); 
 
 
             }
@@ -801,10 +802,10 @@
         try {
             int _type = T__42;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:40:7: ( 'randomize' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:40:9: 'randomize'
+            // InternalEntityMockDSL.g:40:7: ( 'future' )
+            // InternalEntityMockDSL.g:40:9: 'future'
             {
-            match("randomize"); 
+            match("future"); 
 
 
             }
@@ -822,10 +823,10 @@
         try {
             int _type = T__43;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:41:7: ( 'future date' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:41:9: 'future date'
+            // InternalEntityMockDSL.g:41:7: ( 'years' )
+            // InternalEntityMockDSL.g:41:9: 'years'
             {
-            match("future date"); 
+            match("years"); 
 
 
             }
@@ -843,10 +844,10 @@
         try {
             int _type = T__44;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:42:7: ( 'years' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:42:9: 'years'
+            // InternalEntityMockDSL.g:42:7: ( 'past' )
+            // InternalEntityMockDSL.g:42:9: 'past'
             {
-            match("years"); 
+            match("past"); 
 
 
             }
@@ -864,10 +865,10 @@
         try {
             int _type = T__45;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:43:7: ( 'past date' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:43:9: 'past date'
+            // InternalEntityMockDSL.g:43:7: ( 'boolean' )
+            // InternalEntityMockDSL.g:43:9: 'boolean'
             {
-            match("past date"); 
+            match("boolean"); 
 
 
             }
@@ -885,10 +886,10 @@
         try {
             int _type = T__46;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:44:7: ( 'boolean' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:44:9: 'boolean'
+            // InternalEntityMockDSL.g:44:7: ( 'dateRange' )
+            // InternalEntityMockDSL.g:44:9: 'dateRange'
             {
-            match("boolean"); 
+            match("dateRange"); 
 
 
             }
@@ -906,10 +907,10 @@
         try {
             int _type = T__47;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:45:7: ( 'date in range' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:45:9: 'date in range'
+            // InternalEntityMockDSL.g:45:7: ( 'from' )
+            // InternalEntityMockDSL.g:45:9: 'from'
             {
-            match("date in range"); 
+            match("from"); 
 
 
             }
@@ -927,10 +928,10 @@
         try {
             int _type = T__48;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:46:7: ( 'up to and including' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:46:9: 'up to and including'
+            // InternalEntityMockDSL.g:46:7: ( 'until' )
+            // InternalEntityMockDSL.g:46:9: 'until'
             {
-            match("up to and including"); 
+            match("until"); 
 
 
             }
@@ -948,10 +949,10 @@
         try {
             int _type = T__49;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:47:7: ( 'signed double in range' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:47:9: 'signed double in range'
+            // InternalEntityMockDSL.g:47:7: ( 'numberRange' )
+            // InternalEntityMockDSL.g:47:9: 'numberRange'
             {
-            match("signed double in range"); 
+            match("numberRange"); 
 
 
             }
@@ -969,8 +970,8 @@
         try {
             int _type = T__50;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:48:7: ( 'decimals' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:48:9: 'decimals'
+            // InternalEntityMockDSL.g:48:7: ( 'decimals' )
+            // InternalEntityMockDSL.g:48:9: 'decimals'
             {
             match("decimals"); 
 
@@ -990,10 +991,10 @@
         try {
             int _type = T__51;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:49:7: ( 'round to' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:49:9: 'round to'
+            // InternalEntityMockDSL.g:49:7: ( 'roundTo' )
+            // InternalEntityMockDSL.g:49:9: 'roundTo'
             {
-            match("round to"); 
+            match("roundTo"); 
 
 
             }
@@ -1011,10 +1012,10 @@
         try {
             int _type = T__52;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:50:7: ( 'signed double from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:50:9: 'signed double from'
+            // InternalEntityMockDSL.g:50:7: ( 'numberPick' )
+            // InternalEntityMockDSL.g:50:9: 'numberPick'
             {
-            match("signed double from"); 
+            match("numberPick"); 
 
 
             }
@@ -1032,10 +1033,10 @@
         try {
             int _type = T__53;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:51:7: ( 'signed integer in range' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:51:9: 'signed integer in range'
+            // InternalEntityMockDSL.g:51:7: ( 'integerRange' )
+            // InternalEntityMockDSL.g:51:9: 'integerRange'
             {
-            match("signed integer in range"); 
+            match("integerRange"); 
 
 
             }
@@ -1053,10 +1054,10 @@
         try {
             int _type = T__54;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:52:7: ( 'signed integer from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:52:9: 'signed integer from'
+            // InternalEntityMockDSL.g:52:7: ( 'integerPick' )
+            // InternalEntityMockDSL.g:52:9: 'integerPick'
             {
-            match("signed integer from"); 
+            match("integerPick"); 
 
 
             }
@@ -1074,10 +1075,10 @@
         try {
             int _type = T__55;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:53:7: ( 'text from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:53:9: 'text from'
+            // InternalEntityMockDSL.g:53:7: ( 'textPick' )
+            // InternalEntityMockDSL.g:53:9: 'textPick'
             {
-            match("text from"); 
+            match("textPick"); 
 
 
             }
@@ -1095,10 +1096,10 @@
         try {
             int _type = T__56;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:54:7: ( 'paragraps' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:54:9: 'paragraps'
+            // InternalEntityMockDSL.g:54:7: ( 'paragraphs' )
+            // InternalEntityMockDSL.g:54:9: 'paragraphs'
             {
-            match("paragraps"); 
+            match("paragraphs"); 
 
 
             }
@@ -1116,8 +1117,8 @@
         try {
             int _type = T__57;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:55:7: ( 'sentences' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:55:9: 'sentences'
+            // InternalEntityMockDSL.g:55:7: ( 'sentences' )
+            // InternalEntityMockDSL.g:55:9: 'sentences'
             {
             match("sentences"); 
 
@@ -1137,8 +1138,8 @@
         try {
             int _type = T__58;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:56:7: ( 'words' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:56:9: 'words'
+            // InternalEntityMockDSL.g:56:7: ( 'words' )
+            // InternalEntityMockDSL.g:56:9: 'words'
             {
             match("words"); 
 
@@ -1158,10 +1159,10 @@
         try {
             int _type = T__59;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:57:7: ( 'unsigned double in range' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:57:9: 'unsigned double in range'
+            // InternalEntityMockDSL.g:57:7: ( 'unsignedNumberRange' )
+            // InternalEntityMockDSL.g:57:9: 'unsignedNumberRange'
             {
-            match("unsigned double in range"); 
+            match("unsignedNumberRange"); 
 
 
             }
@@ -1179,10 +1180,10 @@
         try {
             int _type = T__60;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:58:7: ( 'unsigned double from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:58:9: 'unsigned double from'
+            // InternalEntityMockDSL.g:58:7: ( 'unsignedNumberPick' )
+            // InternalEntityMockDSL.g:58:9: 'unsignedNumberPick'
             {
-            match("unsigned double from"); 
+            match("unsignedNumberPick"); 
 
 
             }
@@ -1200,10 +1201,10 @@
         try {
             int _type = T__61;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:59:7: ( 'unsigned integer in range' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:59:9: 'unsigned integer in range'
+            // InternalEntityMockDSL.g:59:7: ( 'unsignedIntegerRange' )
+            // InternalEntityMockDSL.g:59:9: 'unsignedIntegerRange'
             {
-            match("unsigned integer in range"); 
+            match("unsignedIntegerRange"); 
 
 
             }
@@ -1221,10 +1222,10 @@
         try {
             int _type = T__62;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:60:7: ( 'unsigned integer from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:60:9: 'unsigned integer from'
+            // InternalEntityMockDSL.g:60:7: ( 'unsignedIntegerPick' )
+            // InternalEntityMockDSL.g:60:9: 'unsignedIntegerPick'
             {
-            match("unsigned integer from"); 
+            match("unsignedIntegerPick"); 
 
 
             }
@@ -1242,10 +1243,10 @@
         try {
             int _type = T__63;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:61:7: ( 'datatype' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:61:9: 'datatype'
+            // InternalEntityMockDSL.g:61:7: ( 'entities' )
+            // InternalEntityMockDSL.g:61:9: 'entities'
             {
-            match("datatype"); 
+            match("entities"); 
 
 
             }
@@ -1263,10 +1264,10 @@
         try {
             int _type = T__64;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:62:7: ( 'mock entities' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:62:9: 'mock entities'
+            // InternalEntityMockDSL.g:62:7: ( 'mocking' )
+            // InternalEntityMockDSL.g:62:9: 'mocking'
             {
-            match("mock entities"); 
+            match("mocking"); 
 
 
             }
@@ -1284,10 +1285,10 @@
         try {
             int _type = T__65;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:63:7: ( 'mocking' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:63:9: 'mocking'
+            // InternalEntityMockDSL.g:63:7: ( 'entity' )
+            // InternalEntityMockDSL.g:63:9: 'entity'
             {
-            match("mocking"); 
+            match("entity"); 
 
 
             }
@@ -1305,10 +1306,10 @@
         try {
             int _type = T__66;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:64:7: ( 'for entity' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:64:9: 'for entity'
+            // InternalEntityMockDSL.g:64:7: ( 'rows' )
+            // InternalEntityMockDSL.g:64:9: 'rows'
             {
-            match("for entity"); 
+            match("rows"); 
 
 
             }
@@ -1326,10 +1327,10 @@
         try {
             int _type = T__67;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:65:7: ( 'rows' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:65:9: 'rows'
+            // InternalEntityMockDSL.g:65:7: ( 'to' )
+            // InternalEntityMockDSL.g:65:9: 'to'
             {
-            match("rows"); 
+            match("to"); 
 
 
             }
@@ -1347,10 +1348,10 @@
         try {
             int _type = T__68;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:66:7: ( 'to' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:66:9: 'to'
+            // InternalEntityMockDSL.g:66:7: ( 'createBlobMapping' )
+            // InternalEntityMockDSL.g:66:9: 'createBlobMapping'
             {
-            match("to"); 
+            match("createBlobMapping"); 
 
 
             }
@@ -1368,10 +1369,10 @@
         try {
             int _type = T__69;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:67:7: ( 'by resource' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:67:9: 'by resource'
+            // InternalEntityMockDSL.g:67:7: ( 'iterate' )
+            // InternalEntityMockDSL.g:67:9: 'iterate'
             {
-            match("by resource"); 
+            match("iterate"); 
 
 
             }
@@ -1389,10 +1390,10 @@
         try {
             int _type = T__70;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:68:7: ( 'createBlobMapping' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:68:9: 'createBlobMapping'
+            // InternalEntityMockDSL.g:68:7: ( 'integerFrom' )
+            // InternalEntityMockDSL.g:68:9: 'integerFrom'
             {
-            match("createBlobMapping"); 
+            match("integerFrom"); 
 
 
             }
@@ -1410,10 +1411,10 @@
         try {
             int _type = T__71;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:69:7: ( 'iterate' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:69:9: 'iterate'
+            // InternalEntityMockDSL.g:69:7: ( 'step' )
+            // InternalEntityMockDSL.g:69:9: 'step'
             {
-            match("iterate"); 
+            match("step"); 
 
 
             }
@@ -1431,10 +1432,10 @@
         try {
             int _type = T__72;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:70:7: ( 'integer from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:70:9: 'integer from'
+            // InternalEntityMockDSL.g:70:7: ( 'dateFrom' )
+            // InternalEntityMockDSL.g:70:9: 'dateFrom'
             {
-            match("integer from"); 
+            match("dateFrom"); 
 
 
             }
@@ -1452,10 +1453,10 @@
         try {
             int _type = T__73;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:71:7: ( 'until' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:71:9: 'until'
+            // InternalEntityMockDSL.g:71:7: ( 'every' )
+            // InternalEntityMockDSL.g:71:9: 'every'
             {
-            match("until"); 
+            match("every"); 
 
 
             }
@@ -1473,10 +1474,10 @@
         try {
             int _type = T__74;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:72:7: ( 'step' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:72:9: 'step'
+            // InternalEntityMockDSL.g:72:7: ( 'yesterday' )
+            // InternalEntityMockDSL.g:72:9: 'yesterday'
             {
-            match("step"); 
+            match("yesterday"); 
 
 
             }
@@ -1494,10 +1495,10 @@
         try {
             int _type = T__75;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:73:7: ( 'date from' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:73:9: 'date from'
+            // InternalEntityMockDSL.g:73:7: ( 'today' )
+            // InternalEntityMockDSL.g:73:9: 'today'
             {
-            match("date from"); 
+            match("today"); 
 
 
             }
@@ -1515,10 +1516,10 @@
         try {
             int _type = T__76;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:74:7: ( 'every' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:74:9: 'every'
+            // InternalEntityMockDSL.g:74:7: ( 'tomorrow' )
+            // InternalEntityMockDSL.g:74:9: 'tomorrow'
             {
-            match("every"); 
+            match("tomorrow"); 
 
 
             }
@@ -1536,11 +1537,10 @@
         try {
             int _type = T__77;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:75:7: ( 'yesterday' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:75:9: 'yesterday'
+            // InternalEntityMockDSL.g:75:7: ( '-' )
+            // InternalEntityMockDSL.g:75:9: '-'
             {
-            match("yesterday"); 
-
+            match('-'); 
 
             }
 
@@ -1557,10 +1557,10 @@
         try {
             int _type = T__78;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:76:7: ( 'today' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:76:9: 'today'
+            // InternalEntityMockDSL.g:76:7: ( 'as' )
+            // InternalEntityMockDSL.g:76:9: 'as'
             {
-            match("today"); 
+            match("as"); 
 
 
             }
@@ -1578,10 +1578,10 @@
         try {
             int _type = T__79;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:77:7: ( 'tomorrow' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:77:9: 'tomorrow'
+            // InternalEntityMockDSL.g:77:7: ( 'template' )
+            // InternalEntityMockDSL.g:77:9: 'template'
             {
-            match("tomorrow"); 
+            match("template"); 
 
 
             }
@@ -1599,10 +1599,11 @@
         try {
             int _type = T__80;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:78:7: ( '-' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:78:9: '-'
+            // InternalEntityMockDSL.g:78:7: ( 'byObject' )
+            // InternalEntityMockDSL.g:78:9: 'byObject'
             {
-            match('-'); 
+            match("byObject"); 
+
 
             }
 
@@ -1619,10 +1620,10 @@
         try {
             int _type = T__81;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:79:7: ( 'as' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:79:9: 'as'
+            // InternalEntityMockDSL.g:79:7: ( 'calculateOn' )
+            // InternalEntityMockDSL.g:79:9: 'calculateOn'
             {
-            match("as"); 
+            match("calculateOn"); 
 
 
             }
@@ -1640,10 +1641,10 @@
         try {
             int _type = T__82;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:80:7: ( 'temporary' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:80:9: 'temporary'
+            // InternalEntityMockDSL.g:80:7: ( 'using' )
+            // InternalEntityMockDSL.g:80:9: 'using'
             {
-            match("temporary"); 
+            match("using"); 
 
 
             }
@@ -1661,10 +1662,10 @@
         try {
             int _type = T__83;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:81:7: ( 'by object' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:81:9: 'by object'
+            // InternalEntityMockDSL.g:81:7: ( 'ref' )
+            // InternalEntityMockDSL.g:81:9: 'ref'
             {
-            match("by object"); 
+            match("ref"); 
 
 
             }
@@ -1682,10 +1683,10 @@
         try {
             int _type = T__84;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:82:7: ( 'calculate based on' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:82:9: 'calculate based on'
+            // InternalEntityMockDSL.g:82:7: ( 'existingEntities' )
+            // InternalEntityMockDSL.g:82:9: 'existingEntities'
             {
-            match("calculate based on"); 
+            match("existingEntities"); 
 
 
             }
@@ -1703,10 +1704,10 @@
         try {
             int _type = T__85;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:83:7: ( 'using' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:83:9: 'using'
+            // InternalEntityMockDSL.g:83:7: ( 'optionalFor' )
+            // InternalEntityMockDSL.g:83:9: 'optionalFor'
             {
-            match("using"); 
+            match("optionalFor"); 
 
 
             }
@@ -1724,10 +1725,10 @@
         try {
             int _type = T__86;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:84:7: ( 'ref' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:84:9: 'ref'
+            // InternalEntityMockDSL.g:84:7: ( 'percent' )
+            // InternalEntityMockDSL.g:84:9: 'percent'
             {
-            match("ref"); 
+            match("percent"); 
 
 
             }
@@ -1745,10 +1746,10 @@
         try {
             int _type = T__87;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:85:7: ( 'existing entities' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:85:9: 'existing entities'
+            // InternalEntityMockDSL.g:85:7: ( 'import' )
+            // InternalEntityMockDSL.g:85:9: 'import'
             {
-            match("existing entities"); 
+            match("import"); 
 
 
             }
@@ -1766,10 +1767,10 @@
         try {
             int _type = T__88;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:86:7: ( 'optional for' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:86:9: 'optional for'
+            // InternalEntityMockDSL.g:86:7: ( 'static' )
+            // InternalEntityMockDSL.g:86:9: 'static'
             {
-            match("optional for"); 
+            match("static"); 
 
 
             }
@@ -1787,10 +1788,10 @@
         try {
             int _type = T__89;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:87:7: ( 'percent' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:87:9: 'percent'
+            // InternalEntityMockDSL.g:87:7: ( 'extension' )
+            // InternalEntityMockDSL.g:87:9: 'extension'
             {
-            match("percent"); 
+            match("extension"); 
 
 
             }
@@ -1808,10 +1809,10 @@
         try {
             int _type = T__90;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:88:7: ( '@' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:88:9: '@'
+            // InternalEntityMockDSL.g:88:7: ( '*' )
+            // InternalEntityMockDSL.g:88:9: '*'
             {
-            match('@'); 
+            match('*'); 
 
             }
 
@@ -1828,10 +1829,11 @@
         try {
             int _type = T__91;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:89:7: ( '=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:89:9: '='
+            // InternalEntityMockDSL.g:89:7: ( 'ns' )
+            // InternalEntityMockDSL.g:89:9: 'ns'
             {
-            match('='); 
+            match("ns"); 
+
 
             }
 
@@ -1848,10 +1850,10 @@
         try {
             int _type = T__92;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:90:7: ( '#' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:90:9: '#'
+            // InternalEntityMockDSL.g:90:7: ( ';' )
+            // InternalEntityMockDSL.g:90:9: ';'
             {
-            match('#'); 
+            match(';'); 
 
             }
 
@@ -1868,10 +1870,10 @@
         try {
             int _type = T__93;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:91:7: ( '[' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:91:9: '['
+            // InternalEntityMockDSL.g:91:7: ( '@' )
+            // InternalEntityMockDSL.g:91:9: '@'
             {
-            match('['); 
+            match('@'); 
 
             }
 
@@ -1888,10 +1890,10 @@
         try {
             int _type = T__94;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:92:7: ( ']' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:92:9: ']'
+            // InternalEntityMockDSL.g:92:7: ( '=' )
+            // InternalEntityMockDSL.g:92:9: '='
             {
-            match(']'); 
+            match('='); 
 
             }
 
@@ -1908,11 +1910,10 @@
         try {
             int _type = T__95;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:93:7: ( '+=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:93:9: '+='
+            // InternalEntityMockDSL.g:93:7: ( '#' )
+            // InternalEntityMockDSL.g:93:9: '#'
             {
-            match("+="); 
-
+            match('#'); 
 
             }
 
@@ -1929,11 +1930,10 @@
         try {
             int _type = T__96;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:94:7: ( '-=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:94:9: '-='
+            // InternalEntityMockDSL.g:94:7: ( '[' )
+            // InternalEntityMockDSL.g:94:9: '['
             {
-            match("-="); 
-
+            match('['); 
 
             }
 
@@ -1950,11 +1950,10 @@
         try {
             int _type = T__97;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:95:7: ( '*=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:95:9: '*='
+            // InternalEntityMockDSL.g:95:7: ( ']' )
+            // InternalEntityMockDSL.g:95:9: ']'
             {
-            match("*="); 
-
+            match(']'); 
 
             }
 
@@ -1971,10 +1970,10 @@
         try {
             int _type = T__98;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:96:7: ( '/=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:96:9: '/='
+            // InternalEntityMockDSL.g:96:7: ( '+=' )
+            // InternalEntityMockDSL.g:96:9: '+='
             {
-            match("/="); 
+            match("+="); 
 
 
             }
@@ -1992,10 +1991,10 @@
         try {
             int _type = T__99;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:97:7: ( '%=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:97:9: '%='
+            // InternalEntityMockDSL.g:97:7: ( '-=' )
+            // InternalEntityMockDSL.g:97:9: '-='
             {
-            match("%="); 
+            match("-="); 
 
 
             }
@@ -2013,10 +2012,11 @@
         try {
             int _type = T__100;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:98:8: ( '<' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:98:10: '<'
+            // InternalEntityMockDSL.g:98:8: ( '*=' )
+            // InternalEntityMockDSL.g:98:10: '*='
             {
-            match('<'); 
+            match("*="); 
+
 
             }
 
@@ -2033,10 +2033,11 @@
         try {
             int _type = T__101;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:99:8: ( '>' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:99:10: '>'
+            // InternalEntityMockDSL.g:99:8: ( '/=' )
+            // InternalEntityMockDSL.g:99:10: '/='
             {
-            match('>'); 
+            match("/="); 
+
 
             }
 
@@ -2053,10 +2054,10 @@
         try {
             int _type = T__102;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:100:8: ( '>=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:100:10: '>='
+            // InternalEntityMockDSL.g:100:8: ( '%=' )
+            // InternalEntityMockDSL.g:100:10: '%='
             {
-            match(">="); 
+            match("%="); 
 
 
             }
@@ -2074,11 +2075,10 @@
         try {
             int _type = T__103;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:101:8: ( '||' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:101:10: '||'
+            // InternalEntityMockDSL.g:101:8: ( '<' )
+            // InternalEntityMockDSL.g:101:10: '<'
             {
-            match("||"); 
-
+            match('<'); 
 
             }
 
@@ -2095,11 +2095,10 @@
         try {
             int _type = T__104;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:102:8: ( '&&' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:102:10: '&&'
+            // InternalEntityMockDSL.g:102:8: ( '>' )
+            // InternalEntityMockDSL.g:102:10: '>'
             {
-            match("&&"); 
-
+            match('>'); 
 
             }
 
@@ -2116,10 +2115,10 @@
         try {
             int _type = T__105;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:103:8: ( '==' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:103:10: '=='
+            // InternalEntityMockDSL.g:103:8: ( '>=' )
+            // InternalEntityMockDSL.g:103:10: '>='
             {
-            match("=="); 
+            match(">="); 
 
 
             }
@@ -2137,10 +2136,10 @@
         try {
             int _type = T__106;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:104:8: ( '!=' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:104:10: '!='
+            // InternalEntityMockDSL.g:104:8: ( '||' )
+            // InternalEntityMockDSL.g:104:10: '||'
             {
-            match("!="); 
+            match("||"); 
 
 
             }
@@ -2158,10 +2157,10 @@
         try {
             int _type = T__107;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:105:8: ( '===' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:105:10: '==='
+            // InternalEntityMockDSL.g:105:8: ( '&&' )
+            // InternalEntityMockDSL.g:105:10: '&&'
             {
-            match("==="); 
+            match("&&"); 
 
 
             }
@@ -2179,10 +2178,10 @@
         try {
             int _type = T__108;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:106:8: ( '!==' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:106:10: '!=='
+            // InternalEntityMockDSL.g:106:8: ( '==' )
+            // InternalEntityMockDSL.g:106:10: '=='
             {
-            match("!=="); 
+            match("=="); 
 
 
             }
@@ -2200,10 +2199,10 @@
         try {
             int _type = T__109;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:107:8: ( 'instanceof' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:107:10: 'instanceof'
+            // InternalEntityMockDSL.g:107:8: ( '!=' )
+            // InternalEntityMockDSL.g:107:10: '!='
             {
-            match("instanceof"); 
+            match("!="); 
 
 
             }
@@ -2221,10 +2220,10 @@
         try {
             int _type = T__110;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:108:8: ( '->' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:108:10: '->'
+            // InternalEntityMockDSL.g:108:8: ( '===' )
+            // InternalEntityMockDSL.g:108:10: '==='
             {
-            match("->"); 
+            match("==="); 
 
 
             }
@@ -2242,10 +2241,10 @@
         try {
             int _type = T__111;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:109:8: ( '..<' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:109:10: '..<'
+            // InternalEntityMockDSL.g:109:8: ( '!==' )
+            // InternalEntityMockDSL.g:109:10: '!=='
             {
-            match("..<"); 
+            match("!=="); 
 
 
             }
@@ -2263,10 +2262,10 @@
         try {
             int _type = T__112;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:110:8: ( '..' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:110:10: '..'
+            // InternalEntityMockDSL.g:110:8: ( 'instanceof' )
+            // InternalEntityMockDSL.g:110:10: 'instanceof'
             {
-            match(".."); 
+            match("instanceof"); 
 
 
             }
@@ -2284,10 +2283,10 @@
         try {
             int _type = T__113;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:111:8: ( '=>' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:111:10: '=>'
+            // InternalEntityMockDSL.g:111:8: ( '->' )
+            // InternalEntityMockDSL.g:111:10: '->'
             {
-            match("=>"); 
+            match("->"); 
 
 
             }
@@ -2305,10 +2304,10 @@
         try {
             int _type = T__114;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:112:8: ( '<>' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:112:10: '<>'
+            // InternalEntityMockDSL.g:112:8: ( '..<' )
+            // InternalEntityMockDSL.g:112:10: '..<'
             {
-            match("<>"); 
+            match("..<"); 
 
 
             }
@@ -2326,10 +2325,10 @@
         try {
             int _type = T__115;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:113:8: ( '?:' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:113:10: '?:'
+            // InternalEntityMockDSL.g:113:8: ( '..' )
+            // InternalEntityMockDSL.g:113:10: '..'
             {
-            match("?:"); 
+            match(".."); 
 
 
             }
@@ -2347,10 +2346,11 @@
         try {
             int _type = T__116;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:114:8: ( '+' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:114:10: '+'
+            // InternalEntityMockDSL.g:114:8: ( '=>' )
+            // InternalEntityMockDSL.g:114:10: '=>'
             {
-            match('+'); 
+            match("=>"); 
+
 
             }
 
@@ -2367,10 +2367,10 @@
         try {
             int _type = T__117;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:115:8: ( '**' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:115:10: '**'
+            // InternalEntityMockDSL.g:115:8: ( '<>' )
+            // InternalEntityMockDSL.g:115:10: '<>'
             {
-            match("**"); 
+            match("<>"); 
 
 
             }
@@ -2388,10 +2388,11 @@
         try {
             int _type = T__118;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:116:8: ( '/' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:116:10: '/'
+            // InternalEntityMockDSL.g:116:8: ( '?:' )
+            // InternalEntityMockDSL.g:116:10: '?:'
             {
-            match('/'); 
+            match("?:"); 
+
 
             }
 
@@ -2408,10 +2409,10 @@
         try {
             int _type = T__119;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:117:8: ( '%' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:117:10: '%'
+            // InternalEntityMockDSL.g:117:8: ( '+' )
+            // InternalEntityMockDSL.g:117:10: '+'
             {
-            match('%'); 
+            match('+'); 
 
             }
 
@@ -2428,10 +2429,11 @@
         try {
             int _type = T__120;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:118:8: ( '!' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:118:10: '!'
+            // InternalEntityMockDSL.g:118:8: ( '**' )
+            // InternalEntityMockDSL.g:118:10: '**'
             {
-            match('!'); 
+            match("**"); 
+
 
             }
 
@@ -2448,11 +2450,10 @@
         try {
             int _type = T__121;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:119:8: ( '++' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:119:10: '++'
+            // InternalEntityMockDSL.g:119:8: ( '/' )
+            // InternalEntityMockDSL.g:119:10: '/'
             {
-            match("++"); 
-
+            match('/'); 
 
             }
 
@@ -2469,11 +2470,10 @@
         try {
             int _type = T__122;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:120:8: ( '--' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:120:10: '--'
+            // InternalEntityMockDSL.g:120:8: ( '%' )
+            // InternalEntityMockDSL.g:120:10: '%'
             {
-            match("--"); 
-
+            match('%'); 
 
             }
 
@@ -2490,11 +2490,10 @@
         try {
             int _type = T__123;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:121:8: ( '::' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:121:10: '::'
+            // InternalEntityMockDSL.g:121:8: ( '!' )
+            // InternalEntityMockDSL.g:121:10: '!'
             {
-            match("::"); 
-
+            match('!'); 
 
             }
 
@@ -2511,10 +2510,10 @@
         try {
             int _type = T__124;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:122:8: ( '?.' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:122:10: '?.'
+            // InternalEntityMockDSL.g:122:8: ( '++' )
+            // InternalEntityMockDSL.g:122:10: '++'
             {
-            match("?."); 
+            match("++"); 
 
 
             }
@@ -2532,10 +2531,11 @@
         try {
             int _type = T__125;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:123:8: ( '|' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:123:10: '|'
+            // InternalEntityMockDSL.g:123:8: ( '--' )
+            // InternalEntityMockDSL.g:123:10: '--'
             {
-            match('|'); 
+            match("--"); 
+
 
             }
 
@@ -2552,10 +2552,11 @@
         try {
             int _type = T__126;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:124:8: ( ';' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:124:10: ';'
+            // InternalEntityMockDSL.g:124:8: ( '::' )
+            // InternalEntityMockDSL.g:124:10: '::'
             {
-            match(';'); 
+            match("::"); 
+
 
             }
 
@@ -2572,10 +2573,10 @@
         try {
             int _type = T__127;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:125:8: ( 'if' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:125:10: 'if'
+            // InternalEntityMockDSL.g:125:8: ( '?.' )
+            // InternalEntityMockDSL.g:125:10: '?.'
             {
-            match("if"); 
+            match("?."); 
 
 
             }
@@ -2593,11 +2594,10 @@
         try {
             int _type = T__128;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:126:8: ( 'else' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:126:10: 'else'
+            // InternalEntityMockDSL.g:126:8: ( '|' )
+            // InternalEntityMockDSL.g:126:10: '|'
             {
-            match("else"); 
-
+            match('|'); 
 
             }
 
@@ -2614,10 +2614,10 @@
         try {
             int _type = T__129;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:127:8: ( 'switch' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:127:10: 'switch'
+            // InternalEntityMockDSL.g:127:8: ( 'if' )
+            // InternalEntityMockDSL.g:127:10: 'if'
             {
-            match("switch"); 
+            match("if"); 
 
 
             }
@@ -2635,10 +2635,11 @@
         try {
             int _type = T__130;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:128:8: ( ':' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:128:10: ':'
+            // InternalEntityMockDSL.g:128:8: ( 'else' )
+            // InternalEntityMockDSL.g:128:10: 'else'
             {
-            match(':'); 
+            match("else"); 
+
 
             }
 
@@ -2655,10 +2656,10 @@
         try {
             int _type = T__131;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:129:8: ( 'default' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:129:10: 'default'
+            // InternalEntityMockDSL.g:129:8: ( 'switch' )
+            // InternalEntityMockDSL.g:129:10: 'switch'
             {
-            match("default"); 
+            match("switch"); 
 
 
             }
@@ -2676,11 +2677,10 @@
         try {
             int _type = T__132;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:130:8: ( 'case' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:130:10: 'case'
+            // InternalEntityMockDSL.g:130:8: ( ':' )
+            // InternalEntityMockDSL.g:130:10: ':'
             {
-            match("case"); 
-
+            match(':'); 
 
             }
 
@@ -2697,10 +2697,10 @@
         try {
             int _type = T__133;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:131:8: ( 'for' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:131:10: 'for'
+            // InternalEntityMockDSL.g:131:8: ( 'default' )
+            // InternalEntityMockDSL.g:131:10: 'default'
             {
-            match("for"); 
+            match("default"); 
 
 
             }
@@ -2718,10 +2718,10 @@
         try {
             int _type = T__134;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:132:8: ( 'while' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:132:10: 'while'
+            // InternalEntityMockDSL.g:132:8: ( 'case' )
+            // InternalEntityMockDSL.g:132:10: 'case'
             {
-            match("while"); 
+            match("case"); 
 
 
             }
@@ -2739,10 +2739,10 @@
         try {
             int _type = T__135;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:133:8: ( 'do' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:133:10: 'do'
+            // InternalEntityMockDSL.g:133:8: ( 'for' )
+            // InternalEntityMockDSL.g:133:10: 'for'
             {
-            match("do"); 
+            match("for"); 
 
 
             }
@@ -2760,10 +2760,10 @@
         try {
             int _type = T__136;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:134:8: ( 'val' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:134:10: 'val'
+            // InternalEntityMockDSL.g:134:8: ( 'while' )
+            // InternalEntityMockDSL.g:134:10: 'while'
             {
-            match("val"); 
+            match("while"); 
 
 
             }
@@ -2781,10 +2781,10 @@
         try {
             int _type = T__137;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:135:8: ( 'extends' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:135:10: 'extends'
+            // InternalEntityMockDSL.g:135:8: ( 'do' )
+            // InternalEntityMockDSL.g:135:10: 'do'
             {
-            match("extends"); 
+            match("do"); 
 
 
             }
@@ -2802,10 +2802,10 @@
         try {
             int _type = T__138;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:136:8: ( 'static' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:136:10: 'static'
+            // InternalEntityMockDSL.g:136:8: ( 'val' )
+            // InternalEntityMockDSL.g:136:10: 'val'
             {
-            match("static"); 
+            match("val"); 
 
 
             }
@@ -2823,10 +2823,10 @@
         try {
             int _type = T__139;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:137:8: ( 'extension' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:137:10: 'extension'
+            // InternalEntityMockDSL.g:137:8: ( 'extends' )
+            // InternalEntityMockDSL.g:137:10: 'extends'
             {
-            match("extension"); 
+            match("extends"); 
 
 
             }
@@ -2844,8 +2844,8 @@
         try {
             int _type = T__140;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:138:8: ( 'super' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:138:10: 'super'
+            // InternalEntityMockDSL.g:138:8: ( 'super' )
+            // InternalEntityMockDSL.g:138:10: 'super'
             {
             match("super"); 
 
@@ -2865,8 +2865,8 @@
         try {
             int _type = T__141;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:139:8: ( 'new' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:139:10: 'new'
+            // InternalEntityMockDSL.g:139:8: ( 'new' )
+            // InternalEntityMockDSL.g:139:10: 'new'
             {
             match("new"); 
 
@@ -2886,8 +2886,8 @@
         try {
             int _type = T__142;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:140:8: ( 'false' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:140:10: 'false'
+            // InternalEntityMockDSL.g:140:8: ( 'false' )
+            // InternalEntityMockDSL.g:140:10: 'false'
             {
             match("false"); 
 
@@ -2907,8 +2907,8 @@
         try {
             int _type = T__143;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:141:8: ( 'true' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:141:10: 'true'
+            // InternalEntityMockDSL.g:141:8: ( 'true' )
+            // InternalEntityMockDSL.g:141:10: 'true'
             {
             match("true"); 
 
@@ -2928,8 +2928,8 @@
         try {
             int _type = T__144;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:142:8: ( 'null' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:142:10: 'null'
+            // InternalEntityMockDSL.g:142:8: ( 'null' )
+            // InternalEntityMockDSL.g:142:10: 'null'
             {
             match("null"); 
 
@@ -2949,8 +2949,8 @@
         try {
             int _type = T__145;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:143:8: ( 'typeof' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:143:10: 'typeof'
+            // InternalEntityMockDSL.g:143:8: ( 'typeof' )
+            // InternalEntityMockDSL.g:143:10: 'typeof'
             {
             match("typeof"); 
 
@@ -2970,8 +2970,8 @@
         try {
             int _type = T__146;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:144:8: ( 'throw' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:144:10: 'throw'
+            // InternalEntityMockDSL.g:144:8: ( 'throw' )
+            // InternalEntityMockDSL.g:144:10: 'throw'
             {
             match("throw"); 
 
@@ -2991,8 +2991,8 @@
         try {
             int _type = T__147;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:145:8: ( 'return' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:145:10: 'return'
+            // InternalEntityMockDSL.g:145:8: ( 'return' )
+            // InternalEntityMockDSL.g:145:10: 'return'
             {
             match("return"); 
 
@@ -3012,8 +3012,8 @@
         try {
             int _type = T__148;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:146:8: ( 'try' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:146:10: 'try'
+            // InternalEntityMockDSL.g:146:8: ( 'try' )
+            // InternalEntityMockDSL.g:146:10: 'try'
             {
             match("try"); 
 
@@ -3033,8 +3033,8 @@
         try {
             int _type = T__149;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:147:8: ( 'finally' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:147:10: 'finally'
+            // InternalEntityMockDSL.g:147:8: ( 'finally' )
+            // InternalEntityMockDSL.g:147:10: 'finally'
             {
             match("finally"); 
 
@@ -3054,8 +3054,8 @@
         try {
             int _type = T__150;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:148:8: ( 'synchronized' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:148:10: 'synchronized'
+            // InternalEntityMockDSL.g:148:8: ( 'synchronized' )
+            // InternalEntityMockDSL.g:148:10: 'synchronized'
             {
             match("synchronized"); 
 
@@ -3075,8 +3075,8 @@
         try {
             int _type = T__151;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:149:8: ( 'catch' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:149:10: 'catch'
+            // InternalEntityMockDSL.g:149:8: ( 'catch' )
+            // InternalEntityMockDSL.g:149:10: 'catch'
             {
             match("catch"); 
 
@@ -3096,8 +3096,8 @@
         try {
             int _type = T__152;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:150:8: ( '?' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:150:10: '?'
+            // InternalEntityMockDSL.g:150:8: ( '?' )
+            // InternalEntityMockDSL.g:150:10: '?'
             {
             match('?'); 
 
@@ -3116,8 +3116,8 @@
         try {
             int _type = T__153;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:151:8: ( '&' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:151:10: '&'
+            // InternalEntityMockDSL.g:151:8: ( '&' )
+            // InternalEntityMockDSL.g:151:10: '&'
             {
             match('&'); 
 
@@ -3136,8 +3136,8 @@
         try {
             int _type = T__154;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:152:8: ( 'days' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:152:10: 'days'
+            // InternalEntityMockDSL.g:152:8: ( 'days' )
+            // InternalEntityMockDSL.g:152:10: 'days'
             {
             match("days"); 
 
@@ -3157,8 +3157,8 @@
         try {
             int _type = T__155;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:153:8: ( 'weeks' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:153:10: 'weeks'
+            // InternalEntityMockDSL.g:153:8: ( 'weeks' )
+            // InternalEntityMockDSL.g:153:10: 'weeks'
             {
             match("weeks"); 
 
@@ -3178,8 +3178,8 @@
         try {
             int _type = T__156;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:154:8: ( 'months' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:154:10: 'months'
+            // InternalEntityMockDSL.g:154:8: ( 'months' )
+            // InternalEntityMockDSL.g:154:10: 'months'
             {
             match("months"); 
 
@@ -3194,122 +3194,43 @@
     }
     // $ANTLR end "T__156"
 
-    // $ANTLR start "RULE_ID"
-    public final void mRULE_ID() throws RecognitionException {
-        try {
-            int _type = RULE_ID;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11077:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11077:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11077:11: ( '^' )?
-            int alt1=2;
-            int LA1_0 = input.LA(1);
-
-            if ( (LA1_0=='^') ) {
-                alt1=1;
-            }
-            switch (alt1) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11077:11: '^'
-                    {
-                    match('^'); 
-
-                    }
-                    break;
-
-            }
-
-            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-                input.consume();
-
-            }
-            else {
-                MismatchedSetException mse = new MismatchedSetException(null,input);
-                recover(mse);
-                throw mse;}
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11077:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
-            loop2:
-            do {
-                int alt2=2;
-                int LA2_0 = input.LA(1);
-
-                if ( (LA2_0=='$'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
-                    alt2=1;
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:
-            	    {
-            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
-            	        input.consume();
-
-            	    }
-            	    else {
-            	        MismatchedSetException mse = new MismatchedSetException(null,input);
-            	        recover(mse);
-            	        throw mse;}
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop2;
-                }
-            } while (true);
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "RULE_ID"
-
     // $ANTLR start "RULE_HEX"
     public final void mRULE_HEX() throws RecognitionException {
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalEntityMockDSL.g:11621:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalEntityMockDSL.g:11621:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:12: ( '0x' | '0X' )
-            int alt3=2;
-            int LA3_0 = input.LA(1);
+            // InternalEntityMockDSL.g:11621:12: ( '0x' | '0X' )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
 
-            if ( (LA3_0=='0') ) {
-                int LA3_1 = input.LA(2);
+            if ( (LA1_0=='0') ) {
+                int LA1_1 = input.LA(2);
 
-                if ( (LA3_1=='x') ) {
-                    alt3=1;
+                if ( (LA1_1=='x') ) {
+                    alt1=1;
                 }
-                else if ( (LA3_1=='X') ) {
-                    alt3=2;
+                else if ( (LA1_1=='X') ) {
+                    alt1=2;
                 }
                 else {
                     NoViableAltException nvae =
-                        new NoViableAltException("", 3, 1, input);
+                        new NoViableAltException("", 1, 1, input);
 
                     throw nvae;
                 }
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("", 3, 0, input);
+                    new NoViableAltException("", 1, 0, input);
 
                 throw nvae;
             }
-            switch (alt3) {
+            switch (alt1) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:13: '0x'
+                    // InternalEntityMockDSL.g:11621:13: '0x'
                     {
                     match("0x"); 
 
@@ -3317,7 +3238,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:18: '0X'
+                    // InternalEntityMockDSL.g:11621:18: '0X'
                     {
                     match("0X"); 
 
@@ -3327,21 +3248,21 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
-            int cnt4=0;
-            loop4:
+            // InternalEntityMockDSL.g:11621:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            int cnt2=0;
+            loop2:
             do {
-                int alt4=2;
-                int LA4_0 = input.LA(1);
+                int alt2=2;
+                int LA2_0 = input.LA(1);
 
-                if ( ((LA4_0>='0' && LA4_0<='9')||(LA4_0>='A' && LA4_0<='F')||LA4_0=='_'||(LA4_0>='a' && LA4_0<='f')) ) {
-                    alt4=1;
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='F')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='f')) ) {
+                    alt2=1;
                 }
 
 
-                switch (alt4) {
+                switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:
+            	    // InternalEntityMockDSL.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='f') ) {
             	        input.consume();
@@ -3357,45 +3278,45 @@
             	    break;
 
             	default :
-            	    if ( cnt4 >= 1 ) break loop4;
+            	    if ( cnt2 >= 1 ) break loop2;
                         EarlyExitException eee =
-                            new EarlyExitException(4, input);
+                            new EarlyExitException(2, input);
                         throw eee;
                 }
-                cnt4++;
+                cnt2++;
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
-            int alt6=2;
-            int LA6_0 = input.LA(1);
+            // InternalEntityMockDSL.g:11621:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
 
-            if ( (LA6_0=='#') ) {
-                alt6=1;
+            if ( (LA4_0=='#') ) {
+                alt4=1;
             }
-            switch (alt6) {
+            switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalEntityMockDSL.g:11621:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
-                    int alt5=2;
-                    int LA5_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:11621:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    int alt3=2;
+                    int LA3_0 = input.LA(1);
 
-                    if ( (LA5_0=='B'||LA5_0=='b') ) {
-                        alt5=1;
+                    if ( (LA3_0=='B'||LA3_0=='b') ) {
+                        alt3=1;
                     }
-                    else if ( (LA5_0=='L'||LA5_0=='l') ) {
-                        alt5=2;
+                    else if ( (LA3_0=='L'||LA3_0=='l') ) {
+                        alt3=2;
                     }
                     else {
                         NoViableAltException nvae =
-                            new NoViableAltException("", 5, 0, input);
+                            new NoViableAltException("", 3, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt5) {
+                    switch (alt3) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalEntityMockDSL.g:11621:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -3419,7 +3340,7 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11079:84: ( 'l' | 'L' )
+                            // InternalEntityMockDSL.g:11621:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -3458,24 +3379,24 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11081:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11081:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalEntityMockDSL.g:11623:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalEntityMockDSL.g:11623:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11081:21: ( '0' .. '9' | '_' )*
-            loop7:
+            // InternalEntityMockDSL.g:11623:21: ( '0' .. '9' | '_' )*
+            loop5:
             do {
-                int alt7=2;
-                int LA7_0 = input.LA(1);
+                int alt5=2;
+                int LA5_0 = input.LA(1);
 
-                if ( ((LA7_0>='0' && LA7_0<='9')||LA7_0=='_') ) {
-                    alt7=1;
+                if ( ((LA5_0>='0' && LA5_0<='9')||LA5_0=='_') ) {
+                    alt5=1;
                 }
 
 
-                switch (alt7) {
+                switch (alt5) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:
+            	    // InternalEntityMockDSL.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
             	        input.consume();
@@ -3491,7 +3412,7 @@
             	    break;
 
             	default :
-            	    break loop7;
+            	    break loop5;
                 }
             } while (true);
 
@@ -3511,20 +3432,20 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalEntityMockDSL.g:11625:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalEntityMockDSL.g:11625:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
-            int alt9=2;
-            int LA9_0 = input.LA(1);
+            // InternalEntityMockDSL.g:11625:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
 
-            if ( (LA9_0=='E'||LA9_0=='e') ) {
-                alt9=1;
+            if ( (LA7_0=='E'||LA7_0=='e') ) {
+                alt7=1;
             }
-            switch (alt9) {
+            switch (alt7) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalEntityMockDSL.g:11625:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -3535,16 +3456,16 @@
                         recover(mse);
                         throw mse;}
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:36: ( '+' | '-' )?
-                    int alt8=2;
-                    int LA8_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:11625:36: ( '+' | '-' )?
+                    int alt6=2;
+                    int LA6_0 = input.LA(1);
 
-                    if ( (LA8_0=='+'||LA8_0=='-') ) {
-                        alt8=1;
+                    if ( (LA6_0=='+'||LA6_0=='-') ) {
+                        alt6=1;
                     }
-                    switch (alt8) {
+                    switch (alt6) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:
+                            // InternalEntityMockDSL.g:
                             {
                             if ( input.LA(1)=='+'||input.LA(1)=='-' ) {
                                 input.consume();
@@ -3568,19 +3489,19 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
-            int alt10=3;
-            int LA10_0 = input.LA(1);
+            // InternalEntityMockDSL.g:11625:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            int alt8=3;
+            int LA8_0 = input.LA(1);
 
-            if ( (LA10_0=='B'||LA10_0=='b') ) {
-                alt10=1;
+            if ( (LA8_0=='B'||LA8_0=='b') ) {
+                alt8=1;
             }
-            else if ( (LA10_0=='D'||LA10_0=='F'||LA10_0=='L'||LA10_0=='d'||LA10_0=='f'||LA10_0=='l') ) {
-                alt10=2;
+            else if ( (LA8_0=='D'||LA8_0=='F'||LA8_0=='L'||LA8_0=='d'||LA8_0=='f'||LA8_0=='l') ) {
+                alt8=2;
             }
-            switch (alt10) {
+            switch (alt8) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalEntityMockDSL.g:11625:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -3604,7 +3525,7 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11083:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalEntityMockDSL.g:11625:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
                     {
                     if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
                         input.consume();
@@ -3632,15 +3553,94 @@
     }
     // $ANTLR end "RULE_DECIMAL"
 
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalEntityMockDSL.g:11627:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalEntityMockDSL.g:11627:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // InternalEntityMockDSL.g:11627:11: ( '^' )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0=='^') ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalEntityMockDSL.g:11627:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalEntityMockDSL.g:11627:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( (LA10_0=='$'||(LA10_0>='0' && LA10_0<='9')||(LA10_0>='A' && LA10_0<='Z')||LA10_0=='_'||(LA10_0>='a' && LA10_0<='z')) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop10;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
     // $ANTLR start "RULE_STRING"
     public final void mRULE_STRING() throws RecognitionException {
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalEntityMockDSL.g:11629:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalEntityMockDSL.g:11629:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalEntityMockDSL.g:11629:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -3658,10 +3658,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalEntityMockDSL.g:11629:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalEntityMockDSL.g:11629:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -3677,7 +3677,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:21: '\\\\' .
+                    	    // InternalEntityMockDSL.g:11629:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3685,7 +3685,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalEntityMockDSL.g:11629:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3705,7 +3705,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:44: ( '\"' )?
+                    // InternalEntityMockDSL.g:11629:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -3714,7 +3714,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:44: '\"'
+                            // InternalEntityMockDSL.g:11629:44: '\"'
                             {
                             match('\"'); 
 
@@ -3727,10 +3727,10 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalEntityMockDSL.g:11629:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalEntityMockDSL.g:11629:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -3746,7 +3746,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:55: '\\\\' .
+                    	    // InternalEntityMockDSL.g:11629:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3754,7 +3754,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalEntityMockDSL.g:11629:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3774,7 +3774,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:79: ( '\\'' )?
+                    // InternalEntityMockDSL.g:11629:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -3783,7 +3783,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11085:79: '\\''
+                            // InternalEntityMockDSL.g:11629:79: '\\''
                             {
                             match('\''); 
 
@@ -3814,12 +3814,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11087:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11087:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalEntityMockDSL.g:11631:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalEntityMockDSL.g:11631:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11087:24: ( options {greedy=false; } : . )*
+            // InternalEntityMockDSL.g:11631:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -3844,7 +3844,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11087:52: .
+            	    // InternalEntityMockDSL.g:11631:52: .
             	    {
             	    matchAny(); 
 
@@ -3874,12 +3874,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalEntityMockDSL.g:11633:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalEntityMockDSL.g:11633:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalEntityMockDSL.g:11633:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -3892,7 +3892,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalEntityMockDSL.g:11633:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3912,7 +3912,7 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:40: ( ( '\\r' )? '\\n' )?
+            // InternalEntityMockDSL.g:11633:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -3921,9 +3921,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:41: ( '\\r' )? '\\n'
+                    // InternalEntityMockDSL.g:11633:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:41: ( '\\r' )?
+                    // InternalEntityMockDSL.g:11633:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -3932,7 +3932,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11089:41: '\\r'
+                            // InternalEntityMockDSL.g:11633:41: '\\r'
                             {
                             match('\r'); 
 
@@ -3964,10 +3964,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11091:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11091:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEntityMockDSL.g:11635:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalEntityMockDSL.g:11635:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11091:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEntityMockDSL.g:11635:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -3981,7 +3981,7 @@
 
                 switch (alt20) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:
+            	    // InternalEntityMockDSL.g:
             	    {
             	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
             	        input.consume();
@@ -4021,8 +4021,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11093:16: ( . )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:11093:18: .
+            // InternalEntityMockDSL.g:11637:16: ( . )
+            // InternalEntityMockDSL.g:11637:18: .
             {
             matchAny(); 
 
@@ -4037,1076 +4037,1076 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        // InternalEntityMockDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
         int alt21=153;
         alt21 = dfa21.predict(input);
         switch (alt21) {
             case 1 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:10: T__13
+                // InternalEntityMockDSL.g:1:10: T__13
                 {
                 mT__13(); 
 
                 }
                 break;
             case 2 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:16: T__14
+                // InternalEntityMockDSL.g:1:16: T__14
                 {
                 mT__14(); 
 
                 }
                 break;
             case 3 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:22: T__15
+                // InternalEntityMockDSL.g:1:22: T__15
                 {
                 mT__15(); 
 
                 }
                 break;
             case 4 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:28: T__16
+                // InternalEntityMockDSL.g:1:28: T__16
                 {
                 mT__16(); 
 
                 }
                 break;
             case 5 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:34: T__17
+                // InternalEntityMockDSL.g:1:34: T__17
                 {
                 mT__17(); 
 
                 }
                 break;
             case 6 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:40: T__18
+                // InternalEntityMockDSL.g:1:40: T__18
                 {
                 mT__18(); 
 
                 }
                 break;
             case 7 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:46: T__19
+                // InternalEntityMockDSL.g:1:46: T__19
                 {
                 mT__19(); 
 
                 }
                 break;
             case 8 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:52: T__20
+                // InternalEntityMockDSL.g:1:52: T__20
                 {
                 mT__20(); 
 
                 }
                 break;
             case 9 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:58: T__21
+                // InternalEntityMockDSL.g:1:58: T__21
                 {
                 mT__21(); 
 
                 }
                 break;
             case 10 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:64: T__22
+                // InternalEntityMockDSL.g:1:64: T__22
                 {
                 mT__22(); 
 
                 }
                 break;
             case 11 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:70: T__23
+                // InternalEntityMockDSL.g:1:70: T__23
                 {
                 mT__23(); 
 
                 }
                 break;
             case 12 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:76: T__24
+                // InternalEntityMockDSL.g:1:76: T__24
                 {
                 mT__24(); 
 
                 }
                 break;
             case 13 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:82: T__25
+                // InternalEntityMockDSL.g:1:82: T__25
                 {
                 mT__25(); 
 
                 }
                 break;
             case 14 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:88: T__26
+                // InternalEntityMockDSL.g:1:88: T__26
                 {
                 mT__26(); 
 
                 }
                 break;
             case 15 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:94: T__27
+                // InternalEntityMockDSL.g:1:94: T__27
                 {
                 mT__27(); 
 
                 }
                 break;
             case 16 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:100: T__28
+                // InternalEntityMockDSL.g:1:100: T__28
                 {
                 mT__28(); 
 
                 }
                 break;
             case 17 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:106: T__29
+                // InternalEntityMockDSL.g:1:106: T__29
                 {
                 mT__29(); 
 
                 }
                 break;
             case 18 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:112: T__30
+                // InternalEntityMockDSL.g:1:112: T__30
                 {
                 mT__30(); 
 
                 }
                 break;
             case 19 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:118: T__31
+                // InternalEntityMockDSL.g:1:118: T__31
                 {
                 mT__31(); 
 
                 }
                 break;
             case 20 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:124: T__32
+                // InternalEntityMockDSL.g:1:124: T__32
                 {
                 mT__32(); 
 
                 }
                 break;
             case 21 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:130: T__33
+                // InternalEntityMockDSL.g:1:130: T__33
                 {
                 mT__33(); 
 
                 }
                 break;
             case 22 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:136: T__34
+                // InternalEntityMockDSL.g:1:136: T__34
                 {
                 mT__34(); 
 
                 }
                 break;
             case 23 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:142: T__35
+                // InternalEntityMockDSL.g:1:142: T__35
                 {
                 mT__35(); 
 
                 }
                 break;
             case 24 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:148: T__36
+                // InternalEntityMockDSL.g:1:148: T__36
                 {
                 mT__36(); 
 
                 }
                 break;
             case 25 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:154: T__37
+                // InternalEntityMockDSL.g:1:154: T__37
                 {
                 mT__37(); 
 
                 }
                 break;
             case 26 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:160: T__38
+                // InternalEntityMockDSL.g:1:160: T__38
                 {
                 mT__38(); 
 
                 }
                 break;
             case 27 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:166: T__39
+                // InternalEntityMockDSL.g:1:166: T__39
                 {
                 mT__39(); 
 
                 }
                 break;
             case 28 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:172: T__40
+                // InternalEntityMockDSL.g:1:172: T__40
                 {
                 mT__40(); 
 
                 }
                 break;
             case 29 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:178: T__41
+                // InternalEntityMockDSL.g:1:178: T__41
                 {
                 mT__41(); 
 
                 }
                 break;
             case 30 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:184: T__42
+                // InternalEntityMockDSL.g:1:184: T__42
                 {
                 mT__42(); 
 
                 }
                 break;
             case 31 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:190: T__43
+                // InternalEntityMockDSL.g:1:190: T__43
                 {
                 mT__43(); 
 
                 }
                 break;
             case 32 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:196: T__44
+                // InternalEntityMockDSL.g:1:196: T__44
                 {
                 mT__44(); 
 
                 }
                 break;
             case 33 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:202: T__45
+                // InternalEntityMockDSL.g:1:202: T__45
                 {
                 mT__45(); 
 
                 }
                 break;
             case 34 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:208: T__46
+                // InternalEntityMockDSL.g:1:208: T__46
                 {
                 mT__46(); 
 
                 }
                 break;
             case 35 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:214: T__47
+                // InternalEntityMockDSL.g:1:214: T__47
                 {
                 mT__47(); 
 
                 }
                 break;
             case 36 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:220: T__48
+                // InternalEntityMockDSL.g:1:220: T__48
                 {
                 mT__48(); 
 
                 }
                 break;
             case 37 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:226: T__49
+                // InternalEntityMockDSL.g:1:226: T__49
                 {
                 mT__49(); 
 
                 }
                 break;
             case 38 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:232: T__50
+                // InternalEntityMockDSL.g:1:232: T__50
                 {
                 mT__50(); 
 
                 }
                 break;
             case 39 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:238: T__51
+                // InternalEntityMockDSL.g:1:238: T__51
                 {
                 mT__51(); 
 
                 }
                 break;
             case 40 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:244: T__52
+                // InternalEntityMockDSL.g:1:244: T__52
                 {
                 mT__52(); 
 
                 }
                 break;
             case 41 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:250: T__53
+                // InternalEntityMockDSL.g:1:250: T__53
                 {
                 mT__53(); 
 
                 }
                 break;
             case 42 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:256: T__54
+                // InternalEntityMockDSL.g:1:256: T__54
                 {
                 mT__54(); 
 
                 }
                 break;
             case 43 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:262: T__55
+                // InternalEntityMockDSL.g:1:262: T__55
                 {
                 mT__55(); 
 
                 }
                 break;
             case 44 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:268: T__56
+                // InternalEntityMockDSL.g:1:268: T__56
                 {
                 mT__56(); 
 
                 }
                 break;
             case 45 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:274: T__57
+                // InternalEntityMockDSL.g:1:274: T__57
                 {
                 mT__57(); 
 
                 }
                 break;
             case 46 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:280: T__58
+                // InternalEntityMockDSL.g:1:280: T__58
                 {
                 mT__58(); 
 
                 }
                 break;
             case 47 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:286: T__59
+                // InternalEntityMockDSL.g:1:286: T__59
                 {
                 mT__59(); 
 
                 }
                 break;
             case 48 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:292: T__60
+                // InternalEntityMockDSL.g:1:292: T__60
                 {
                 mT__60(); 
 
                 }
                 break;
             case 49 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:298: T__61
+                // InternalEntityMockDSL.g:1:298: T__61
                 {
                 mT__61(); 
 
                 }
                 break;
             case 50 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:304: T__62
+                // InternalEntityMockDSL.g:1:304: T__62
                 {
                 mT__62(); 
 
                 }
                 break;
             case 51 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:310: T__63
+                // InternalEntityMockDSL.g:1:310: T__63
                 {
                 mT__63(); 
 
                 }
                 break;
             case 52 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:316: T__64
+                // InternalEntityMockDSL.g:1:316: T__64
                 {
                 mT__64(); 
 
                 }
                 break;
             case 53 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:322: T__65
+                // InternalEntityMockDSL.g:1:322: T__65
                 {
                 mT__65(); 
 
                 }
                 break;
             case 54 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:328: T__66
+                // InternalEntityMockDSL.g:1:328: T__66
                 {
                 mT__66(); 
 
                 }
                 break;
             case 55 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:334: T__67
+                // InternalEntityMockDSL.g:1:334: T__67
                 {
                 mT__67(); 
 
                 }
                 break;
             case 56 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:340: T__68
+                // InternalEntityMockDSL.g:1:340: T__68
                 {
                 mT__68(); 
 
                 }
                 break;
             case 57 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:346: T__69
+                // InternalEntityMockDSL.g:1:346: T__69
                 {
                 mT__69(); 
 
                 }
                 break;
             case 58 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:352: T__70
+                // InternalEntityMockDSL.g:1:352: T__70
                 {
                 mT__70(); 
 
                 }
                 break;
             case 59 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:358: T__71
+                // InternalEntityMockDSL.g:1:358: T__71
                 {
                 mT__71(); 
 
                 }
                 break;
             case 60 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:364: T__72
+                // InternalEntityMockDSL.g:1:364: T__72
                 {
                 mT__72(); 
 
                 }
                 break;
             case 61 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:370: T__73
+                // InternalEntityMockDSL.g:1:370: T__73
                 {
                 mT__73(); 
 
                 }
                 break;
             case 62 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:376: T__74
+                // InternalEntityMockDSL.g:1:376: T__74
                 {
                 mT__74(); 
 
                 }
                 break;
             case 63 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:382: T__75
+                // InternalEntityMockDSL.g:1:382: T__75
                 {
                 mT__75(); 
 
                 }
                 break;
             case 64 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:388: T__76
+                // InternalEntityMockDSL.g:1:388: T__76
                 {
                 mT__76(); 
 
                 }
                 break;
             case 65 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:394: T__77
+                // InternalEntityMockDSL.g:1:394: T__77
                 {
                 mT__77(); 
 
                 }
                 break;
             case 66 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:400: T__78
+                // InternalEntityMockDSL.g:1:400: T__78
                 {
                 mT__78(); 
 
                 }
                 break;
             case 67 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:406: T__79
+                // InternalEntityMockDSL.g:1:406: T__79
                 {
                 mT__79(); 
 
                 }
                 break;
             case 68 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:412: T__80
+                // InternalEntityMockDSL.g:1:412: T__80
                 {
                 mT__80(); 
 
                 }
                 break;
             case 69 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:418: T__81
+                // InternalEntityMockDSL.g:1:418: T__81
                 {
                 mT__81(); 
 
                 }
                 break;
             case 70 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:424: T__82
+                // InternalEntityMockDSL.g:1:424: T__82
                 {
                 mT__82(); 
 
                 }
                 break;
             case 71 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:430: T__83
+                // InternalEntityMockDSL.g:1:430: T__83
                 {
                 mT__83(); 
 
                 }
                 break;
             case 72 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:436: T__84
+                // InternalEntityMockDSL.g:1:436: T__84
                 {
                 mT__84(); 
 
                 }
                 break;
             case 73 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:442: T__85
+                // InternalEntityMockDSL.g:1:442: T__85
                 {
                 mT__85(); 
 
                 }
                 break;
             case 74 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:448: T__86
+                // InternalEntityMockDSL.g:1:448: T__86
                 {
                 mT__86(); 
 
                 }
                 break;
             case 75 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:454: T__87
+                // InternalEntityMockDSL.g:1:454: T__87
                 {
                 mT__87(); 
 
                 }
                 break;
             case 76 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:460: T__88
+                // InternalEntityMockDSL.g:1:460: T__88
                 {
                 mT__88(); 
 
                 }
                 break;
             case 77 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:466: T__89
+                // InternalEntityMockDSL.g:1:466: T__89
                 {
                 mT__89(); 
 
                 }
                 break;
             case 78 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:472: T__90
+                // InternalEntityMockDSL.g:1:472: T__90
                 {
                 mT__90(); 
 
                 }
                 break;
             case 79 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:478: T__91
+                // InternalEntityMockDSL.g:1:478: T__91
                 {
                 mT__91(); 
 
                 }
                 break;
             case 80 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:484: T__92
+                // InternalEntityMockDSL.g:1:484: T__92
                 {
                 mT__92(); 
 
                 }
                 break;
             case 81 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:490: T__93
+                // InternalEntityMockDSL.g:1:490: T__93
                 {
                 mT__93(); 
 
                 }
                 break;
             case 82 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:496: T__94
+                // InternalEntityMockDSL.g:1:496: T__94
                 {
                 mT__94(); 
 
                 }
                 break;
             case 83 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:502: T__95
+                // InternalEntityMockDSL.g:1:502: T__95
                 {
                 mT__95(); 
 
                 }
                 break;
             case 84 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:508: T__96
+                // InternalEntityMockDSL.g:1:508: T__96
                 {
                 mT__96(); 
 
                 }
                 break;
             case 85 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:514: T__97
+                // InternalEntityMockDSL.g:1:514: T__97
                 {
                 mT__97(); 
 
                 }
                 break;
             case 86 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:520: T__98
+                // InternalEntityMockDSL.g:1:520: T__98
                 {
                 mT__98(); 
 
                 }
                 break;
             case 87 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:526: T__99
+                // InternalEntityMockDSL.g:1:526: T__99
                 {
                 mT__99(); 
 
                 }
                 break;
             case 88 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:532: T__100
+                // InternalEntityMockDSL.g:1:532: T__100
                 {
                 mT__100(); 
 
                 }
                 break;
             case 89 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:539: T__101
+                // InternalEntityMockDSL.g:1:539: T__101
                 {
                 mT__101(); 
 
                 }
                 break;
             case 90 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:546: T__102
+                // InternalEntityMockDSL.g:1:546: T__102
                 {
                 mT__102(); 
 
                 }
                 break;
             case 91 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:553: T__103
+                // InternalEntityMockDSL.g:1:553: T__103
                 {
                 mT__103(); 
 
                 }
                 break;
             case 92 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:560: T__104
+                // InternalEntityMockDSL.g:1:560: T__104
                 {
                 mT__104(); 
 
                 }
                 break;
             case 93 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:567: T__105
+                // InternalEntityMockDSL.g:1:567: T__105
                 {
                 mT__105(); 
 
                 }
                 break;
             case 94 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:574: T__106
+                // InternalEntityMockDSL.g:1:574: T__106
                 {
                 mT__106(); 
 
                 }
                 break;
             case 95 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:581: T__107
+                // InternalEntityMockDSL.g:1:581: T__107
                 {
                 mT__107(); 
 
                 }
                 break;
             case 96 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:588: T__108
+                // InternalEntityMockDSL.g:1:588: T__108
                 {
                 mT__108(); 
 
                 }
                 break;
             case 97 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:595: T__109
+                // InternalEntityMockDSL.g:1:595: T__109
                 {
                 mT__109(); 
 
                 }
                 break;
             case 98 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:602: T__110
+                // InternalEntityMockDSL.g:1:602: T__110
                 {
                 mT__110(); 
 
                 }
                 break;
             case 99 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:609: T__111
+                // InternalEntityMockDSL.g:1:609: T__111
                 {
                 mT__111(); 
 
                 }
                 break;
             case 100 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:616: T__112
+                // InternalEntityMockDSL.g:1:616: T__112
                 {
                 mT__112(); 
 
                 }
                 break;
             case 101 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:623: T__113
+                // InternalEntityMockDSL.g:1:623: T__113
                 {
                 mT__113(); 
 
                 }
                 break;
             case 102 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:630: T__114
+                // InternalEntityMockDSL.g:1:630: T__114
                 {
                 mT__114(); 
 
                 }
                 break;
             case 103 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:637: T__115
+                // InternalEntityMockDSL.g:1:637: T__115
                 {
                 mT__115(); 
 
                 }
                 break;
             case 104 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:644: T__116
+                // InternalEntityMockDSL.g:1:644: T__116
                 {
                 mT__116(); 
 
                 }
                 break;
             case 105 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:651: T__117
+                // InternalEntityMockDSL.g:1:651: T__117
                 {
                 mT__117(); 
 
                 }
                 break;
             case 106 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:658: T__118
+                // InternalEntityMockDSL.g:1:658: T__118
                 {
                 mT__118(); 
 
                 }
                 break;
             case 107 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:665: T__119
+                // InternalEntityMockDSL.g:1:665: T__119
                 {
                 mT__119(); 
 
                 }
                 break;
             case 108 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:672: T__120
+                // InternalEntityMockDSL.g:1:672: T__120
                 {
                 mT__120(); 
 
                 }
                 break;
             case 109 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:679: T__121
+                // InternalEntityMockDSL.g:1:679: T__121
                 {
                 mT__121(); 
 
                 }
                 break;
             case 110 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:686: T__122
+                // InternalEntityMockDSL.g:1:686: T__122
                 {
                 mT__122(); 
 
                 }
                 break;
             case 111 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:693: T__123
+                // InternalEntityMockDSL.g:1:693: T__123
                 {
                 mT__123(); 
 
                 }
                 break;
             case 112 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:700: T__124
+                // InternalEntityMockDSL.g:1:700: T__124
                 {
                 mT__124(); 
 
                 }
                 break;
             case 113 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:707: T__125
+                // InternalEntityMockDSL.g:1:707: T__125
                 {
                 mT__125(); 
 
                 }
                 break;
             case 114 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:714: T__126
+                // InternalEntityMockDSL.g:1:714: T__126
                 {
                 mT__126(); 
 
                 }
                 break;
             case 115 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:721: T__127
+                // InternalEntityMockDSL.g:1:721: T__127
                 {
                 mT__127(); 
 
                 }
                 break;
             case 116 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:728: T__128
+                // InternalEntityMockDSL.g:1:728: T__128
                 {
                 mT__128(); 
 
                 }
                 break;
             case 117 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:735: T__129
+                // InternalEntityMockDSL.g:1:735: T__129
                 {
                 mT__129(); 
 
                 }
                 break;
             case 118 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:742: T__130
+                // InternalEntityMockDSL.g:1:742: T__130
                 {
                 mT__130(); 
 
                 }
                 break;
             case 119 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:749: T__131
+                // InternalEntityMockDSL.g:1:749: T__131
                 {
                 mT__131(); 
 
                 }
                 break;
             case 120 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:756: T__132
+                // InternalEntityMockDSL.g:1:756: T__132
                 {
                 mT__132(); 
 
                 }
                 break;
             case 121 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:763: T__133
+                // InternalEntityMockDSL.g:1:763: T__133
                 {
                 mT__133(); 
 
                 }
                 break;
             case 122 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:770: T__134
+                // InternalEntityMockDSL.g:1:770: T__134
                 {
                 mT__134(); 
 
                 }
                 break;
             case 123 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:777: T__135
+                // InternalEntityMockDSL.g:1:777: T__135
                 {
                 mT__135(); 
 
                 }
                 break;
             case 124 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:784: T__136
+                // InternalEntityMockDSL.g:1:784: T__136
                 {
                 mT__136(); 
 
                 }
                 break;
             case 125 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:791: T__137
+                // InternalEntityMockDSL.g:1:791: T__137
                 {
                 mT__137(); 
 
                 }
                 break;
             case 126 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:798: T__138
+                // InternalEntityMockDSL.g:1:798: T__138
                 {
                 mT__138(); 
 
                 }
                 break;
             case 127 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:805: T__139
+                // InternalEntityMockDSL.g:1:805: T__139
                 {
                 mT__139(); 
 
                 }
                 break;
             case 128 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:812: T__140
+                // InternalEntityMockDSL.g:1:812: T__140
                 {
                 mT__140(); 
 
                 }
                 break;
             case 129 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:819: T__141
+                // InternalEntityMockDSL.g:1:819: T__141
                 {
                 mT__141(); 
 
                 }
                 break;
             case 130 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:826: T__142
+                // InternalEntityMockDSL.g:1:826: T__142
                 {
                 mT__142(); 
 
                 }
                 break;
             case 131 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:833: T__143
+                // InternalEntityMockDSL.g:1:833: T__143
                 {
                 mT__143(); 
 
                 }
                 break;
             case 132 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:840: T__144
+                // InternalEntityMockDSL.g:1:840: T__144
                 {
                 mT__144(); 
 
                 }
                 break;
             case 133 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:847: T__145
+                // InternalEntityMockDSL.g:1:847: T__145
                 {
                 mT__145(); 
 
                 }
                 break;
             case 134 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:854: T__146
+                // InternalEntityMockDSL.g:1:854: T__146
                 {
                 mT__146(); 
 
                 }
                 break;
             case 135 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:861: T__147
+                // InternalEntityMockDSL.g:1:861: T__147
                 {
                 mT__147(); 
 
                 }
                 break;
             case 136 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:868: T__148
+                // InternalEntityMockDSL.g:1:868: T__148
                 {
                 mT__148(); 
 
                 }
                 break;
             case 137 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:875: T__149
+                // InternalEntityMockDSL.g:1:875: T__149
                 {
                 mT__149(); 
 
                 }
                 break;
             case 138 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:882: T__150
+                // InternalEntityMockDSL.g:1:882: T__150
                 {
                 mT__150(); 
 
                 }
                 break;
             case 139 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:889: T__151
+                // InternalEntityMockDSL.g:1:889: T__151
                 {
                 mT__151(); 
 
                 }
                 break;
             case 140 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:896: T__152
+                // InternalEntityMockDSL.g:1:896: T__152
                 {
                 mT__152(); 
 
                 }
                 break;
             case 141 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:903: T__153
+                // InternalEntityMockDSL.g:1:903: T__153
                 {
                 mT__153(); 
 
                 }
                 break;
             case 142 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:910: T__154
+                // InternalEntityMockDSL.g:1:910: T__154
                 {
                 mT__154(); 
 
                 }
                 break;
             case 143 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:917: T__155
+                // InternalEntityMockDSL.g:1:917: T__155
                 {
                 mT__155(); 
 
                 }
                 break;
             case 144 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:924: T__156
+                // InternalEntityMockDSL.g:1:924: T__156
                 {
                 mT__156(); 
 
                 }
                 break;
             case 145 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:931: RULE_ID
-                {
-                mRULE_ID(); 
-
-                }
-                break;
-            case 146 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:939: RULE_HEX
+                // InternalEntityMockDSL.g:1:931: RULE_HEX
                 {
                 mRULE_HEX(); 
 
                 }
                 break;
-            case 147 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:948: RULE_INT
+            case 146 :
+                // InternalEntityMockDSL.g:1:940: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
-            case 148 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:957: RULE_DECIMAL
+            case 147 :
+                // InternalEntityMockDSL.g:1:949: RULE_DECIMAL
                 {
                 mRULE_DECIMAL(); 
 
                 }
                 break;
+            case 148 :
+                // InternalEntityMockDSL.g:1:962: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
             case 149 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:970: RULE_STRING
+                // InternalEntityMockDSL.g:1:970: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
             case 150 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:982: RULE_ML_COMMENT
+                // InternalEntityMockDSL.g:1:982: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
             case 151 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:998: RULE_SL_COMMENT
+                // InternalEntityMockDSL.g:1:998: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
             case 152 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:1014: RULE_WS
+                // InternalEntityMockDSL.g:1:1014: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
             case 153 :
-                // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1:1022: RULE_ANY_OTHER
+                // InternalEntityMockDSL.g:1:1022: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -5120,389 +5120,212 @@
 
     protected DFA21 dfa21 = new DFA21(this);
     static final String DFA21_eotS =
-        "\1\uffff\1\64\1\uffff\2\64\1\uffff\1\100\1\103\3\64\3\uffff\13"+
-        "\64\1\165\1\uffff\1\171\3\uffff\1\177\1\u0083\1\u0085\1\u0087\1"+
-        "\u0089\1\u008b\1\u008d\1\u008f\1\u0092\1\u0094\1\uffff\1\64\1\62"+
-        "\1\uffff\2\u009a\4\uffff\1\64\2\uffff\7\64\1\u00ab\1\uffff\1\u00ad"+
-        "\4\uffff\2\64\1\u00b2\6\64\1\u00b9\3\uffff\35\64\1\u00e3\3\64\5"+
-        "\uffff\1\u00e9\26\uffff\1\u00eb\7\uffff\2\64\1\uffff\1\u009a\4\uffff"+
-        "\4\64\1\u00f2\10\64\3\uffff\4\64\1\uffff\2\64\1\u0105\3\64\1\uffff"+
-        "\2\64\1\u010b\1\u010c\1\uffff\34\64\1\uffff\7\64\1\uffff\1\64\1"+
-        "\u0134\2\64\4\uffff\1\u0137\3\64\1\uffff\1\64\1\uffff\3\64\1\u0140"+
-        "\7\64\1\u0149\5\64\2\uffff\5\64\5\uffff\2\64\1\u0156\1\u0157\6\64"+
-        "\1\u015e\7\64\1\u0166\1\64\1\u0168\16\64\1\u0177\1\uffff\2\64\1"+
-        "\uffff\1\u017a\1\uffff\6\64\1\uffff\1\64\1\u0183\5\64\2\uffff\3"+
-        "\64\1\uffff\1\64\1\u018f\6\64\2\uffff\1\u0196\1\u0197\1\u0198\3"+
-        "\64\1\uffff\1\64\1\u019d\1\64\1\u019f\1\u01a0\2\64\1\uffff\1\64"+
-        "\1\uffff\1\u01a5\1\64\1\u01a7\1\64\1\uffff\3\64\1\u01ac\1\u01ad"+
-        "\1\uffff\1\64\1\u01af\1\64\1\uffff\1\64\1\u01b2\2\uffff\1\64\1\u01b5"+
-        "\1\64\1\u01b7\1\64\1\uffff\1\u01b9\1\uffff\5\64\2\uffff\4\64\1\uffff"+
-        "\2\64\1\u01c6\1\64\1\uffff\1\64\3\uffff\1\u01ca\2\64\1\u01cd\1\uffff"+
-        "\1\64\2\uffff\4\64\1\uffff\1\64\1\uffff\4\64\2\uffff\1\64\1\uffff"+
-        "\1\64\1\u01da\2\uffff\1\u01dc\1\uffff\1\64\1\uffff\1\64\1\uffff"+
-        "\1\u01df\5\64\1\u01e5\1\64\1\uffff\1\u01e7\1\64\1\u01e9\1\uffff"+
-        "\1\64\1\u01eb\3\uffff\1\64\1\uffff\2\64\1\u01f1\5\64\1\u01f7\3\64"+
-        "\3\uffff\1\u01fd\1\64\2\uffff\2\64\1\u0202\2\uffff\1\u0203\1\uffff"+
-        "\1\64\1\uffff\1\64\3\uffff\3\64\1\uffff\5\64\1\uffff\2\64\1\u0212"+
-        "\1\uffff\1\u0214\1\uffff\1\u0215\2\64\1\u0218\2\uffff\1\64\3\uffff"+
-        "\1\u021c\1\64\1\uffff\1\u021e\2\64\1\u0221\1\u0222\1\uffff\1\u0225"+
-        "\4\uffff\1\u0228\1\64\1\uffff\1\u022a\3\uffff\1\64\2\uffff\1\64"+
-        "\10\uffff\1\64\3\uffff\1\64\2\uffff\1\64\2\uffff\1\64\2\uffff\1"+
-        "\u023d\1\64\2\uffff\1\64\3\uffff\1\64\2\uffff\1\64\2\uffff\1\64"+
-        "\2\uffff\1\64\3\uffff\1\64\2\uffff\1\u0255\3\uffff\1\64\3\uffff"+
-        "\1\u025a\6\uffff";
+        "\1\uffff\1\66\2\uffff\5\66\3\uffff\5\66\1\131\7\66\1\164\1\167\2\uffff\1\174\3\uffff\1\u0082\1\u0086\1\u0088\1\u008a\1\u008c\1\u008e\1\u0090\1\u0092\1\u0095\1\u0097\2\u009a\1\62\5\uffff\3\66\3\uffff\3\66\1\u00aa\11\66\1\u00b8\3\uffff\3\66\1\u00bd\12\66\1\u00cc\1\uffff\20\66\1\u00e4\2\66\1\u00ea\3\66\11\uffff\1\u00f0\26\uffff\1\u00f2\7\uffff\1\u009a\4\uffff\14\66\1\uffff\4\66\1\u0105\2\66\1\u0108\5\66\1\uffff\4\66\1\uffff\2\66\1\u0115\1\u0116\11\66\2\uffff\27\66\1\uffff\1\u0137\4\66\1\uffff\1\66\1\u013d\2\66\4\uffff\1\66\1\u0141\3\66\1\u0146\7\66\1\u014f\1\u0150\2\66\1\u0153\1\uffff\2\66\1\uffff\3\66\1\u0159\10\66\2\uffff\4\66\1\u0166\1\u0167\5\66\1\u016d\10\66\1\u0176\1\66\1\u0178\10\66\1\u0181\1\uffff\4\66\1\u0186\1\uffff\3\66\1\uffff\4\66\1\uffff\10\66\2\uffff\2\66\1\uffff\1\u0198\4\66\1\uffff\1\66\1\u019e\12\66\2\uffff\1\u01a9\1\u01aa\1\u01ab\2\66\1\uffff\1\66\1\u01af\1\66\1\u01b1\1\66\1\u01b4\2\66\1\uffff\1\66\1\uffff\1\u01b9\1\66\1\u01bb\1\66\1\u01bd\1\66\1\u01bf\1\66\1\uffff\2\66\1\u01c3\1\66\1\uffff\1\66\1\u01c6\5\66\1\u01cc\10\66\1\u01d5\1\uffff\1\66\1\u01d7\3\66\1\uffff\3\66\1\u01de\1\u01e0\1\66\1\u01e2\3\66\3\uffff\1\u01e7\1\66\1\u01e9\1\uffff\1\66\1\uffff\1\66\1\u01ec\1\uffff\4\66\1\uffff\1\66\1\uffff\1\66\1\uffff\1\66\1\uffff\3\66\1\uffff\1\66\1\u01f9\1\uffff\1\u01fa\2\66\1\u01fd\1\u01fe\1\uffff\2\66\1\u0201\4\66\1\u0206\1\uffff\1\66\1\uffff\1\66\1\u0209\1\66\1\u020b\2\66\1\uffff\1\u0210\1\uffff\1\66\1\uffff\1\66\1\u0213\1\u0214\1\66\1\uffff\1\66\1\uffff\2\66\1\uffff\2\66\1\u021b\11\66\2\uffff\1\66\1\u0226\2\uffff\2\66\1\uffff\1\u0229\2\66\1\u022c\1\uffff\1\u022e\1\66\1\uffff\1\66\1\uffff\4\66\1\uffff\1\66\1\u0236\2\uffff\1\u0237\2\66\1\u023a\2\66\1\uffff\6\66\1\u0244\1\u0245\1\u0246\1\66\1\uffff\1\66\1\u0249\1\uffff\1\66\1\u024b\1\uffff\1\u024c\1\uffff\1\u024d\6\66\2\uffff\1\u0254\1\66\1\uffff\1\66\1\u0257\2\66\1\u025b\4\66\3\uffff\1\u0260\1\66\1\uffff\1\66\3\uffff\1\u0263\3\66\1\u0267\1\66\1\uffff\2\66\1\uffff\3\66\1\uffff\3\66\1\u0271\1\uffff\1\u0272\1\66\1\uffff\1\66\1\u0275\1\u0276\1\uffff\1\u0277\2\66\1\u027a\1\u027b\3\66\1\u027f\2\uffff\1\66\1\u0281\3\uffff\1\u0282\1\66\2\uffff\3\66\1\uffff\1\66\2\uffff\11\66\1\u0293\5\66\1\u029a\1\uffff\1\u029b\5\66\2\uffff\1\u02a1\4\66\1\uffff\1\66\1\u02a7\2\66\1\u02aa\1\uffff\1\66\1\u02ac\1\uffff\1\u02ad\2\uffff";
     static final String DFA21_eofS =
-        "\u025d\uffff";
+        "\u02ae\uffff";
     static final String DFA21_minS =
-        "\1\0\1\157\1\uffff\1\141\1\146\1\uffff\1\56\1\52\2\141\1\163\3"+
-        "\uffff\1\142\2\141\2\145\1\154\1\141\1\145\1\141\1\156\1\145\1\55"+
-        "\1\uffff\1\75\3\uffff\1\53\1\52\1\75\1\76\1\75\1\174\1\46\1\75\1"+
-        "\56\1\72\1\uffff\1\145\1\44\1\uffff\2\60\4\uffff\1\143\2\uffff\1"+
-        "\156\1\146\1\156\1\165\1\160\1\145\1\163\1\44\1\uffff\1\74\4\uffff"+
-        "\1\164\1\143\1\44\1\157\1\164\1\162\1\154\1\156\1\164\1\44\3\uffff"+
-        "\1\152\1\164\1\154\1\40\1\163\1\157\1\164\1\145\1\162\1\145\1\151"+
-        "\1\147\1\156\1\141\1\160\1\156\1\142\1\145\1\151\1\163\1\154\1\145"+
-        "\1\141\2\162\1\40\1\163\1\151\1\155\1\44\1\165\1\160\1\162\5\uffff"+
-        "\1\75\26\uffff\1\75\7\uffff\1\167\1\154\1\uffff\1\60\4\uffff\1\153"+
-        "\1\164\1\40\1\157\1\44\1\165\1\144\1\156\1\163\1\157\1\155\1\145"+
-        "\1\164\3\uffff\1\141\1\163\1\141\1\151\1\uffff\1\155\1\165\1\40"+
-        "\1\163\1\141\1\162\1\uffff\1\145\1\151\2\44\2\145\1\154\1\150\1"+
-        "\156\1\154\1\144\1\153\1\164\1\156\1\164\1\160\1\164\1\145\1\143"+
-        "\1\145\1\162\1\163\2\145\1\143\1\145\1\143\1\141\1\162\2\164\1\141"+
-        "\1\143\1\uffff\2\151\1\156\1\164\1\160\1\141\1\157\1\uffff\1\145"+
-        "\1\44\1\145\1\157\4\uffff\1\44\1\154\1\40\1\150\1\uffff\1\165\1"+
-        "\uffff\1\162\1\157\1\144\1\44\1\162\1\163\1\141\1\147\1\141\1\151"+
-        "\1\40\1\44\1\156\1\165\1\155\1\40\1\162\2\uffff\1\145\1\154\1\151"+
-        "\1\143\1\157\5\uffff\1\144\1\145\2\44\1\145\2\163\1\143\2\145\1"+
-        "\44\1\151\1\162\1\150\1\144\1\171\1\164\1\156\1\44\1\165\1\44\1"+
-        "\150\1\164\1\163\1\145\1\40\1\147\1\145\1\147\1\154\1\147\1\40\1"+
-        "\157\1\171\1\162\1\44\1\uffff\1\157\1\167\1\uffff\1\44\1\145\1\156"+
-        "\1\163\1\162\1\156\1\155\1\40\1\uffff\1\164\1\44\1\164\1\145\2\156"+
-        "\1\171\1\146\1\uffff\1\145\1\154\1\141\1\uffff\1\145\1\44\1\154"+
-        "\1\142\1\164\1\156\1\40\1\141\2\uffff\3\44\1\150\1\144\1\156\1\uffff"+
-        "\1\143\1\44\1\162\2\44\1\151\1\144\1\uffff\1\154\1\uffff\1\44\1"+
-        "\145\1\44\1\162\1\uffff\1\162\2\156\2\44\1\uffff\1\162\1\44\1\162"+
-        "\1\uffff\1\146\1\44\1\uffff\1\156\1\147\1\44\1\143\1\44\1\151\1"+
-        "\uffff\1\44\1\uffff\1\145\1\162\1\143\1\164\1\160\2\uffff\1\144"+
-        "\1\164\1\154\1\40\1\uffff\1\171\1\165\1\44\1\141\1\uffff\1\156\3"+
-        "\uffff\2\40\1\143\1\44\1\uffff\1\157\2\uffff\1\156\1\163\1\151\1"+
-        "\141\1\uffff\1\102\1\uffff\1\144\1\141\1\164\1\145\2\uffff\1\141"+
-        "\1\uffff\1\157\1\44\1\uffff\1\164\1\44\1\uffff\1\145\1\uffff\1\172"+
-        "\1\uffff\1\44\1\40\3\145\1\40\1\44\1\163\1\uffff\1\44\1\164\1\44"+
-        "\1\uffff\1\154\1\44\2\uffff\1\144\1\145\1\uffff\1\156\1\147\1\44"+
-        "\1\157\1\164\1\154\1\141\1\160\1\44\1\144\1\162\1\167\1\uffff\1"+
-        "\151\1\uffff\1\44\1\145\2\uffff\1\157\1\162\1\44\2\uffff\1\44\1"+
-        "\uffff\1\145\1\uffff\1\40\1\uffff\1\157\1\156\1\163\1\151\1\40\1"+
-        "\uffff\1\156\1\145\1\157\1\171\1\163\1\uffff\1\40\1\171\1\44\1\164"+
-        "\1\44\1\uffff\1\44\1\146\1\143\1\44\2\uffff\1\163\1\uffff\1\165"+
-        "\1\164\1\44\1\172\1\uffff\1\44\1\40\1\142\2\44\1\144\1\44\1\uffff"+
-        "\1\151\2\uffff\1\44\1\150\1\uffff\1\44\1\142\1\145\1\uffff\1\145"+
-        "\1\uffff\1\141\1\115\2\uffff\1\157\1\156\4\uffff\1\141\1\uffff\1"+
-        "\154\1\147\1\144\2\uffff\1\141\1\165\1\164\1\156\2\145\1\44\1\160"+
-        "\1\142\1\145\1\147\1\40\1\162\1\uffff\1\160\1\154\1\147\1\145\1"+
-        "\146\1\40\1\151\2\145\1\40\2\uffff\1\146\1\156\1\40\1\162\1\44\3"+
-        "\uffff\1\147\1\146\1\40\1\uffff\1\44\2\uffff\1\146\3\uffff";
+        "\1\0\1\141\2\uffff\1\157\3\141\1\163\3\uffff\1\146\1\142\2\141\1\145\1\56\1\145\1\154\1\141\1\145\1\156\2\145\1\55\1\52\2\uffff\1\75\3\uffff\1\53\1\52\1\75\1\76\1\75\1\174\1\46\1\75\1\56\1\72\2\60\1\44\5\uffff\1\143\1\151\1\162\3\uffff\2\143\1\164\1\44\1\154\1\164\1\157\1\162\1\154\1\146\1\156\1\165\1\164\1\44\3\uffff\1\145\1\163\1\160\1\44\1\152\1\164\1\154\1\105\1\163\1\157\1\164\1\145\1\162\1\145\1\74\1\uffff\1\151\1\156\1\141\1\160\1\156\1\142\1\164\1\145\1\151\1\163\1\154\1\145\1\141\1\163\1\151\1\154\1\44\1\167\1\155\1\44\1\165\1\160\1\162\11\uffff\1\75\26\uffff\1\75\7\uffff\1\60\4\uffff\1\153\1\164\1\141\1\157\1\143\1\153\1\164\1\143\1\141\1\151\1\141\1\163\1\uffff\1\145\1\141\1\165\1\155\1\44\1\163\1\157\1\44\1\165\1\144\1\156\1\163\1\162\1\uffff\1\155\1\145\1\164\1\157\1\uffff\1\145\1\151\2\44\1\156\1\142\1\145\1\154\1\150\1\156\1\154\1\144\1\153\2\uffff\2\164\1\160\1\164\1\145\1\143\1\145\1\151\1\162\1\163\2\145\1\143\1\145\1\143\1\141\1\162\1\164\2\151\1\156\1\142\1\154\1\uffff\1\44\1\164\1\160\1\141\1\157\1\uffff\1\145\1\44\1\145\1\157\4\uffff\1\141\1\44\1\147\1\162\1\145\1\44\1\150\1\162\1\156\1\165\1\155\1\151\1\106\2\44\1\154\1\162\1\44\1\uffff\1\145\1\165\1\uffff\1\162\1\157\1\144\1\44\1\151\1\163\1\141\1\147\1\141\1\162\1\143\1\157\2\uffff\1\165\1\152\1\144\1\145\2\44\1\145\2\163\1\143\1\145\1\44\1\151\1\162\1\150\1\144\1\164\1\171\1\164\1\156\1\44\1\165\1\44\1\150\1\164\1\163\1\145\1\154\2\147\1\145\1\44\1\uffff\1\120\1\154\1\171\1\162\1\44\1\uffff\1\157\1\167\1\147\1\uffff\1\162\1\151\2\156\1\uffff\1\163\1\151\1\145\1\154\1\141\1\156\1\141\1\162\2\uffff\1\154\1\145\1\uffff\1\44\1\162\1\156\1\155\1\124\1\uffff\1\142\1\44\1\164\1\145\1\156\2\164\1\156\1\155\1\145\1\117\1\141\2\uffff\3\44\1\150\1\156\1\uffff\1\143\1\44\1\162\1\44\1\151\1\44\1\151\1\144\1\uffff\1\154\1\uffff\1\44\1\145\1\44\1\162\1\44\1\156\1\44\1\162\1\uffff\1\151\1\141\1\44\1\162\1\uffff\1\146\1\44\1\145\1\141\2\164\1\147\1\44\1\142\1\144\1\164\1\154\1\164\1\156\1\157\1\171\1\44\1\uffff\1\143\1\44\1\151\1\157\1\165\1\uffff\1\145\1\162\1\143\2\44\1\141\1\44\1\143\2\156\3\uffff\1\44\1\143\1\44\1\uffff\1\157\1\uffff\1\145\1\44\1\uffff\1\156\1\151\1\163\1\141\1\uffff\1\102\1\uffff\1\144\1\uffff\1\145\1\uffff\1\120\1\143\1\164\1\uffff\1\157\1\44\1\uffff\1\44\1\160\1\171\2\44\1\uffff\1\145\1\101\1\44\1\163\1\145\1\147\1\155\1\44\1\uffff\1\145\1\uffff\1\172\1\44\1\164\1\44\1\106\1\145\1\uffff\1\44\1\uffff\1\154\1\uffff\1\164\2\44\1\156\1\uffff\1\145\1\uffff\1\156\1\163\1\uffff\1\147\1\157\1\44\1\164\1\154\1\141\1\144\1\141\1\151\1\153\1\145\1\167\2\uffff\1\150\1\44\2\uffff\1\144\1\163\1\uffff\1\44\1\162\1\145\1\44\1\uffff\1\44\1\145\1\uffff\1\145\1\uffff\1\141\1\151\1\162\1\157\1\uffff\1\106\1\44\2\uffff\1\44\1\163\1\151\1\44\1\105\1\156\1\uffff\1\145\1\157\1\171\1\111\1\156\1\143\3\44\1\163\1\uffff\1\102\1\44\1\uffff\1\143\1\44\1\uffff\1\44\1\uffff\1\44\1\163\1\156\1\143\1\157\1\146\1\157\2\uffff\1\44\1\172\1\uffff\1\156\1\44\1\101\1\142\1\44\1\165\1\156\1\147\1\153\3\uffff\1\44\1\171\1\uffff\1\150\3\uffff\1\44\1\147\1\153\1\155\1\44\1\162\1\uffff\1\145\1\164\1\uffff\1\163\1\156\1\115\1\uffff\1\155\1\164\1\145\1\44\1\uffff\1\44\1\141\1\uffff\1\145\2\44\1\uffff\1\44\1\144\1\151\2\44\1\141\1\142\1\145\1\44\2\uffff\1\156\1\44\3\uffff\1\44\1\164\2\uffff\1\160\1\145\1\147\1\uffff\1\147\2\uffff\1\151\1\160\1\162\3\145\1\151\1\120\1\162\1\44\1\163\1\156\1\141\1\151\1\120\1\44\1\uffff\1\44\1\147\1\156\1\143\1\141\1\151\2\uffff\1\44\1\147\1\153\1\156\1\143\1\uffff\1\145\1\44\1\147\1\153\1\44\1\uffff\1\145\1\44\1\uffff\1\44\2\uffff";
     static final String DFA21_maxS =
-        "\1\uffff\1\157\1\uffff\1\165\1\164\1\uffff\1\56\1\75\1\157\1\165"+
-        "\1\164\3\uffff\1\160\1\141\1\171\1\157\1\171\1\170\1\162\2\145\1"+
-        "\163\1\171\1\76\1\uffff\1\76\3\uffff\3\75\1\76\1\75\1\174\1\46\1"+
-        "\75\2\72\1\uffff\1\165\1\172\1\uffff\1\170\1\154\4\uffff\1\156\2"+
-        "\uffff\1\156\1\164\1\156\1\167\1\160\1\145\1\164\1\172\1\uffff\1"+
-        "\74\4\uffff\1\171\1\146\1\172\1\157\1\164\1\162\1\154\1\156\1\164"+
-        "\1\172\3\uffff\1\152\1\164\1\162\1\40\1\163\1\157\1\164\1\151\1"+
-        "\162\1\145\1\151\1\147\1\156\1\145\1\160\1\156\1\142\1\145\1\164"+
-        "\1\163\1\164\1\145\2\163\1\162\1\40\1\164\1\151\1\170\1\172\1\171"+
-        "\1\160\1\162\5\uffff\1\75\26\uffff\1\75\7\uffff\1\167\1\154\1\uffff"+
-        "\1\154\4\uffff\1\153\1\164\1\40\1\157\1\172\1\165\1\144\1\156\1"+
-        "\163\1\157\1\162\1\145\1\164\3\uffff\1\145\1\163\2\151\1\uffff\1"+
-        "\155\1\165\1\172\1\163\1\141\1\162\1\uffff\1\145\1\151\2\172\1\162"+
-        "\1\145\1\154\1\150\1\156\1\154\1\144\1\153\1\164\1\156\1\164\1\160"+
-        "\1\164\1\145\1\143\1\145\1\162\1\163\2\145\1\143\1\145\1\143\1\141"+
-        "\1\162\2\164\1\141\1\143\1\uffff\2\151\1\156\1\164\1\160\1\141\1"+
-        "\157\1\uffff\1\145\1\172\1\145\1\157\4\uffff\1\172\1\154\1\151\1"+
-        "\150\1\uffff\1\165\1\uffff\1\162\1\157\1\144\1\172\1\162\1\163\1"+
-        "\141\1\147\1\141\1\164\1\40\1\172\1\156\1\165\1\155\1\40\1\162\2"+
-        "\uffff\1\145\1\154\1\151\1\143\1\157\5\uffff\1\144\1\145\2\172\1"+
-        "\145\2\163\1\143\2\145\1\172\1\151\1\162\1\150\1\144\1\171\1\164"+
-        "\1\156\1\172\1\165\1\172\1\150\1\164\1\163\1\145\1\40\1\147\1\145"+
-        "\1\147\1\154\1\147\1\40\1\157\1\171\1\162\1\172\1\uffff\1\157\1"+
-        "\167\1\uffff\1\172\1\145\1\156\1\163\1\162\1\156\1\155\1\40\1\uffff"+
-        "\1\164\1\172\1\164\1\145\2\156\1\171\1\151\1\uffff\1\145\1\154\1"+
-        "\141\1\uffff\1\145\1\172\1\154\1\142\1\164\1\156\1\40\1\141\2\uffff"+
-        "\3\172\1\150\1\144\1\156\1\uffff\1\143\1\172\1\162\2\172\1\151\1"+
-        "\163\1\uffff\1\154\1\uffff\1\172\1\145\1\172\1\162\1\uffff\1\162"+
-        "\2\156\2\172\1\uffff\1\162\1\172\1\162\1\uffff\1\146\1\172\1\uffff"+
-        "\1\156\1\147\1\172\1\143\1\172\1\151\1\uffff\1\172\1\uffff\1\145"+
-        "\1\162\1\143\1\164\1\160\2\uffff\1\144\1\164\1\154\1\40\1\uffff"+
-        "\1\171\1\165\1\172\1\141\1\uffff\1\156\3\uffff\1\172\1\40\1\143"+
-        "\1\172\1\uffff\1\157\2\uffff\1\156\1\163\1\151\1\141\1\uffff\1\102"+
-        "\1\uffff\1\144\1\141\1\164\1\145\2\uffff\1\141\1\uffff\1\157\1\172"+
-        "\1\uffff\1\164\1\172\1\uffff\1\145\1\uffff\1\172\1\uffff\1\172\1"+
-        "\40\3\145\1\40\1\172\1\163\1\uffff\1\172\1\164\1\172\1\uffff\1\154"+
-        "\1\172\2\uffff\1\151\1\145\1\uffff\1\156\1\147\1\172\1\157\1\164"+
-        "\1\154\1\141\1\160\1\172\1\144\1\162\1\167\1\uffff\1\151\1\uffff"+
-        "\1\172\1\145\2\uffff\1\157\1\162\1\172\2\uffff\1\172\1\uffff\1\145"+
-        "\1\uffff\1\40\1\uffff\1\157\1\156\1\163\1\151\1\40\1\uffff\1\156"+
-        "\1\145\1\157\1\171\1\163\1\uffff\1\40\1\171\1\172\1\164\1\172\1"+
-        "\uffff\1\172\1\146\1\143\1\172\2\uffff\1\163\1\uffff\1\165\1\164"+
-        "\2\172\1\uffff\1\172\1\40\1\142\2\172\1\151\1\172\1\uffff\1\171"+
-        "\2\uffff\1\172\1\150\1\uffff\1\172\1\142\1\145\1\uffff\1\145\1\uffff"+
-        "\1\142\1\115\2\uffff\1\157\1\156\4\uffff\1\141\1\uffff\1\154\1\147"+
-        "\1\144\2\uffff\1\141\1\165\1\164\1\156\2\145\1\172\1\160\1\142\1"+
-        "\145\1\147\1\40\1\162\1\uffff\1\160\1\154\1\147\1\145\1\151\1\40"+
-        "\1\151\2\145\1\163\2\uffff\1\151\1\156\1\40\1\162\1\172\3\uffff"+
-        "\1\147\1\151\1\40\1\uffff\1\172\2\uffff\1\151\3\uffff";
+        "\1\uffff\1\162\2\uffff\2\157\1\165\1\157\1\164\3\uffff\1\164\1\160\1\141\1\171\1\157\1\56\1\171\1\170\1\162\1\145\1\163\1\165\1\171\1\76\1\75\2\uffff\1\76\3\uffff\3\75\1\76\1\75\1\174\1\46\1\75\2\72\1\170\1\154\1\172\5\uffff\1\163\1\151\1\162\3\uffff\1\156\1\163\1\171\1\172\1\156\1\164\1\157\1\162\1\154\1\164\1\156\1\167\1\164\1\172\3\uffff\1\145\1\164\1\160\1\172\1\152\1\164\1\162\1\117\1\163\1\157\1\164\1\151\1\162\1\145\1\74\1\uffff\1\151\1\156\1\145\1\160\1\156\1\142\1\164\1\145\1\164\1\163\1\164\1\145\1\163\1\164\1\151\1\155\1\172\1\167\1\170\1\172\1\171\1\160\1\162\11\uffff\1\75\26\uffff\1\75\7\uffff\1\154\4\uffff\1\153\1\164\1\141\1\157\1\143\1\153\1\164\1\143\2\151\1\145\1\163\1\uffff\1\145\1\141\1\165\1\155\1\172\1\163\1\157\1\172\1\165\1\144\1\156\1\163\1\162\1\uffff\1\162\1\145\1\164\1\157\1\uffff\1\145\1\151\2\172\1\156\1\142\1\145\1\154\1\150\1\156\1\154\1\144\1\153\2\uffff\2\164\1\160\1\164\1\145\1\143\1\145\1\151\1\162\1\163\2\145\1\143\1\145\1\143\1\141\1\162\1\164\2\151\1\156\1\142\1\154\1\uffff\1\172\1\164\1\160\1\141\1\157\1\uffff\1\145\1\172\1\145\1\157\4\uffff\1\141\1\172\1\147\1\162\1\145\1\172\1\150\1\162\1\156\1\165\1\155\1\151\1\122\2\172\1\154\1\162\1\172\1\uffff\1\145\1\165\1\uffff\1\162\1\157\1\144\1\172\1\151\1\163\1\141\1\147\1\141\1\162\1\143\1\157\2\uffff\1\165\1\152\1\144\1\145\2\172\1\145\2\163\1\143\1\145\1\172\1\151\1\162\1\150\1\144\1\164\1\171\1\164\1\156\1\172\1\165\1\172\1\150\1\164\1\163\1\145\1\154\2\147\1\145\1\172\1\uffff\1\120\1\154\1\171\1\162\1\172\1\uffff\1\157\1\167\1\147\1\uffff\1\162\1\151\2\156\1\uffff\1\163\1\151\1\145\1\154\1\141\1\156\1\141\1\162\2\uffff\1\154\1\145\1\uffff\1\172\1\162\1\156\1\155\1\124\1\uffff\1\142\1\172\1\164\1\145\1\156\2\164\1\156\1\155\1\145\1\117\1\141\2\uffff\3\172\1\150\1\156\1\uffff\1\143\1\172\1\162\1\172\1\171\1\172\1\151\1\163\1\uffff\1\154\1\uffff\1\172\1\145\1\172\1\162\1\172\1\156\1\172\1\162\1\uffff\1\151\1\141\1\172\1\162\1\uffff\1\146\1\172\1\145\1\141\2\164\1\147\1\172\1\142\1\144\1\164\1\154\1\164\1\156\1\157\1\171\1\172\1\uffff\1\143\1\172\1\151\1\157\1\165\1\uffff\1\145\1\162\1\143\2\172\1\141\1\172\1\143\2\156\3\uffff\1\172\1\143\1\172\1\uffff\1\157\1\uffff\1\145\1\172\1\uffff\1\156\1\151\1\163\1\141\1\uffff\1\102\1\uffff\1\144\1\uffff\1\145\1\uffff\1\122\1\143\1\164\1\uffff\1\157\1\172\1\uffff\1\172\1\160\1\171\2\172\1\uffff\1\145\1\101\1\172\1\163\1\145\1\147\1\155\1\172\1\uffff\1\145\1\uffff\2\172\1\164\1\172\1\122\1\145\1\uffff\1\172\1\uffff\1\154\1\uffff\1\164\2\172\1\156\1\uffff\1\145\1\uffff\1\156\1\163\1\uffff\1\147\1\157\1\172\1\164\1\154\1\141\1\144\1\141\1\151\1\153\1\145\1\167\2\uffff\1\150\1\172\2\uffff\1\144\1\163\1\uffff\1\172\1\162\1\145\1\172\1\uffff\1\172\1\145\1\uffff\1\145\1\uffff\1\141\1\151\1\162\1\157\1\uffff\1\106\1\172\2\uffff\1\172\1\163\1\151\1\172\1\105\1\156\1\uffff\1\145\1\157\1\171\1\116\1\156\1\143\3\172\1\163\1\uffff\1\102\1\172\1\uffff\1\143\1\172\1\uffff\1\172\1\uffff\1\172\1\163\1\156\1\143\1\157\1\146\1\157\2\uffff\2\172\1\uffff\1\156\1\172\1\117\1\142\1\172\1\165\1\156\1\147\1\153\3\uffff\1\172\1\171\1\uffff\1\150\3\uffff\1\172\1\147\1\153\1\155\1\172\1\162\1\uffff\1\145\1\164\1\uffff\1\163\1\156\1\115\1\uffff\1\155\1\164\1\145\1\172\1\uffff\1\172\1\141\1\uffff\1\145\2\172\1\uffff\1\172\1\144\1\151\2\172\1\141\1\142\1\145\1\172\2\uffff\1\156\1\172\3\uffff\1\172\1\164\2\uffff\1\160\1\145\1\147\1\uffff\1\147\2\uffff\1\151\1\160\1\162\3\145\1\151\1\122\1\162\1\172\1\163\1\156\1\141\1\151\1\122\1\172\1\uffff\1\172\1\147\1\156\1\143\1\141\1\151\2\uffff\1\172\1\147\1\153\1\156\1\143\1\uffff\1\145\1\172\1\147\1\153\1\172\1\uffff\1\145\1\172\1\uffff\1\172\2\uffff";
     static final String DFA21_acceptS =
-        "\2\uffff\1\2\2\uffff\1\5\5\uffff\1\16\1\17\1\20\14\uffff\1\116"+
-        "\1\uffff\1\120\1\121\1\122\12\uffff\1\162\2\uffff\1\u0091\2\uffff"+
-        "\2\u0095\1\u0098\1\u0099\1\uffff\1\u0091\1\2\10\uffff\1\5\1\uffff"+
-        "\1\6\1\125\1\151\1\7\12\uffff\1\16\1\17\1\20\41\uffff\1\124\1\142"+
-        "\1\156\1\104\1\116\1\uffff\1\145\1\117\1\120\1\121\1\122\1\123\1"+
-        "\155\1\150\1\126\1\u0096\1\u0097\1\152\1\127\1\153\1\146\1\130\1"+
-        "\132\1\131\1\133\1\161\1\134\1\u008d\1\uffff\1\154\1\147\1\160\1"+
-        "\u008c\1\157\1\166\1\162\2\uffff\1\u0092\1\uffff\1\u0093\1\u0094"+
-        "\1\u0095\1\u0098\15\uffff\1\163\1\143\1\144\4\uffff\1\173\6\uffff"+
-        "\1\105\41\uffff\1\44\7\uffff\1\70\4\uffff\1\137\1\135\1\140\1\136"+
-        "\4\uffff\1\3\1\uffff\1\112\21\uffff\1\66\1\171\5\uffff\1\24\1\174"+
-        "\1\25\1\71\1\107\44\uffff\1\u0088\2\uffff\1\u0081\10\uffff\1\67"+
-        "\10\uffff\1\u008e\3\uffff\1\12\10\uffff\1\27\1\31\6\uffff\1\76\7"+
-        "\uffff\1\164\1\uffff\1\170\4\uffff\1\41\5\uffff\1\53\3\uffff\1\u0083"+
-        "\2\uffff\1\u0084\6\uffff\1\47\1\uffff\1\21\5\uffff\1\43\1\77\4\uffff"+
-        "\1\u0082\4\uffff\1\35\1\uffff\1\172\1\56\1\u008f\4\uffff\1\u0080"+
-        "\1\uffff\1\32\1\100\4\uffff\1\u008b\1\uffff\1\40\4\uffff\1\75\1"+
-        "\111\1\uffff\1\102\2\uffff\1\u0086\2\uffff\1\u0090\1\uffff\1\u0087"+
-        "\1\uffff\1\4\10\uffff\1\37\3\uffff\1\23\2\uffff\1\30\1\165\2\uffff"+
-        "\1\176\14\uffff\1\u0085\1\uffff\1\65\2\uffff\1\73\1\74\3\uffff\1"+
-        "\33\1\167\1\uffff\1\u0089\1\uffff\1\22\1\uffff\1\42\5\uffff\1\175"+
-        "\5\uffff\1\115\5\uffff\1\14\4\uffff\1\63\1\46\1\uffff\1\114\4\uffff"+
-        "\1\113\7\uffff\1\103\1\uffff\1\13\1\36\2\uffff\1\26\3\uffff\1\55"+
-        "\1\uffff\1\177\2\uffff\1\101\1\54\2\uffff\1\106\1\1\1\64\1\141\1"+
-        "\uffff\1\15\3\uffff\1\34\1\110\15\uffff\1\u008a\12\uffff\1\45\1"+
-        "\50\5\uffff\1\11\1\51\1\52\3\uffff\1\10\1\uffff\1\57\1\60\1\uffff"+
-        "\1\72\1\61\1\62";
+        "\2\uffff\1\2\1\3\5\uffff\1\15\1\16\1\17\17\uffff\1\120\1\121\1\uffff\1\123\1\124\1\125\15\uffff\1\u0094\2\u0095\1\u0098\1\u0099\3\uffff\1\u0094\1\2\1\3\16\uffff\1\15\1\16\1\17\17\uffff\1\26\27\uffff\1\127\1\145\1\161\1\101\1\130\1\154\1\116\1\120\1\121\1\uffff\1\150\1\122\1\123\1\124\1\125\1\126\1\160\1\153\1\131\1\u0096\1\u0097\1\155\1\132\1\156\1\151\1\133\1\135\1\134\1\136\1\164\1\137\1\u008d\1\uffff\1\157\1\152\1\163\1\u008c\1\162\1\170\1\u0091\1\uffff\1\u0092\1\u0093\1\u0095\1\u0098\14\uffff\1\175\15\uffff\1\102\4\uffff\1\165\15\uffff\1\146\1\147\27\uffff\1\117\5\uffff\1\67\4\uffff\1\142\1\140\1\143\1\141\22\uffff\1\173\2\uffff\1\107\14\uffff\1\23\1\176\40\uffff\1\u0081\5\uffff\1\u0088\3\uffff\1\40\4\uffff\1\4\10\uffff\1\u008e\1\11\2\uffff\1\43\5\uffff\1\66\14\uffff\1\25\1\30\5\uffff\1\73\10\uffff\1\166\1\uffff\1\172\10\uffff\1\u0084\4\uffff\1\u0083\21\uffff\1\u0082\5\uffff\1\20\12\uffff\1\174\1\56\1\u008f\3\uffff\1\u0080\1\uffff\1\31\2\uffff\1\75\4\uffff\1\u008b\1\uffff\1\37\1\uffff\1\44\1\uffff\1\106\3\uffff\1\77\2\uffff\1\u0086\5\uffff\1\u0090\10\uffff\1\36\1\uffff\1\u0087\6\uffff\1\113\1\uffff\1\22\1\uffff\1\24\4\uffff\1\167\1\uffff\1\114\2\uffff\1\65\14\uffff\1\u0085\1\1\2\uffff\1\112\1\64\2\uffff\1\171\4\uffff\1\u0089\2\uffff\1\47\1\uffff\1\71\4\uffff\1\21\2\uffff\1\34\1\41\6\uffff\1\177\12\uffff\1\6\2\uffff\1\46\2\uffff\1\74\1\uffff\1\13\7\uffff\1\104\1\27\2\uffff\1\63\11\uffff\1\53\1\103\1\100\2\uffff\1\32\1\uffff\1\42\1\12\1\35\6\uffff\1\55\2\uffff\1\115\3\uffff\1\76\4\uffff\1\54\2\uffff\1\14\3\uffff\1\144\11\uffff\1\50\1\5\2\uffff\1\52\1\72\1\111\2\uffff\1\33\1\105\3\uffff\1\45\1\uffff\1\51\1\u008a\20\uffff\1\10\6\uffff\1\7\1\110\5\uffff\1\70\5\uffff\1\60\2\uffff\1\57\1\uffff\1\62\1\61";
     static final String DFA21_specialS =
-        "\1\0\u025c\uffff}>";
+        "\1\0\u02ad\uffff}>";
     static final String[] DFA21_transitionS = {
-            "\11\62\2\61\2\62\1\61\22\62\1\61\1\46\1\57\1\34\1\54\1\41\1"+
-            "\45\1\60\1\13\1\15\1\7\1\37\1\14\1\31\1\6\1\40\1\55\11\56\1"+
-            "\50\1\51\1\42\1\33\1\43\1\47\1\32\32\54\1\35\1\62\1\36\1\53"+
-            "\1\54\1\62\1\12\1\20\1\24\1\10\1\23\1\11\2\54\1\4\3\54\1\1\1"+
-            "\52\1\16\1\26\1\54\1\3\1\22\1\30\1\27\1\17\1\21\1\54\1\25\1"+
-            "\54\1\2\1\44\1\5\uff82\62",
-            "\1\63",
+            "\11\62\2\61\2\62\1\61\22\62\1\61\1\50\1\57\1\36\1\56\1\43\1\47\1\60\1\11\1\13\1\32\1\41\1\12\1\31\1\21\1\42\1\53\11\54\1\52\1\33\1\44\1\35\1\45\1\51\1\34\32\56\1\37\1\62\1\40\1\55\1\56\1\62\1\10\1\17\1\24\1\5\1\23\1\6\2\56\1\14\3\56\1\4\1\27\1\15\1\1\1\56\1\7\1\22\1\30\1\26\1\16\1\20\1\56\1\25\1\56\1\2\1\46\1\3\uff82\62",
+            "\1\63\3\uffff\1\65\14\uffff\1\64",
             "",
-            "\1\70\3\uffff\1\67\11\uffff\1\71\5\uffff\1\66",
-            "\1\75\6\uffff\1\72\1\74\5\uffff\1\73",
             "",
-            "\1\77",
-            "\1\102\22\uffff\1\101",
-            "\1\104\3\uffff\1\105\11\uffff\1\106",
-            "\1\112\7\uffff\1\113\5\uffff\1\111\2\uffff\1\107\2\uffff\1"+
-            "\110",
-            "\1\115\1\114",
+            "\1\71",
+            "\1\73\3\uffff\1\72\11\uffff\1\74",
+            "\1\101\7\uffff\1\75\5\uffff\1\100\2\uffff\1\77\2\uffff\1\76",
+            "\1\103\3\uffff\1\102\11\uffff\1\104",
+            "\1\106\1\105",
             "",
             "",
             "",
-            "\1\121\15\uffff\1\122",
-            "\1\123",
-            "\1\125\15\uffff\1\126\11\uffff\1\124",
-            "\1\132\2\uffff\1\130\1\127\5\uffff\1\131",
-            "\1\135\3\uffff\1\134\12\uffff\1\136\1\137\1\uffff\1\133\1"+
-            "\uffff\1\140",
-            "\1\144\1\141\10\uffff\1\142\1\uffff\1\143",
-            "\1\145\20\uffff\1\146",
-            "\1\147",
-            "\1\150\3\uffff\1\151",
-            "\1\153\1\uffff\1\152\2\uffff\1\154",
-            "\1\155\2\uffff\1\161\6\uffff\1\156\2\uffff\1\157\6\uffff\1"+
-            "\160",
-            "\1\164\17\uffff\1\162\1\163",
+            "\1\115\6\uffff\1\114\1\113\5\uffff\1\112",
+            "\1\116\15\uffff\1\117",
+            "\1\120",
+            "\1\122\15\uffff\1\123\11\uffff\1\121",
+            "\1\127\2\uffff\1\125\1\124\5\uffff\1\126",
+            "\1\130",
+            "\1\133\16\uffff\1\134\1\135\1\uffff\1\132\1\uffff\1\136",
+            "\1\143\1\137\1\140\7\uffff\1\141\1\uffff\1\142",
+            "\1\144\20\uffff\1\145",
+            "\1\146",
+            "\1\147\4\uffff\1\150",
+            "\1\153\15\uffff\1\152\1\uffff\1\151",
+            "\1\154\2\uffff\1\160\6\uffff\1\155\2\uffff\1\156\6\uffff\1\157",
+            "\1\163\17\uffff\1\161\1\162",
+            "\1\166\22\uffff\1\165",
             "",
-            "\1\167\1\170",
+            "",
+            "\1\172\1\173",
             "",
             "",
             "",
-            "\1\176\21\uffff\1\175",
-            "\1\u0081\4\uffff\1\u0082\15\uffff\1\u0080",
-            "\1\u0084",
-            "\1\u0086",
-            "\1\u0088",
-            "\1\u008a",
-            "\1\u008c",
-            "\1\u008e",
-            "\1\u0091\13\uffff\1\u0090",
-            "\1\u0093",
-            "",
-            "\1\u0096\17\uffff\1\u0097",
-            "\1\64\34\uffff\32\64\4\uffff\1\64\1\uffff\32\64",
-            "",
-            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b"+
-            "\13\uffff\1\u0098\6\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3"+
-            "\u009b\5\uffff\1\u009b\13\uffff\1\u0098",
-            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b"+
-            "\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1"+
-            "\u009b",
+            "\1\u0081\21\uffff\1\u0080",
+            "\1\u0084\4\uffff\1\u0085\15\uffff\1\u0083",
+            "\1\u0087",
+            "\1\u0089",
+            "\1\u008b",
+            "\1\u008d",
+            "\1\u008f",
+            "\1\u0091",
+            "\1\u0094\13\uffff\1\u0093",
+            "\1\u0096",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\13\uffff\1\u0098\6\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\13\uffff\1\u0098",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b",
+            "\1\66\34\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "",
             "",
             "",
-            "\1\u009e\12\uffff\1\u009f",
             "",
-            "",
-            "\1\u00a0",
-            "\1\u00a2\14\uffff\1\u00a1\1\u00a3",
-            "\1\u00a4",
-            "\1\u00a5\1\uffff\1\u00a6",
-            "\1\u00a7",
-            "\1\u00a8",
-            "\1\u00aa\1\u00a9",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
-            "\1\u00ac",
+            "\1\u009e\16\uffff\1\u00a0\1\u009f",
+            "\1\u00a1",
+            "\1\u00a2",
             "",
             "",
             "",
-            "",
-            "\1\u00ae\4\uffff\1\u00af",
-            "\1\u00b1\2\uffff\1\u00b0",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u00b3",
+            "\1\u00a3\12\uffff\1\u00a4",
+            "\1\u00a7\2\uffff\1\u00a6\14\uffff\1\u00a5",
+            "\1\u00a8\4\uffff\1\u00a9",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u00ab\1\uffff\1\u00ac",
+            "\1\u00ad",
+            "\1\u00ae",
+            "\1\u00af",
+            "\1\u00b0",
+            "\1\u00b2\14\uffff\1\u00b1\1\u00b3",
             "\1\u00b4",
-            "\1\u00b5",
-            "\1\u00b6",
+            "\1\u00b5\1\uffff\1\u00b6",
             "\1\u00b7",
-            "\1\u00b8",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "",
             "",
-            "\1\u00ba",
-            "\1\u00bb",
-            "\1\u00bd\5\uffff\1\u00bc",
+            "\1\u00b9",
+            "\1\u00bb\1\u00ba",
+            "\1\u00bc",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u00be",
             "\1\u00bf",
-            "\1\u00c0",
-            "\1\u00c1",
-            "\1\u00c2\3\uffff\1\u00c3",
+            "\1\u00c1\5\uffff\1\u00c0",
+            "\1\u00c2\11\uffff\1\u00c3",
             "\1\u00c4",
             "\1\u00c5",
             "\1\u00c6",
-            "\1\u00c7",
-            "\1\u00c8",
-            "\1\u00ca\3\uffff\1\u00c9",
+            "\1\u00c7\3\uffff\1\u00c8",
+            "\1\u00c9",
+            "\1\u00ca",
             "\1\u00cb",
-            "\1\u00cc",
+            "",
             "\1\u00cd",
             "\1\u00ce",
-            "\1\u00cf\12\uffff\1\u00d0",
+            "\1\u00d0\3\uffff\1\u00cf",
             "\1\u00d1",
-            "\1\u00d2\6\uffff\1\u00d3\1\u00d4",
+            "\1\u00d2",
+            "\1\u00d3",
+            "\1\u00d4",
             "\1\u00d5",
-            "\1\u00d6\21\uffff\1\u00d7",
-            "\1\u00d9\1\u00d8",
-            "\1\u00da",
-            "\1\u00db",
-            "\1\u00dc\1\u00dd",
-            "\1\u00de",
-            "\1\u00e0\12\uffff\1\u00df",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\3"+
-            "\64\1\u00e1\10\64\1\u00e2\15\64",
-            "\1\u00e4\3\uffff\1\u00e5",
-            "\1\u00e6",
-            "\1\u00e7",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00e8",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00ea",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u00ec",
+            "\1\u00d6\12\uffff\1\u00d7",
+            "\1\u00d8",
+            "\1\u00d9\6\uffff\1\u00da\1\u00db",
+            "\1\u00dc",
+            "\1\u00dd\21\uffff\1\u00de",
+            "\1\u00e0\1\u00df",
+            "\1\u00e1",
+            "\1\u00e3\1\u00e2",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u00e5",
+            "\1\u00e7\12\uffff\1\u00e6",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\3\66\1\u00e8\10\66\1\u00e9\15\66",
+            "\1\u00eb\3\uffff\1\u00ec",
             "\1\u00ed",
-            "",
-            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b"+
-            "\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1"+
-            "\u009b",
-            "",
-            "",
-            "",
-            "",
             "\1\u00ee",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u00ef",
-            "\1\u00f0",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u00f1",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\u0099\10\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b\22\uffff\1\u0099\2\uffff\1\u009b\1\uffff\3\u009b\5\uffff\1\u009b",
+            "",
+            "",
+            "",
+            "",
             "\1\u00f3",
             "\1\u00f4",
             "\1\u00f5",
             "\1\u00f6",
             "\1\u00f7",
-            "\1\u00f8\4\uffff\1\u00f9",
+            "\1\u00f8",
+            "\1\u00f9",
             "\1\u00fa",
-            "\1\u00fb",
+            "\1\u00fc\7\uffff\1\u00fb",
+            "\1\u00fd",
+            "\1\u00fe\3\uffff\1\u00ff",
+            "\1\u0100",
             "",
-            "",
-            "",
-            "\1\u00fc\3\uffff\1\u00fd",
-            "\1\u00fe",
-            "\1\u0100\7\uffff\1\u00ff",
             "\1\u0101",
-            "",
             "\1\u0102",
             "\1\u0103",
-            "\1\u0104\3\uffff\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff"+
-            "\1\64\1\uffff\32\64",
+            "\1\u0104",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0106",
             "\1\u0107",
-            "\1\u0108",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0109",
             "\1\u010a",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u010d\11\uffff\1\u010f\2\uffff\1\u010e",
+            "\1\u010b",
+            "\1\u010c",
+            "\1\u010d",
+            "",
+            "\1\u010e\4\uffff\1\u010f",
             "\1\u0110",
             "\1\u0111",
             "\1\u0112",
+            "",
             "\1\u0113",
             "\1\u0114",
-            "\1\u0115",
-            "\1\u0116",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0117",
             "\1\u0118",
             "\1\u0119",
@@ -5512,6 +5335,8 @@
             "\1\u011d",
             "\1\u011e",
             "\1\u011f",
+            "",
+            "",
             "\1\u0120",
             "\1\u0121",
             "\1\u0122",
@@ -5524,7 +5349,6 @@
             "\1\u0129",
             "\1\u012a",
             "\1\u012b",
-            "",
             "\1\u012c",
             "\1\u012d",
             "\1\u012e",
@@ -5532,86 +5356,73 @@
             "\1\u0130",
             "\1\u0131",
             "\1\u0132",
-            "",
             "\1\u0133",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u0134",
             "\1\u0135",
             "\1\u0136",
             "",
-            "",
-            "",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0138",
-            "\1\u0139\110\uffff\1\u013a",
+            "\1\u0139",
+            "\1\u013a",
             "\1\u013b",
             "",
             "\1\u013c",
-            "",
-            "\1\u013d",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u013e",
             "\1\u013f",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u0141",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0140",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0142",
             "\1\u0143",
             "\1\u0144",
-            "\1\u0145",
-            "\1\u0146\12\uffff\1\u0147",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\10\66\1\u0145\21\66",
+            "\1\u0147",
             "\1\u0148",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u0149",
             "\1\u014a",
             "\1\u014b",
             "\1\u014c",
-            "\1\u014d",
-            "\1\u014e",
-            "",
-            "",
-            "\1\u014f",
-            "\1\u0150",
+            "\1\u014e\13\uffff\1\u014d",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0151",
             "\1\u0152",
-            "\1\u0153",
-            "",
-            "",
-            "",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "\1\u0154",
             "\1\u0155",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\u0156",
+            "\1\u0157",
             "\1\u0158",
-            "\1\u0159",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u015a",
             "\1\u015b",
             "\1\u015c",
             "\1\u015d",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u015e",
             "\1\u015f",
             "\1\u0160",
             "\1\u0161",
+            "",
+            "",
             "\1\u0162",
             "\1\u0163",
             "\1\u0164",
             "\1\u0165",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u0167",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0168",
             "\1\u0169",
             "\1\u016a",
             "\1\u016b",
             "\1\u016c",
-            "\1\u016d",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u016e",
             "\1\u016f",
             "\1\u0170",
@@ -5620,40 +5431,36 @@
             "\1\u0173",
             "\1\u0174",
             "\1\u0175",
-            "\1\u0176",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
-            "\1\u0178",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0177",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0179",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u017a",
             "\1\u017b",
             "\1\u017c",
             "\1\u017d",
             "\1\u017e",
             "\1\u017f",
             "\1\u0180",
-            "\1\u0181",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "\1\u0182",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u0183",
             "\1\u0184",
             "\1\u0185",
-            "\1\u0186",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
             "\1\u0187",
             "\1\u0188",
-            "\1\u018a\2\uffff\1\u0189",
+            "\1\u0189",
             "",
+            "\1\u018a",
             "\1\u018b",
             "\1\u018c",
             "\1\u018d",
             "",
             "\1\u018e",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u018f",
             "\1\u0190",
             "\1\u0191",
             "\1\u0192",
@@ -5662,309 +5469,353 @@
             "\1\u0195",
             "",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u0196",
+            "\1\u0197",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0199",
             "\1\u019a",
             "\1\u019b",
-            "",
             "\1\u019c",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u019e",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\u019d",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u019f",
+            "\1\u01a0",
             "\1\u01a1",
-            "\1\u01a2\16\uffff\1\u01a3",
-            "",
+            "\1\u01a2",
+            "\1\u01a3",
             "\1\u01a4",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u01a5",
             "\1\u01a6",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u01a7",
             "\1\u01a8",
             "",
-            "\1\u01a9",
-            "\1\u01aa",
-            "\1\u01ab",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u01ac",
+            "\1\u01ad",
             "",
             "\1\u01ae",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01b0",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u01b2\17\uffff\1\u01b3",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u01b5",
+            "\1\u01b7\16\uffff\1\u01b6",
             "",
-            "\1\u01b1",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
-            "\1\u01b3",
-            "\1\u01b4",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u01b6",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
             "\1\u01b8",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01ba",
-            "\1\u01bb",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01bc",
-            "\1\u01bd",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01be",
-            "",
-            "",
-            "\1\u01bf",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01c0",
+            "",
             "\1\u01c1",
             "\1\u01c2",
-            "",
-            "\1\u01c3",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01c4",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\22"+
-            "\64\1\u01c5\7\64",
+            "",
+            "\1\u01c5",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01c7",
-            "",
             "\1\u01c8",
-            "",
-            "",
-            "",
-            "\1\u01c9\3\uffff\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff"+
-            "\1\64\1\uffff\32\64",
+            "\1\u01c9",
+            "\1\u01ca",
             "\1\u01cb",
-            "\1\u01cc",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u01cd",
             "\1\u01ce",
-            "",
-            "",
             "\1\u01cf",
             "\1\u01d0",
             "\1\u01d1",
             "\1\u01d2",
-            "",
             "\1\u01d3",
-            "",
             "\1\u01d4",
-            "\1\u01d5",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
             "\1\u01d6",
-            "\1\u01d7",
-            "",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01d8",
-            "",
             "\1\u01d9",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u01da",
             "",
             "\1\u01db",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
+            "\1\u01dc",
             "\1\u01dd",
-            "",
-            "\1\u01de",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u01e0",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\22\66\1\u01df\7\66",
             "\1\u01e1",
-            "\1\u01e2",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01e3",
             "\1\u01e4",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u01e6",
+            "\1\u01e5",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\16\66\1\u01e6\13\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01e8",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "\1\u01ea",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
             "",
+            "\1\u01eb",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
-            "\1\u01ec\4\uffff\1\u01ed",
+            "\1\u01ed",
             "\1\u01ee",
-            "",
             "\1\u01ef",
             "\1\u01f0",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\u01f1",
+            "",
             "\1\u01f2",
+            "",
             "\1\u01f3",
-            "\1\u01f4",
-            "\1\u01f5",
+            "",
+            "\1\u01f5\1\uffff\1\u01f4",
             "\1\u01f6",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u01f7",
+            "",
             "\1\u01f8",
-            "\1\u01f9",
-            "\1\u01fa",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u01fb",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\22"+
-            "\64\1\u01fc\7\64",
-            "\1\u01fe",
-            "",
+            "\1\u01fc",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "\1\u01ff",
             "\1\u0200",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\22"+
-            "\64\1\u0201\7\64",
-            "",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0202",
+            "\1\u0203",
             "\1\u0204",
-            "",
             "\1\u0205",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
-            "\1\u0206",
             "\1\u0207",
-            "\1\u0208",
-            "\1\u0209",
-            "\1\u020a",
             "",
-            "\1\u020b",
-            "\1\u020c",
-            "\1\u020d",
-            "\1\u020e",
+            "\1\u0208",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u020a",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u020e\11\uffff\1\u020d\1\uffff\1\u020c",
             "\1\u020f",
             "",
-            "\1\u0210",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
             "\1\u0211",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u0213",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u0212",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0215",
+            "",
             "\1\u0216",
-            "\1\u0217",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
             "",
+            "\1\u0217",
+            "\1\u0218",
             "",
             "\1\u0219",
-            "",
             "\1\u021a",
-            "\1\u021b",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u021c",
             "\1\u021d",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\u021e",
             "\1\u021f",
             "\1\u0220",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u0223\4\uffff\1\u0224",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "",
-            "\1\u0227\17\uffff\1\u0226",
+            "\1\u0221",
+            "\1\u0222",
+            "\1\u0223",
+            "\1\u0224",
             "",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
-            "\1\u0229",
+            "\1\u0225",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\u0227",
+            "\1\u0228",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u022a",
             "\1\u022b",
-            "\1\u022c",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
-            "\1\u022d",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\22\66\1\u022d\7\66",
+            "\1\u022f",
             "",
-            "\1\u022e\1\u022f",
             "\1\u0230",
             "",
-            "",
             "\1\u0231",
             "\1\u0232",
-            "",
-            "",
-            "",
-            "",
             "\1\u0233",
-            "",
             "\1\u0234",
+            "",
             "\1\u0235",
-            "\1\u0236",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             "",
-            "\1\u0237",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0238",
             "\1\u0239",
-            "\1\u023a",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u023b",
             "\1\u023c",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "",
+            "\1\u023d",
             "\1\u023e",
             "\1\u023f",
-            "\1\u0240",
-            "\1\u0241",
+            "\1\u0241\4\uffff\1\u0240",
             "\1\u0242",
             "\1\u0243",
-            "",
-            "\1\u0244",
-            "\1\u0245",
-            "\1\u0246",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "\1\u0247",
-            "\1\u0249\2\uffff\1\u0248",
+            "",
+            "\1\u0248",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
             "\1\u024a",
-            "\1\u024b",
-            "\1\u024c",
-            "\1\u024d",
-            "\1\u024f\122\uffff\1\u024e",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
-            "\1\u0251\2\uffff\1\u0250",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u024e",
+            "\1\u024f",
+            "\1\u0250",
+            "\1\u0251",
             "\1\u0252",
             "\1\u0253",
-            "\1\u0254",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
             "",
             "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0255",
             "",
             "\1\u0256",
-            "\1\u0258\2\uffff\1\u0257",
-            "\1\u0259",
-            "",
-            "\1\64\13\uffff\12\64\7\uffff\32\64\4\uffff\1\64\1\uffff\32"+
-            "\64",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0258\15\uffff\1\u0259",
+            "\1\u025a",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u025c",
+            "\1\u025d",
+            "\1\u025e",
+            "\1\u025f",
             "",
             "",
-            "\1\u025c\2\uffff\1\u025b",
             "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0261",
+            "",
+            "\1\u0262",
+            "",
+            "",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0264",
+            "\1\u0265",
+            "\1\u0266",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0268",
+            "",
+            "\1\u0269",
+            "\1\u026a",
+            "",
+            "\1\u026b",
+            "\1\u026c",
+            "\1\u026d",
+            "",
+            "\1\u026e",
+            "\1\u026f",
+            "\1\u0270",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0273",
+            "",
+            "\1\u0274",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0278",
+            "\1\u0279",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u027c",
+            "\1\u027d",
+            "\1\u027e",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "",
+            "\1\u0280",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u0283",
+            "",
+            "",
+            "\1\u0284",
+            "\1\u0285",
+            "\1\u0286",
+            "",
+            "\1\u0287",
+            "",
+            "",
+            "\1\u0288",
+            "\1\u0289",
+            "\1\u028a",
+            "\1\u028b",
+            "\1\u028c",
+            "\1\u028d",
+            "\1\u028e",
+            "\1\u0290\1\uffff\1\u028f",
+            "\1\u0291",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\22\66\1\u0292\7\66",
+            "\1\u0294",
+            "\1\u0295",
+            "\1\u0296",
+            "\1\u0297",
+            "\1\u0299\1\uffff\1\u0298",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u029c",
+            "\1\u029d",
+            "\1\u029e",
+            "\1\u029f",
+            "\1\u02a0",
+            "",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u02a2",
+            "\1\u02a3",
+            "\1\u02a4",
+            "\1\u02a5",
+            "",
+            "\1\u02a6",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "\1\u02a8",
+            "\1\u02a9",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "\1\u02ab",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
+            "",
+            "\1\66\13\uffff\12\66\7\uffff\32\66\4\uffff\1\66\1\uffff\32\66",
             "",
             ""
     };
@@ -5999,7 +5850,7 @@
             this.transition = DFA21_transition;
         }
         public String getDescription() {
-            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             IntStream input = _input;
@@ -6009,39 +5860,39 @@
                         int LA21_0 = input.LA(1);
 
                         s = -1;
-                        if ( (LA21_0=='m') ) {s = 1;}
+                        if ( (LA21_0=='p') ) {s = 1;}
 
                         else if ( (LA21_0=='{') ) {s = 2;}
 
-                        else if ( (LA21_0=='r') ) {s = 3;}
+                        else if ( (LA21_0=='}') ) {s = 3;}
 
-                        else if ( (LA21_0=='i') ) {s = 4;}
+                        else if ( (LA21_0=='m') ) {s = 4;}
 
-                        else if ( (LA21_0=='}') ) {s = 5;}
+                        else if ( (LA21_0=='d') ) {s = 5;}
 
-                        else if ( (LA21_0=='.') ) {s = 6;}
+                        else if ( (LA21_0=='f') ) {s = 6;}
 
-                        else if ( (LA21_0=='*') ) {s = 7;}
+                        else if ( (LA21_0=='r') ) {s = 7;}
 
-                        else if ( (LA21_0=='d') ) {s = 8;}
+                        else if ( (LA21_0=='a') ) {s = 8;}
 
-                        else if ( (LA21_0=='f') ) {s = 9;}
+                        else if ( (LA21_0=='(') ) {s = 9;}
 
-                        else if ( (LA21_0=='a') ) {s = 10;}
+                        else if ( (LA21_0==',') ) {s = 10;}
 
-                        else if ( (LA21_0=='(') ) {s = 11;}
+                        else if ( (LA21_0==')') ) {s = 11;}
 
-                        else if ( (LA21_0==',') ) {s = 12;}
+                        else if ( (LA21_0=='i') ) {s = 12;}
 
-                        else if ( (LA21_0==')') ) {s = 13;}
+                        else if ( (LA21_0=='o') ) {s = 13;}
 
-                        else if ( (LA21_0=='o') ) {s = 14;}
+                        else if ( (LA21_0=='v') ) {s = 14;}
 
-                        else if ( (LA21_0=='v') ) {s = 15;}
+                        else if ( (LA21_0=='b') ) {s = 15;}
 
-                        else if ( (LA21_0=='b') ) {s = 16;}
+                        else if ( (LA21_0=='w') ) {s = 16;}
 
-                        else if ( (LA21_0=='w') ) {s = 17;}
+                        else if ( (LA21_0=='.') ) {s = 17;}
 
                         else if ( (LA21_0=='s') ) {s = 18;}
 
@@ -6051,55 +5902,55 @@
 
                         else if ( (LA21_0=='y') ) {s = 21;}
 
-                        else if ( (LA21_0=='p') ) {s = 22;}
+                        else if ( (LA21_0=='u') ) {s = 22;}
 
-                        else if ( (LA21_0=='u') ) {s = 23;}
+                        else if ( (LA21_0=='n') ) {s = 23;}
 
                         else if ( (LA21_0=='t') ) {s = 24;}
 
                         else if ( (LA21_0=='-') ) {s = 25;}
 
-                        else if ( (LA21_0=='@') ) {s = 26;}
+                        else if ( (LA21_0=='*') ) {s = 26;}
 
-                        else if ( (LA21_0=='=') ) {s = 27;}
+                        else if ( (LA21_0==';') ) {s = 27;}
 
-                        else if ( (LA21_0=='#') ) {s = 28;}
+                        else if ( (LA21_0=='@') ) {s = 28;}
 
-                        else if ( (LA21_0=='[') ) {s = 29;}
+                        else if ( (LA21_0=='=') ) {s = 29;}
 
-                        else if ( (LA21_0==']') ) {s = 30;}
+                        else if ( (LA21_0=='#') ) {s = 30;}
 
-                        else if ( (LA21_0=='+') ) {s = 31;}
+                        else if ( (LA21_0=='[') ) {s = 31;}
 
-                        else if ( (LA21_0=='/') ) {s = 32;}
+                        else if ( (LA21_0==']') ) {s = 32;}
 
-                        else if ( (LA21_0=='%') ) {s = 33;}
+                        else if ( (LA21_0=='+') ) {s = 33;}
 
-                        else if ( (LA21_0=='<') ) {s = 34;}
+                        else if ( (LA21_0=='/') ) {s = 34;}
 
-                        else if ( (LA21_0=='>') ) {s = 35;}
+                        else if ( (LA21_0=='%') ) {s = 35;}
 
-                        else if ( (LA21_0=='|') ) {s = 36;}
+                        else if ( (LA21_0=='<') ) {s = 36;}
 
-                        else if ( (LA21_0=='&') ) {s = 37;}
+                        else if ( (LA21_0=='>') ) {s = 37;}
 
-                        else if ( (LA21_0=='!') ) {s = 38;}
+                        else if ( (LA21_0=='|') ) {s = 38;}
 
-                        else if ( (LA21_0=='?') ) {s = 39;}
+                        else if ( (LA21_0=='&') ) {s = 39;}
 
-                        else if ( (LA21_0==':') ) {s = 40;}
+                        else if ( (LA21_0=='!') ) {s = 40;}
 
-                        else if ( (LA21_0==';') ) {s = 41;}
+                        else if ( (LA21_0=='?') ) {s = 41;}
 
-                        else if ( (LA21_0=='n') ) {s = 42;}
+                        else if ( (LA21_0==':') ) {s = 42;}
 
-                        else if ( (LA21_0=='^') ) {s = 43;}
+                        else if ( (LA21_0=='0') ) {s = 43;}
 
-                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='g' && LA21_0<='h')||(LA21_0>='j' && LA21_0<='l')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 44;}
+                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 44;}
 
-                        else if ( (LA21_0=='0') ) {s = 45;}
+                        else if ( (LA21_0=='^') ) {s = 45;}
 
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 46;}
+                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='Z')||LA21_0=='_'||(LA21_0>='g' && LA21_0<='h')||(LA21_0>='j' && LA21_0<='l')||LA21_0=='q'||LA21_0=='x'||LA21_0=='z') ) {s = 46;}
 
                         else if ( (LA21_0=='\"') ) {s = 47;}
 
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLParser.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLParser.java
index 07e88f8..a99b8a7 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLParser.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSLParser.java
@@ -1,18 +1,4 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-
-package org.eclipse.osbp.xtext.entitymock.parser.antlr.internal; 
+package org.eclipse.osbp.xtext.entitymock.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -34,10 +20,25 @@
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
 @SuppressWarnings("all")
 public class InternalEntityMockDSLParser extends AbstractInternalAntlrParser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_INT", "RULE_ID", "RULE_STRING", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'mock entitymodel for'", "'{'", "'run with priority'", "'import'", "'}'", "'.'", "'*'", "'datainterchanges'", "'datainterchange import'", "'from file'", "'resources'", "'resource'", "'attributes'", "'('", "','", "')'", "'items'", "'objects'", "'object'", "'var'", "'by enum'", "'datatypes'", "'with'", "'switch on'", "'when'", "'embed'", "'defined as'", "'calculate as'", "'based on'", "'randomize'", "'future date'", "'years'", "'past date'", "'boolean'", "'date in range'", "'up to and including'", "'signed double in range'", "'decimals'", "'round to'", "'signed double from'", "'signed integer in range'", "'signed integer from'", "'text from'", "'paragraps'", "'sentences'", "'words'", "'unsigned double in range'", "'unsigned double from'", "'unsigned integer in range'", "'unsigned integer from'", "'datatype'", "'mock entities'", "'mocking'", "'for entity'", "'rows'", "'to'", "'by resource'", "'createBlobMapping'", "'iterate'", "'integer from'", "'until'", "'step'", "'date from'", "'every'", "'yesterday'", "'today'", "'tomorrow'", "'-'", "'as'", "'temporary'", "'by object'", "'calculate based on'", "'using'", "'ref'", "'existing entities'", "'optional for'", "'percent'", "'@'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'::'", "'?.'", "'|'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'extends'", "'static'", "'extension'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'days'", "'weeks'", "'months'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_INT", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'mock'", "'describedBy'", "'priority'", "'datainterchanges'", "'datainterchange'", "'file'", "'resources'", "'resource'", "'attributes'", "'('", "','", "')'", "'items'", "'objects'", "'object'", "'var'", "'byEnum'", "'with'", "'.'", "'switchOn'", "'when'", "'embed'", "'definedAs'", "'calculateAs'", "'basedOn'", "'randomize'", "'future'", "'years'", "'past'", "'boolean'", "'dateRange'", "'from'", "'until'", "'numberRange'", "'decimals'", "'roundTo'", "'numberPick'", "'integerRange'", "'integerPick'", "'textPick'", "'paragraphs'", "'sentences'", "'words'", "'unsignedNumberRange'", "'unsignedNumberPick'", "'unsignedIntegerRange'", "'unsignedIntegerPick'", "'entities'", "'mocking'", "'entity'", "'rows'", "'to'", "'createBlobMapping'", "'iterate'", "'integerFrom'", "'step'", "'dateFrom'", "'every'", "'yesterday'", "'today'", "'tomorrow'", "'-'", "'as'", "'template'", "'byObject'", "'calculateOn'", "'using'", "'ref'", "'existingEntities'", "'optionalFor'", "'percent'", "'import'", "'static'", "'extension'", "'*'", "'ns'", "';'", "'@'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'days'", "'weeks'", "'months'"
     };
     public static final int T__144=144;
     public static final int T__143=143;
@@ -67,10 +68,10 @@
     public static final int T__135=135;
     public static final int T__61=61;
     public static final int T__134=134;
-    public static final int RULE_ID=5;
+    public static final int RULE_ID=4;
     public static final int T__131=131;
     public static final int T__130=130;
-    public static final int RULE_INT=4;
+    public static final int RULE_INT=6;
     public static final int T__66=66;
     public static final int RULE_ML_COMMENT=9;
     public static final int T__67=67;
@@ -154,7 +155,7 @@
     public static final int T__72=72;
     public static final int T__123=123;
     public static final int T__120=120;
-    public static final int RULE_STRING=6;
+    public static final int RULE_STRING=5;
     public static final int RULE_SL_COMMENT=10;
     public static final int T__77=77;
     public static final int T__119=119;
@@ -208,23 +209,23 @@
         
 
     public String[] getTokenNames() { return InternalEntityMockDSLParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g"; }
+    public String getGrammarFileName() { return "InternalEntityMockDSL.g"; }
 
 
 
      	private EntityMockDSLGrammarAccess grammarAccess;
-     	
+
         public InternalEntityMockDSLParser(TokenStream input, EntityMockDSLGrammarAccess grammarAccess) {
             this(input);
             this.grammarAccess = grammarAccess;
             registerRules(grammarAccess.getGrammar());
         }
-        
+
         @Override
         protected String getFirstRuleName() {
-        	return "EntityMockModel";	
+        	return "EntityMockModel";
        	}
-       	
+
        	@Override
        	protected EntityMockDSLGrammarAccess getGrammarAccess() {
        		return grammarAccess;
@@ -232,8 +233,9 @@
 
 
 
+
     // $ANTLR start "entryRuleEntityMockModel"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:68:1: entryRuleEntityMockModel returns [EObject current=null] : iv_ruleEntityMockModel= ruleEntityMockModel EOF ;
+    // InternalEntityMockDSL.g:78:1: entryRuleEntityMockModel returns [EObject current=null] : iv_ruleEntityMockModel= ruleEntityMockModel EOF ;
     public final EObject entryRuleEntityMockModel() throws RecognitionException {
         EObject current = null;
 
@@ -241,13 +243,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:69:2: (iv_ruleEntityMockModel= ruleEntityMockModel EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:70:2: iv_ruleEntityMockModel= ruleEntityMockModel EOF
+            // InternalEntityMockDSL.g:78:56: (iv_ruleEntityMockModel= ruleEntityMockModel EOF )
+            // InternalEntityMockDSL.g:79:2: iv_ruleEntityMockModel= ruleEntityMockModel EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockModelRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockModel_in_entryRuleEntityMockModel75);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockModel=ruleEntityMockModel();
 
             state._fsp--;
@@ -255,16 +257,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockModel; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockModel85); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -273,59 +275,111 @@
 
 
     // $ANTLR start "ruleEntityMockModel"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:77:1: ruleEntityMockModel returns [EObject current=null] : ( (lv_packages_0_0= ruleEntityMockPackage ) )* ;
+    // InternalEntityMockDSL.g:85:1: ruleEntityMockModel returns [EObject current=null] : ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleEntityMockPackage ) )* ) ;
     public final EObject ruleEntityMockModel() throws RecognitionException {
         EObject current = null;
 
-        EObject lv_packages_0_0 = null;
+        EObject lv_importSection_0_0 = null;
+
+        EObject lv_packages_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:80:28: ( ( (lv_packages_0_0= ruleEntityMockPackage ) )* )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:81:1: ( (lv_packages_0_0= ruleEntityMockPackage ) )*
+            // InternalEntityMockDSL.g:91:2: ( ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleEntityMockPackage ) )* ) )
+            // InternalEntityMockDSL.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleEntityMockPackage ) )* )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:81:1: ( (lv_packages_0_0= ruleEntityMockPackage ) )*
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
+            // InternalEntityMockDSL.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleEntityMockPackage ) )* )
+            // InternalEntityMockDSL.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= ruleEntityMockPackage ) )*
+            {
+            // InternalEntityMockDSL.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
 
-                if ( (LA1_0==13) ) {
-                    alt1=1;
+            if ( (LA1_0==87) ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalEntityMockDSL.g:94:4: (lv_importSection_0_0= ruleXImportSection )
+                    {
+                    // InternalEntityMockDSL.g:94:4: (lv_importSection_0_0= ruleXImportSection )
+                    // InternalEntityMockDSL.g:95:5: lv_importSection_0_0= ruleXImportSection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEntityMockModelAccess().getImportSectionXImportSectionParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_3);
+                    lv_importSection_0_0=ruleXImportSection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
+                      					}
+                      					set(
+                      						current,
+                      						"importSection",
+                      						lv_importSection_0_0,
+                      						"org.eclipse.xtext.xbase.Xtype.XImportSection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:112:3: ( (lv_packages_1_0= ruleEntityMockPackage ) )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0==13) ) {
+                    alt2=1;
                 }
 
 
-                switch (alt1) {
+                switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:82:1: (lv_packages_0_0= ruleEntityMockPackage )
+            	    // InternalEntityMockDSL.g:113:4: (lv_packages_1_0= ruleEntityMockPackage )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:82:1: (lv_packages_0_0= ruleEntityMockPackage )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:83:3: lv_packages_0_0= ruleEntityMockPackage
+            	    // InternalEntityMockDSL.g:113:4: (lv_packages_1_0= ruleEntityMockPackage )
+            	    // InternalEntityMockDSL.g:114:5: lv_packages_1_0= ruleEntityMockPackage
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockModelAccess().getPackagesEntityMockPackageParserRuleCall_1_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleEntityMockPackage_in_ruleEntityMockModel130);
-            	    lv_packages_0_0=ruleEntityMockPackage();
+            	    pushFollow(FOLLOW_3);
+            	    lv_packages_1_0=ruleEntityMockPackage();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"packages",
-            	              		lv_packages_0_0, 
-            	              		"EntityMockPackage");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockModelRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"packages",
+            	      						lv_packages_1_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockPackage");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -335,22 +389,27 @@
             	    break;
 
             	default :
-            	    break loop1;
+            	    break loop2;
                 }
             } while (true);
 
 
             }
 
+
+            }
+
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -359,7 +418,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockPackage"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:107:1: entryRuleEntityMockPackage returns [EObject current=null] : iv_ruleEntityMockPackage= ruleEntityMockPackage EOF ;
+    // InternalEntityMockDSL.g:135:1: entryRuleEntityMockPackage returns [EObject current=null] : iv_ruleEntityMockPackage= ruleEntityMockPackage EOF ;
     public final EObject entryRuleEntityMockPackage() throws RecognitionException {
         EObject current = null;
 
@@ -367,13 +426,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:108:2: (iv_ruleEntityMockPackage= ruleEntityMockPackage EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:109:2: iv_ruleEntityMockPackage= ruleEntityMockPackage EOF
+            // InternalEntityMockDSL.g:135:58: (iv_ruleEntityMockPackage= ruleEntityMockPackage EOF )
+            // InternalEntityMockDSL.g:136:2: iv_ruleEntityMockPackage= ruleEntityMockPackage EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockPackageRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockPackage_in_entryRuleEntityMockPackage166);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockPackage=ruleEntityMockPackage();
 
             state._fsp--;
@@ -381,16 +440,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockPackage; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockPackage176); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -399,74 +458,75 @@
 
 
     // $ANTLR start "ruleEntityMockPackage"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:116:1: ruleEntityMockPackage returns [EObject current=null] : (otherlv_0= 'mock entitymodel for' ( (lv_imports_1_0= ruleEntityModelImport ) ) otherlv_2= '{' (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )? (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )* ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )? ( (lv_resources_8_0= ruleEntityMockResources ) )? ( (lv_objects_9_0= ruleEntityMockObjects ) )? ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )? ( (lv_entities_11_0= ruleEntityMockEntities ) ) otherlv_12= '}' ) ;
+    // InternalEntityMockDSL.g:142:1: ruleEntityMockPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )? ) ;
     public final EObject ruleEntityMockPackage() throws RecognitionException {
         EObject current = null;
 
-        Token otherlv_0=null;
-        Token otherlv_2=null;
+        Token otherlv_1=null;
         Token otherlv_3=null;
-        Token lv_runPriority_4_0=null;
         Token otherlv_5=null;
-        Token otherlv_12=null;
-        EObject lv_imports_1_0 = null;
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
 
-        EObject lv_imports_6_0 = null;
-
-        EObject lv_datainterchanges_7_0 = null;
-
-        EObject lv_resources_8_0 = null;
-
-        EObject lv_objects_9_0 = null;
-
-        EObject lv_datatypes_10_0 = null;
-
-        EObject lv_entities_11_0 = null;
+        EObject lv_mocks_4_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:119:28: ( (otherlv_0= 'mock entitymodel for' ( (lv_imports_1_0= ruleEntityModelImport ) ) otherlv_2= '{' (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )? (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )* ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )? ( (lv_resources_8_0= ruleEntityMockResources ) )? ( (lv_objects_9_0= ruleEntityMockObjects ) )? ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )? ( (lv_entities_11_0= ruleEntityMockEntities ) ) otherlv_12= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:120:1: (otherlv_0= 'mock entitymodel for' ( (lv_imports_1_0= ruleEntityModelImport ) ) otherlv_2= '{' (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )? (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )* ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )? ( (lv_resources_8_0= ruleEntityMockResources ) )? ( (lv_objects_9_0= ruleEntityMockObjects ) )? ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )? ( (lv_entities_11_0= ruleEntityMockEntities ) ) otherlv_12= '}' )
+            // InternalEntityMockDSL.g:148:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )? ) )
+            // InternalEntityMockDSL.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:120:1: (otherlv_0= 'mock entitymodel for' ( (lv_imports_1_0= ruleEntityModelImport ) ) otherlv_2= '{' (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )? (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )* ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )? ( (lv_resources_8_0= ruleEntityMockResources ) )? ( (lv_objects_9_0= ruleEntityMockObjects ) )? ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )? ( (lv_entities_11_0= ruleEntityMockEntities ) ) otherlv_12= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:120:3: otherlv_0= 'mock entitymodel for' ( (lv_imports_1_0= ruleEntityModelImport ) ) otherlv_2= '{' (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )? (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )* ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )? ( (lv_resources_8_0= ruleEntityMockResources ) )? ( (lv_objects_9_0= ruleEntityMockObjects ) )? ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )? ( (lv_entities_11_0= ruleEntityMockEntities ) ) otherlv_12= '}'
+            // InternalEntityMockDSL.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )? )
+            // InternalEntityMockDSL.g:150:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )?
             {
-            otherlv_0=(Token)match(input,13,FOLLOW_13_in_ruleEntityMockPackage213); if (state.failed) return current;
+            // InternalEntityMockDSL.g:150:3: ()
+            // InternalEntityMockDSL.g:151:4: 
+            {
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockPackageAccess().getMockEntitymodelForKeyword_0());
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockPackageAccess().getEntityMockPackageAction_0(),
+              					current);
+              			
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:124:1: ( (lv_imports_1_0= ruleEntityModelImport ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:125:1: (lv_imports_1_0= ruleEntityModelImport )
+
+            }
+
+            otherlv_1=(Token)match(input,13,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockPackageAccess().getPackageKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:161:3: ( (lv_name_2_0= ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:162:4: (lv_name_2_0= ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:125:1: (lv_imports_1_0= ruleEntityModelImport )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:126:3: lv_imports_1_0= ruleEntityModelImport
+            // InternalEntityMockDSL.g:162:4: (lv_name_2_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:163:5: lv_name_2_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getImportsEntityModelImportParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEntityMockPackageAccess().getNameQualifiedNameParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleEntityModelImport_in_ruleEntityMockPackage234);
-            lv_imports_1_0=ruleEntityModelImport();
+            pushFollow(FOLLOW_5);
+            lv_name_2_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-              	        }
-                     		add(
-                     			current, 
-                     			"imports",
-                      		lv_imports_1_0, 
-                      		"EntityModelImport");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -474,355 +534,88 @@
 
             }
 
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockPackage246); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:146:1: (otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) ) )?
-            int alt2=2;
-            int LA2_0 = input.LA(1);
-
-            if ( (LA2_0==15) ) {
-                alt2=1;
-            }
-            switch (alt2) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:146:3: otherlv_3= 'run with priority' ( (lv_runPriority_4_0= RULE_INT ) )
-                    {
-                    otherlv_3=(Token)match(input,15,FOLLOW_15_in_ruleEntityMockPackage259); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_3, grammarAccess.getEntityMockPackageAccess().getRunWithPriorityKeyword_3_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:150:1: ( (lv_runPriority_4_0= RULE_INT ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:151:1: (lv_runPriority_4_0= RULE_INT )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:151:1: (lv_runPriority_4_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:152:3: lv_runPriority_4_0= RULE_INT
-                    {
-                    lv_runPriority_4_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleEntityMockPackage276); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      			newLeafNode(lv_runPriority_4_0, grammarAccess.getEntityMockPackageAccess().getRunPriorityINTTerminalRuleCall_3_1_0()); 
-                      		
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockPackageRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"runPriority",
-                              		lv_runPriority_4_0, 
-                              		"INT");
-                      	    
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:168:4: (otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) ) )*
-            loop3:
-            do {
-                int alt3=2;
-                int LA3_0 = input.LA(1);
-
-                if ( (LA3_0==16) ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:168:6: otherlv_5= 'import' ( (lv_imports_6_0= ruleEntityModelImport ) )
-            	    {
-            	    otherlv_5=(Token)match(input,16,FOLLOW_16_in_ruleEntityMockPackage296); if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	          	newLeafNode(otherlv_5, grammarAccess.getEntityMockPackageAccess().getImportKeyword_4_0());
-            	          
-            	    }
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:172:1: ( (lv_imports_6_0= ruleEntityModelImport ) )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:173:1: (lv_imports_6_0= ruleEntityModelImport )
-            	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:173:1: (lv_imports_6_0= ruleEntityModelImport )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:174:3: lv_imports_6_0= ruleEntityModelImport
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getImportsEntityModelImportParserRuleCall_4_1_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleEntityModelImport_in_ruleEntityMockPackage317);
-            	    lv_imports_6_0=ruleEntityModelImport();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"imports",
-            	              		lv_imports_6_0, 
-            	              		"EntityModelImport");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop3;
-                }
-            } while (true);
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:190:4: ( (lv_datainterchanges_7_0= ruleRunningDataInterchanges ) )?
+            // InternalEntityMockDSL.g:180:3: (otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}' )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
-            if ( (LA4_0==20) ) {
+            if ( (LA4_0==14) ) {
                 alt4=1;
             }
             switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:191:1: (lv_datainterchanges_7_0= ruleRunningDataInterchanges )
+                    // InternalEntityMockDSL.g:181:4: otherlv_3= '{' ( (lv_mocks_4_0= ruleEntityMock ) )* otherlv_5= '}'
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:191:1: (lv_datainterchanges_7_0= ruleRunningDataInterchanges )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:192:3: lv_datainterchanges_7_0= ruleRunningDataInterchanges
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_5_0()); 
-                      	    
-                    }
-                    pushFollow(FOLLOW_ruleRunningDataInterchanges_in_ruleEntityMockPackage340);
-                    lv_datainterchanges_7_0=ruleRunningDataInterchanges();
-
-                    state._fsp--;
-                    if (state.failed) return current;
+                    otherlv_3=(Token)match(input,14,FOLLOW_6); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"datainterchanges",
-                              		lv_datainterchanges_7_0, 
-                              		"RunningDataInterchanges");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      				newLeafNode(otherlv_3, grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0());
+                      			
                     }
+                    // InternalEntityMockDSL.g:185:4: ( (lv_mocks_4_0= ruleEntityMock ) )*
+                    loop3:
+                    do {
+                        int alt3=2;
+                        int LA3_0 = input.LA(1);
 
+                        if ( (LA3_0==16) ) {
+                            alt3=1;
+                        }
+
+
+                        switch (alt3) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:186:5: (lv_mocks_4_0= ruleEntityMock )
+                    	    {
+                    	    // InternalEntityMockDSL.g:186:5: (lv_mocks_4_0= ruleEntityMock )
+                    	    // InternalEntityMockDSL.g:187:6: lv_mocks_4_0= ruleEntityMock
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getEntityMockPackageAccess().getMocksEntityMockParserRuleCall_3_1_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_6);
+                    	    lv_mocks_4_0=ruleEntityMock();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"mocks",
+                    	      							lv_mocks_4_0,
+                    	      							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMock");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop3;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2());
+                      			
                     }
 
-
                     }
                     break;
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:208:3: ( (lv_resources_8_0= ruleEntityMockResources ) )?
-            int alt5=2;
-            int LA5_0 = input.LA(1);
-
-            if ( (LA5_0==23) ) {
-                alt5=1;
-            }
-            switch (alt5) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:209:1: (lv_resources_8_0= ruleEntityMockResources )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:209:1: (lv_resources_8_0= ruleEntityMockResources )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:210:3: lv_resources_8_0= ruleEntityMockResources
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getResourcesEntityMockResourcesParserRuleCall_6_0()); 
-                      	    
-                    }
-                    pushFollow(FOLLOW_ruleEntityMockResources_in_ruleEntityMockPackage362);
-                    lv_resources_8_0=ruleEntityMockResources();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"resources",
-                              		lv_resources_8_0, 
-                              		"EntityMockResources");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:226:3: ( (lv_objects_9_0= ruleEntityMockObjects ) )?
-            int alt6=2;
-            int LA6_0 = input.LA(1);
-
-            if ( (LA6_0==30) ) {
-                alt6=1;
-            }
-            switch (alt6) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:227:1: (lv_objects_9_0= ruleEntityMockObjects )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:227:1: (lv_objects_9_0= ruleEntityMockObjects )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:228:3: lv_objects_9_0= ruleEntityMockObjects
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getObjectsEntityMockObjectsParserRuleCall_7_0()); 
-                      	    
-                    }
-                    pushFollow(FOLLOW_ruleEntityMockObjects_in_ruleEntityMockPackage384);
-                    lv_objects_9_0=ruleEntityMockObjects();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"objects",
-                              		lv_objects_9_0, 
-                              		"EntityMockObjects");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:244:3: ( (lv_datatypes_10_0= ruleEntityMockDataTypes ) )?
-            int alt7=2;
-            int LA7_0 = input.LA(1);
-
-            if ( (LA7_0==34) ) {
-                alt7=1;
-            }
-            switch (alt7) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:245:1: (lv_datatypes_10_0= ruleEntityMockDataTypes )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:245:1: (lv_datatypes_10_0= ruleEntityMockDataTypes )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:246:3: lv_datatypes_10_0= ruleEntityMockDataTypes
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getDatatypesEntityMockDataTypesParserRuleCall_8_0()); 
-                      	    
-                    }
-                    pushFollow(FOLLOW_ruleEntityMockDataTypes_in_ruleEntityMockPackage406);
-                    lv_datatypes_10_0=ruleEntityMockDataTypes();
-
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"datatypes",
-                              		lv_datatypes_10_0, 
-                              		"EntityMockDataTypes");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:262:3: ( (lv_entities_11_0= ruleEntityMockEntities ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:263:1: (lv_entities_11_0= ruleEntityMockEntities )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:263:1: (lv_entities_11_0= ruleEntityMockEntities )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:264:3: lv_entities_11_0= ruleEntityMockEntities
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockPackageAccess().getEntitiesEntityMockEntitiesParserRuleCall_9_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleEntityMockEntities_in_ruleEntityMockPackage428);
-            lv_entities_11_0=ruleEntityMockEntities();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockPackageRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"entities",
-                      		lv_entities_11_0, 
-                      		"EntityMockEntities");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_12=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockPackage440); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_12, grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_10());
-                  
-            }
 
             }
 
@@ -830,14 +623,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -845,216 +640,634 @@
     // $ANTLR end "ruleEntityMockPackage"
 
 
-    // $ANTLR start "entryRuleEntityModelImport"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:292:1: entryRuleEntityModelImport returns [EObject current=null] : iv_ruleEntityModelImport= ruleEntityModelImport EOF ;
-    public final EObject entryRuleEntityModelImport() throws RecognitionException {
+    // $ANTLR start "entryRuleEntityMock"
+    // InternalEntityMockDSL.g:213:1: entryRuleEntityMock returns [EObject current=null] : iv_ruleEntityMock= ruleEntityMock EOF ;
+    public final EObject entryRuleEntityMock() throws RecognitionException {
         EObject current = null;
 
-        EObject iv_ruleEntityModelImport = null;
+        EObject iv_ruleEntityMock = null;
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:293:2: (iv_ruleEntityModelImport= ruleEntityModelImport EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:294:2: iv_ruleEntityModelImport= ruleEntityModelImport EOF
+            // InternalEntityMockDSL.g:213:51: (iv_ruleEntityMock= ruleEntityMock EOF )
+            // InternalEntityMockDSL.g:214:2: iv_ruleEntityMock= ruleEntityMock EOF
             {
             if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityModelImportRule()); 
+               newCompositeNode(grammarAccess.getEntityMockRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityModelImport_in_entryRuleEntityModelImport476);
-            iv_ruleEntityModelImport=ruleEntityModelImport();
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMock=ruleEntityMock();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               current =iv_ruleEntityModelImport; 
+               current =iv_ruleEntityMock; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityModelImport486); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
     }
-    // $ANTLR end "entryRuleEntityModelImport"
+    // $ANTLR end "entryRuleEntityMock"
 
 
-    // $ANTLR start "ruleEntityModelImport"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:301:1: ruleEntityModelImport returns [EObject current=null] : ( (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard ) ) ;
-    public final EObject ruleEntityModelImport() throws RecognitionException {
+    // $ANTLR start "ruleEntityMock"
+    // InternalEntityMockDSL.g:220:1: ruleEntityMock returns [EObject current=null] : ( () otherlv_1= 'mock' ( (lv_name_2_0= RULE_ID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )? (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )? ) ;
+    public final EObject ruleEntityMock() throws RecognitionException {
         EObject current = null;
 
-        AntlrDatatypeRuleToken lv_importedNamespace_0_0 = null;
+        Token otherlv_1=null;
+        Token lv_name_2_0=null;
+        Token lv_description_3_0=null;
+        Token lv_descriptionValue_4_0=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token lv_runPriority_8_0=null;
+        Token otherlv_13=null;
+        EObject lv_datainterchanges_9_0 = null;
+
+        EObject lv_resources_10_0 = null;
+
+        EObject lv_objects_11_0 = null;
+
+        EObject lv_entities_12_0 = null;
 
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:304:28: ( ( (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:305:1: ( (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard ) )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:305:1: ( (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:306:1: (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:306:1: (lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:307:3: lv_importedNamespace_0_0= ruleEntityMockQualifiedNameWithWildCard
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityModelImportAccess().getImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleEntityMockQualifiedNameWithWildCard_in_ruleEntityModelImport531);
-            lv_importedNamespace_0_0=ruleEntityMockQualifiedNameWithWildCard();
 
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityModelImportRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"importedNamespace",
-                      		lv_importedNamespace_0_0, 
-                      		"EntityMockQualifiedNameWithWildCard");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityModelImport"
-
-
-    // $ANTLR start "entryRuleEntityMockQualifiedNameWithWildCard"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:331:1: entryRuleEntityMockQualifiedNameWithWildCard returns [String current=null] : iv_ruleEntityMockQualifiedNameWithWildCard= ruleEntityMockQualifiedNameWithWildCard EOF ;
-    public final String entryRuleEntityMockQualifiedNameWithWildCard() throws RecognitionException {
-        String current = null;
-
-        AntlrDatatypeRuleToken iv_ruleEntityMockQualifiedNameWithWildCard = null;
-
+        	enterRule();
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:332:2: (iv_ruleEntityMockQualifiedNameWithWildCard= ruleEntityMockQualifiedNameWithWildCard EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:333:2: iv_ruleEntityMockQualifiedNameWithWildCard= ruleEntityMockQualifiedNameWithWildCard EOF
+            // InternalEntityMockDSL.g:226:2: ( ( () otherlv_1= 'mock' ( (lv_name_2_0= RULE_ID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )? (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )? ) )
+            // InternalEntityMockDSL.g:227:2: ( () otherlv_1= 'mock' ( (lv_name_2_0= RULE_ID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )? (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )? )
+            {
+            // InternalEntityMockDSL.g:227:2: ( () otherlv_1= 'mock' ( (lv_name_2_0= RULE_ID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )? (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )? )
+            // InternalEntityMockDSL.g:228:3: () otherlv_1= 'mock' ( (lv_name_2_0= RULE_ID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )? (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )?
+            {
+            // InternalEntityMockDSL.g:228:3: ()
+            // InternalEntityMockDSL.g:229:4: 
             {
             if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockQualifiedNameWithWildCardRule()); 
-            }
-            pushFollow(FOLLOW_ruleEntityMockQualifiedNameWithWildCard_in_entryRuleEntityMockQualifiedNameWithWildCard567);
-            iv_ruleEntityMockQualifiedNameWithWildCard=ruleEntityMockQualifiedNameWithWildCard();
 
-            state._fsp--;
-            if (state.failed) return current;
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockAccess().getEntityMockAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,16,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockQualifiedNameWithWildCard.getText(); 
+
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockAccess().getMockKeyword_1());
+              		
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockQualifiedNameWithWildCard578); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockQualifiedNameWithWildCard"
-
-
-    // $ANTLR start "ruleEntityMockQualifiedNameWithWildCard"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:340:1: ruleEntityMockQualifiedNameWithWildCard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName (kw= '.' kw= '*' )? ) ;
-    public final AntlrDatatypeRuleToken ruleEntityMockQualifiedNameWithWildCard() throws RecognitionException {
-        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
-
-        Token kw=null;
-        AntlrDatatypeRuleToken this_QualifiedName_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:343:28: ( (this_QualifiedName_0= ruleQualifiedName (kw= '.' kw= '*' )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:344:1: (this_QualifiedName_0= ruleQualifiedName (kw= '.' kw= '*' )? )
+            // InternalEntityMockDSL.g:239:3: ( (lv_name_2_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:240:4: (lv_name_2_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:344:1: (this_QualifiedName_0= ruleQualifiedName (kw= '.' kw= '*' )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:345:5: this_QualifiedName_0= ruleQualifiedName (kw= '.' kw= '*' )?
+            // InternalEntityMockDSL.g:240:4: (lv_name_2_0= RULE_ID )
+            // InternalEntityMockDSL.g:241:5: lv_name_2_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getQualifiedNameParserRuleCall_0()); 
-                  
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockQualifiedNameWithWildCard625);
-            this_QualifiedName_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_7); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		current.merge(this_QualifiedName_0);
-                  
+              					newLeafNode(lv_name_2_0, grammarAccess.getEntityMockAccess().getNameIDTerminalRuleCall_2_0());
+              				
             }
             if ( state.backtracking==0 ) {
-               
-                      afterParserOrEnumRuleCall();
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:355:1: (kw= '.' kw= '*' )?
-            int alt8=2;
-            int LA8_0 = input.LA(1);
 
-            if ( (LA8_0==18) ) {
-                alt8=1;
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            switch (alt8) {
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:257:3: ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) ) )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==17) ) {
+                alt5=1;
+            }
+            switch (alt5) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:356:2: kw= '.' kw= '*'
+                    // InternalEntityMockDSL.g:258:4: ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= RULE_STRING ) )
                     {
-                    kw=(Token)match(input,18,FOLLOW_18_in_ruleEntityMockQualifiedNameWithWildCard644); if (state.failed) return current;
+                    // InternalEntityMockDSL.g:258:4: ( (lv_description_3_0= 'describedBy' ) )
+                    // InternalEntityMockDSL.g:259:5: (lv_description_3_0= 'describedBy' )
+                    {
+                    // InternalEntityMockDSL.g:259:5: (lv_description_3_0= 'describedBy' )
+                    // InternalEntityMockDSL.g:260:6: lv_description_3_0= 'describedBy'
+                    {
+                    lv_description_3_0=(Token)match(input,17,FOLLOW_8); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getFullStopKeyword_1_0()); 
-                          
+                      						newLeafNode(lv_description_3_0, grammarAccess.getEntityMockAccess().getDescriptionDescribedByKeyword_3_0_0());
+                      					
                     }
-                    kw=(Token)match(input,19,FOLLOW_19_in_ruleEntityMockQualifiedNameWithWildCard657); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getEntityMockQualifiedNameWithWildCardAccess().getAsteriskKeyword_1_1()); 
-                          
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockRule());
+                      						}
+                      						setWithLastConsumed(current, "description", true, "describedBy");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:272:4: ( (lv_descriptionValue_4_0= RULE_STRING ) )
+                    // InternalEntityMockDSL.g:273:5: (lv_descriptionValue_4_0= RULE_STRING )
+                    {
+                    // InternalEntityMockDSL.g:273:5: (lv_descriptionValue_4_0= RULE_STRING )
+                    // InternalEntityMockDSL.g:274:6: lv_descriptionValue_4_0= RULE_STRING
+                    {
+                    lv_descriptionValue_4_0=(Token)match(input,RULE_STRING,FOLLOW_5); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_descriptionValue_4_0, grammarAccess.getEntityMockAccess().getDescriptionValueSTRINGTerminalRuleCall_3_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"descriptionValue",
+                      							lv_descriptionValue_4_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:291:3: (otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}' )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==14) ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalEntityMockDSL.g:292:4: otherlv_5= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) ) otherlv_13= '}'
+                    {
+                    otherlv_5=(Token)match(input,14,FOLLOW_9); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:296:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) ) )
+                    // InternalEntityMockDSL.g:297:5: ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) )
+                    {
+                    // InternalEntityMockDSL.g:297:5: ( ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?) )
+                    // InternalEntityMockDSL.g:298:6: ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?)
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+                    // InternalEntityMockDSL.g:301:6: ( ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?)
+                    // InternalEntityMockDSL.g:302:7: ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+ {...}?
+                    {
+                    // InternalEntityMockDSL.g:302:7: ( ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) ) )+
+                    int cnt6=0;
+                    loop6:
+                    do {
+                        int alt6=6;
+                        int LA6_0 = input.LA(1);
+
+                        if ( LA6_0 == 18 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                            alt6=1;
+                        }
+                        else if ( LA6_0 == 19 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                            alt6=2;
+                        }
+                        else if ( LA6_0 == 22 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                            alt6=3;
+                        }
+                        else if ( LA6_0 == 29 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                            alt6=4;
+                        }
+                        else if ( LA6_0 == 63 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                            alt6=5;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:303:5: ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) )
+                    	    {
+                    	    // InternalEntityMockDSL.g:303:5: ({...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:304:6: {...}? => ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0)");
+                    	    }
+                    	    // InternalEntityMockDSL.g:304:110: ( ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:305:7: ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 0);
+                    	    // InternalEntityMockDSL.g:308:10: ({...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) ) )
+                    	    // InternalEntityMockDSL.g:308:11: {...}? => (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:308:20: (otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) ) )
+                    	    // InternalEntityMockDSL.g:308:21: otherlv_7= 'priority' ( (lv_runPriority_8_0= RULE_INT ) )
+                    	    {
+                    	    otherlv_7=(Token)match(input,18,FOLLOW_10); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(otherlv_7, grammarAccess.getEntityMockAccess().getPriorityKeyword_4_1_0_0());
+                    	      									
+                    	    }
+                    	    // InternalEntityMockDSL.g:312:10: ( (lv_runPriority_8_0= RULE_INT ) )
+                    	    // InternalEntityMockDSL.g:313:11: (lv_runPriority_8_0= RULE_INT )
+                    	    {
+                    	    // InternalEntityMockDSL.g:313:11: (lv_runPriority_8_0= RULE_INT )
+                    	    // InternalEntityMockDSL.g:314:12: lv_runPriority_8_0= RULE_INT
+                    	    {
+                    	    lv_runPriority_8_0=(Token)match(input,RULE_INT,FOLLOW_11); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												newLeafNode(lv_runPriority_8_0, grammarAccess.getEntityMockAccess().getRunPriorityINTTerminalRuleCall_4_1_0_1_0());
+                    	      											
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getEntityMockRule());
+                    	      												}
+                    	      												setWithLastConsumed(
+                    	      													current,
+                    	      													"runPriority",
+                    	      													lv_runPriority_8_0,
+                    	      													"org.eclipse.xtext.xbase.Xbase.INT");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalEntityMockDSL.g:336:5: ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) )
+                    	    {
+                    	    // InternalEntityMockDSL.g:336:5: ({...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:337:6: {...}? => ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1)");
+                    	    }
+                    	    // InternalEntityMockDSL.g:337:110: ( ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) ) )
+                    	    // InternalEntityMockDSL.g:338:7: ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 1);
+                    	    // InternalEntityMockDSL.g:341:10: ({...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) ) )
+                    	    // InternalEntityMockDSL.g:341:11: {...}? => ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:341:20: ( (lv_datainterchanges_9_0= ruleRunningDataInterchanges ) )
+                    	    // InternalEntityMockDSL.g:341:21: (lv_datainterchanges_9_0= ruleRunningDataInterchanges )
+                    	    {
+                    	    // InternalEntityMockDSL.g:341:21: (lv_datainterchanges_9_0= ruleRunningDataInterchanges )
+                    	    // InternalEntityMockDSL.g:342:11: lv_datainterchanges_9_0= ruleRunningDataInterchanges
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getEntityMockAccess().getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_11);
+                    	    lv_datainterchanges_9_0=ruleRunningDataInterchanges();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getEntityMockRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"datainterchanges",
+                    	      												lv_datainterchanges_9_0,
+                    	      												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchanges");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalEntityMockDSL.g:364:5: ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) )
+                    	    {
+                    	    // InternalEntityMockDSL.g:364:5: ({...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:365:6: {...}? => ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2)");
+                    	    }
+                    	    // InternalEntityMockDSL.g:365:110: ( ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) ) )
+                    	    // InternalEntityMockDSL.g:366:7: ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 2);
+                    	    // InternalEntityMockDSL.g:369:10: ({...}? => ( (lv_resources_10_0= ruleEntityMockResources ) ) )
+                    	    // InternalEntityMockDSL.g:369:11: {...}? => ( (lv_resources_10_0= ruleEntityMockResources ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:369:20: ( (lv_resources_10_0= ruleEntityMockResources ) )
+                    	    // InternalEntityMockDSL.g:369:21: (lv_resources_10_0= ruleEntityMockResources )
+                    	    {
+                    	    // InternalEntityMockDSL.g:369:21: (lv_resources_10_0= ruleEntityMockResources )
+                    	    // InternalEntityMockDSL.g:370:11: lv_resources_10_0= ruleEntityMockResources
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getEntityMockAccess().getResourcesEntityMockResourcesParserRuleCall_4_1_2_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_11);
+                    	    lv_resources_10_0=ruleEntityMockResources();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getEntityMockRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"resources",
+                    	      												lv_resources_10_0,
+                    	      												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResources");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalEntityMockDSL.g:392:5: ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) )
+                    	    {
+                    	    // InternalEntityMockDSL.g:392:5: ({...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:393:6: {...}? => ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3)");
+                    	    }
+                    	    // InternalEntityMockDSL.g:393:110: ( ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) ) )
+                    	    // InternalEntityMockDSL.g:394:7: ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 3);
+                    	    // InternalEntityMockDSL.g:397:10: ({...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) ) )
+                    	    // InternalEntityMockDSL.g:397:11: {...}? => ( (lv_objects_11_0= ruleEntityMockObjects ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:397:20: ( (lv_objects_11_0= ruleEntityMockObjects ) )
+                    	    // InternalEntityMockDSL.g:397:21: (lv_objects_11_0= ruleEntityMockObjects )
+                    	    {
+                    	    // InternalEntityMockDSL.g:397:21: (lv_objects_11_0= ruleEntityMockObjects )
+                    	    // InternalEntityMockDSL.g:398:11: lv_objects_11_0= ruleEntityMockObjects
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getEntityMockAccess().getObjectsEntityMockObjectsParserRuleCall_4_1_3_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_11);
+                    	    lv_objects_11_0=ruleEntityMockObjects();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getEntityMockRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"objects",
+                    	      												lv_objects_11_0,
+                    	      												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjects");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalEntityMockDSL.g:420:5: ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) )
+                    	    {
+                    	    // InternalEntityMockDSL.g:420:5: ({...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:421:6: {...}? => ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4)");
+                    	    }
+                    	    // InternalEntityMockDSL.g:421:110: ( ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) ) )
+                    	    // InternalEntityMockDSL.g:422:7: ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1(), 4);
+                    	    // InternalEntityMockDSL.g:425:10: ({...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) ) )
+                    	    // InternalEntityMockDSL.g:425:11: {...}? => ( (lv_entities_12_0= ruleEntityMockEntities ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMock", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:425:20: ( (lv_entities_12_0= ruleEntityMockEntities ) )
+                    	    // InternalEntityMockDSL.g:425:21: (lv_entities_12_0= ruleEntityMockEntities )
+                    	    {
+                    	    // InternalEntityMockDSL.g:425:21: (lv_entities_12_0= ruleEntityMockEntities )
+                    	    // InternalEntityMockDSL.g:426:11: lv_entities_12_0= ruleEntityMockEntities
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											newCompositeNode(grammarAccess.getEntityMockAccess().getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0());
+                    	      										
+                    	    }
+                    	    pushFollow(FOLLOW_11);
+                    	    lv_entities_12_0=ruleEntityMockEntities();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      											if (current==null) {
+                    	      												current = createModelElementForParent(grammarAccess.getEntityMockRule());
+                    	      											}
+                    	      											set(
+                    	      												current,
+                    	      												"entities",
+                    	      												lv_entities_12_0,
+                    	      												"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntities");
+                    	      											afterParserOrEnumRuleCall();
+                    	      										
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt6 >= 1 ) break loop6;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(6, input);
+                                throw eee;
+                        }
+                        cnt6++;
+                    } while (true);
+
+                    if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1()) ) {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        throw new FailedPredicateException(input, "ruleEntityMock", "getUnorderedGroupHelper().canLeave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1())");
+                    }
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getEntityMockAccess().getUnorderedGroup_4_1());
+
+                    }
+
+                    otherlv_13=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2());
+                      			
                     }
 
                     }
@@ -1069,23 +1282,25 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
     }
-    // $ANTLR end "ruleEntityMockQualifiedNameWithWildCard"
+    // $ANTLR end "ruleEntityMock"
 
 
     // $ANTLR start "entryRuleRunningDataInterchanges"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:375:1: entryRuleRunningDataInterchanges returns [EObject current=null] : iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF ;
+    // InternalEntityMockDSL.g:465:1: entryRuleRunningDataInterchanges returns [EObject current=null] : iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF ;
     public final EObject entryRuleRunningDataInterchanges() throws RecognitionException {
         EObject current = null;
 
@@ -1093,13 +1308,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:376:2: (iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:377:2: iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF
+            // InternalEntityMockDSL.g:465:64: (iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF )
+            // InternalEntityMockDSL.g:466:2: iv_ruleRunningDataInterchanges= ruleRunningDataInterchanges EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getRunningDataInterchangesRule()); 
             }
-            pushFollow(FOLLOW_ruleRunningDataInterchanges_in_entryRuleRunningDataInterchanges699);
+            pushFollow(FOLLOW_1);
             iv_ruleRunningDataInterchanges=ruleRunningDataInterchanges();
 
             state._fsp--;
@@ -1107,16 +1322,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleRunningDataInterchanges; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleRunningDataInterchanges709); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1125,7 +1340,7 @@
 
 
     // $ANTLR start "ruleRunningDataInterchanges"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:384:1: ruleRunningDataInterchanges returns [EObject current=null] : ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' ) ;
+    // InternalEntityMockDSL.g:472:1: ruleRunningDataInterchanges returns [EObject current=null] : ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' ) ;
     public final EObject ruleRunningDataInterchanges() throws RecognitionException {
         EObject current = null;
 
@@ -1135,80 +1350,414 @@
         EObject lv_datainterchanges_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:387:28: ( ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:388:1: ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:478:2: ( ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' ) )
+            // InternalEntityMockDSL.g:479:2: ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:388:1: ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:388:2: () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}'
+            // InternalEntityMockDSL.g:479:2: ( () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:480:3: () otherlv_1= 'datainterchanges' otherlv_2= '{' ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )* otherlv_4= '}'
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:388:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:389:5: 
+            // InternalEntityMockDSL.g:480:3: ()
+            // InternalEntityMockDSL.g:481:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getRunningDataInterchangesAccess().getRunningDataInterchangesAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,20,FOLLOW_20_in_ruleRunningDataInterchanges755); if (state.failed) return current;
+            otherlv_1=(Token)match(input,19,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleRunningDataInterchanges767); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangesAccess().getLeftCurlyBracketKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:402:1: ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )*
-            loop9:
+            // InternalEntityMockDSL.g:495:3: ( (lv_datainterchanges_3_0= ruleRunningDataInterchange ) )*
+            loop8:
             do {
-                int alt9=2;
-                int LA9_0 = input.LA(1);
+                int alt8=2;
+                int LA8_0 = input.LA(1);
 
-                if ( (LA9_0==21) ) {
-                    alt9=1;
+                if ( (LA8_0==20) ) {
+                    alt8=1;
                 }
 
 
-                switch (alt9) {
+                switch (alt8) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:403:1: (lv_datainterchanges_3_0= ruleRunningDataInterchange )
+            	    // InternalEntityMockDSL.g:496:4: (lv_datainterchanges_3_0= ruleRunningDataInterchange )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:403:1: (lv_datainterchanges_3_0= ruleRunningDataInterchange )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:404:3: lv_datainterchanges_3_0= ruleRunningDataInterchange
+            	    // InternalEntityMockDSL.g:496:4: (lv_datainterchanges_3_0= ruleRunningDataInterchange )
+            	    // InternalEntityMockDSL.g:497:5: lv_datainterchanges_3_0= ruleRunningDataInterchange
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getRunningDataInterchangesAccess().getDatainterchangesRunningDataInterchangeParserRuleCall_3_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleRunningDataInterchange_in_ruleRunningDataInterchanges788);
+            	    pushFollow(FOLLOW_13);
             	    lv_datainterchanges_3_0=ruleRunningDataInterchange();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getRunningDataInterchangesRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"datainterchanges",
-            	              		lv_datainterchanges_3_0, 
-            	              		"RunningDataInterchange");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getRunningDataInterchangesRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"datainterchanges",
+            	      						lv_datainterchanges_3_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchange");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRunningDataInterchanges"
+
+
+    // $ANTLR start "entryRuleRunningDataInterchange"
+    // InternalEntityMockDSL.g:522:1: entryRuleRunningDataInterchange returns [EObject current=null] : iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF ;
+    public final EObject entryRuleRunningDataInterchange() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleRunningDataInterchange = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:522:63: (iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF )
+            // InternalEntityMockDSL.g:523:2: iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRunningDataInterchangeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleRunningDataInterchange=ruleRunningDataInterchange();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleRunningDataInterchange; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleRunningDataInterchange"
+
+
+    // $ANTLR start "ruleRunningDataInterchange"
+    // InternalEntityMockDSL.g:529:1: ruleRunningDataInterchange returns [EObject current=null] : ( () otherlv_1= 'datainterchange' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'file' ( (lv_fileURL_4_0= RULE_STRING ) ) ) ;
+    public final EObject ruleRunningDataInterchange() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token lv_fileURL_4_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:535:2: ( ( () otherlv_1= 'datainterchange' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'file' ( (lv_fileURL_4_0= RULE_STRING ) ) ) )
+            // InternalEntityMockDSL.g:536:2: ( () otherlv_1= 'datainterchange' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'file' ( (lv_fileURL_4_0= RULE_STRING ) ) )
+            {
+            // InternalEntityMockDSL.g:536:2: ( () otherlv_1= 'datainterchange' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'file' ( (lv_fileURL_4_0= RULE_STRING ) ) )
+            // InternalEntityMockDSL.g:537:3: () otherlv_1= 'datainterchange' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'file' ( (lv_fileURL_4_0= RULE_STRING ) )
+            {
+            // InternalEntityMockDSL.g:537:3: ()
+            // InternalEntityMockDSL.g:538:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,20,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:548:3: ( (otherlv_2= RULE_ID ) )
+            // InternalEntityMockDSL.g:549:4: (otherlv_2= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:549:4: (otherlv_2= RULE_ID )
+            // InternalEntityMockDSL.g:550:5: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
+              					}
+              				
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getRunningDataInterchangeAccess().getFileKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:565:3: ( (lv_fileURL_4_0= RULE_STRING ) )
+            // InternalEntityMockDSL.g:566:4: (lv_fileURL_4_0= RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:566:4: (lv_fileURL_4_0= RULE_STRING )
+            // InternalEntityMockDSL.g:567:5: lv_fileURL_4_0= RULE_STRING
+            {
+            lv_fileURL_4_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_fileURL_4_0, grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"fileURL",
+              						lv_fileURL_4_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRunningDataInterchange"
+
+
+    // $ANTLR start "entryRuleEntityMockResources"
+    // InternalEntityMockDSL.g:587:1: entryRuleEntityMockResources returns [EObject current=null] : iv_ruleEntityMockResources= ruleEntityMockResources EOF ;
+    public final EObject entryRuleEntityMockResources() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockResources = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:587:60: (iv_ruleEntityMockResources= ruleEntityMockResources EOF )
+            // InternalEntityMockDSL.g:588:2: iv_ruleEntityMockResources= ruleEntityMockResources EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockResourcesRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockResources=ruleEntityMockResources();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockResources; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockResources"
+
+
+    // $ANTLR start "ruleEntityMockResources"
+    // InternalEntityMockDSL.g:594:1: ruleEntityMockResources returns [EObject current=null] : ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' ) ;
+    public final EObject ruleEntityMockResources() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_resources_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:600:2: ( ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' ) )
+            // InternalEntityMockDSL.g:601:2: ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' )
+            {
+            // InternalEntityMockDSL.g:601:2: ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:602:3: () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}'
+            {
+            // InternalEntityMockDSL.g:602:3: ()
+            // InternalEntityMockDSL.g:603:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,22,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,14,FOLLOW_15); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:617:3: ( (lv_resources_3_0= ruleEntityMockResource ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( (LA9_0==23) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:618:4: (lv_resources_3_0= ruleEntityMockResource )
+            	    {
+            	    // InternalEntityMockDSL.g:618:4: (lv_resources_3_0= ruleEntityMockResource )
+            	    // InternalEntityMockDSL.g:619:5: lv_resources_3_0= ruleEntityMockResource
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_15);
+            	    lv_resources_3_0=ruleEntityMockResource();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockResourcesRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"resources",
+            	      						lv_resources_3_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResource");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -1222,173 +1771,12 @@
                 }
             } while (true);
 
-            otherlv_4=(Token)match(input,17,FOLLOW_17_in_ruleRunningDataInterchanges801); if (state.failed) return current;
+            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getRunningDataInterchangesAccess().getRightCurlyBracketKeyword_4());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleRunningDataInterchanges"
-
-
-    // $ANTLR start "entryRuleRunningDataInterchange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:432:1: entryRuleRunningDataInterchange returns [EObject current=null] : iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF ;
-    public final EObject entryRuleRunningDataInterchange() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleRunningDataInterchange = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:433:2: (iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:434:2: iv_ruleRunningDataInterchange= ruleRunningDataInterchange EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getRunningDataInterchangeRule()); 
-            }
-            pushFollow(FOLLOW_ruleRunningDataInterchange_in_entryRuleRunningDataInterchange837);
-            iv_ruleRunningDataInterchange=ruleRunningDataInterchange();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleRunningDataInterchange; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleRunningDataInterchange847); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleRunningDataInterchange"
-
-
-    // $ANTLR start "ruleRunningDataInterchange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:441:1: ruleRunningDataInterchange returns [EObject current=null] : ( () otherlv_1= 'datainterchange import' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from file' ( (lv_fileURL_4_0= RULE_STRING ) ) ) ;
-    public final EObject ruleRunningDataInterchange() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_1=null;
-        Token otherlv_2=null;
-        Token otherlv_3=null;
-        Token lv_fileURL_4_0=null;
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:444:28: ( ( () otherlv_1= 'datainterchange import' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from file' ( (lv_fileURL_4_0= RULE_STRING ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:445:1: ( () otherlv_1= 'datainterchange import' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from file' ( (lv_fileURL_4_0= RULE_STRING ) ) )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:445:1: ( () otherlv_1= 'datainterchange import' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from file' ( (lv_fileURL_4_0= RULE_STRING ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:445:2: () otherlv_1= 'datainterchange import' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from file' ( (lv_fileURL_4_0= RULE_STRING ) )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:445:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:446:5: 
-            {
-            if ( state.backtracking==0 ) {
-
-                      current = forceCreateModelElement(
-                          grammarAccess.getRunningDataInterchangeAccess().getRunningDataInterchangeAction_0(),
-                          current);
-                  
-            }
-
-            }
-
-            otherlv_1=(Token)match(input,21,FOLLOW_21_in_ruleRunningDataInterchange893); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_1, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeImportKeyword_1());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:455:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:456:1: (otherlv_2= RULE_ID )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:456:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:457:3: otherlv_2= RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
-              	        }
-                      
-            }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleRunningDataInterchange913); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              		newLeafNode(otherlv_2, grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeCrossReference_2_0()); 
-              	
-            }
-
-            }
-
-
-            }
-
-            otherlv_3=(Token)match(input,22,FOLLOW_22_in_ruleRunningDataInterchange925); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_3, grammarAccess.getRunningDataInterchangeAccess().getFromFileKeyword_3());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:472:1: ( (lv_fileURL_4_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:473:1: (lv_fileURL_4_0= RULE_STRING )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:473:1: (lv_fileURL_4_0= RULE_STRING )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:474:3: lv_fileURL_4_0= RULE_STRING
-            {
-            lv_fileURL_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleRunningDataInterchange942); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_fileURL_4_0, grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0()); 
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getRunningDataInterchangeRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"fileURL",
-                      		lv_fileURL_4_0, 
-                      		"STRING");
-              	    
-            }
-
-            }
-
-
-            }
-
 
             }
 
@@ -1396,180 +1784,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleRunningDataInterchange"
-
-
-    // $ANTLR start "entryRuleEntityMockResources"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:498:1: entryRuleEntityMockResources returns [EObject current=null] : iv_ruleEntityMockResources= ruleEntityMockResources EOF ;
-    public final EObject entryRuleEntityMockResources() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockResources = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:499:2: (iv_ruleEntityMockResources= ruleEntityMockResources EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:500:2: iv_ruleEntityMockResources= ruleEntityMockResources EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockResourcesRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockResources_in_entryRuleEntityMockResources983);
-            iv_ruleEntityMockResources=ruleEntityMockResources();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockResources; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockResources993); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockResources"
-
-
-    // $ANTLR start "ruleEntityMockResources"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:507:1: ruleEntityMockResources returns [EObject current=null] : ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' ) ;
-    public final EObject ruleEntityMockResources() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_1=null;
-        Token otherlv_2=null;
-        Token otherlv_4=null;
-        EObject lv_resources_3_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:510:28: ( ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:511:1: ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:511:1: ( () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:511:2: () otherlv_1= 'resources' otherlv_2= '{' ( (lv_resources_3_0= ruleEntityMockResource ) )* otherlv_4= '}'
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:511:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:512:5: 
-            {
-            if ( state.backtracking==0 ) {
-
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockResourcesAccess().getEntityMockResourcesAction_0(),
-                          current);
-                  
-            }
-
-            }
-
-            otherlv_1=(Token)match(input,23,FOLLOW_23_in_ruleEntityMockResources1039); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_1, grammarAccess.getEntityMockResourcesAccess().getResourcesKeyword_1());
-                  
-            }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockResources1051); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourcesAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:525:1: ( (lv_resources_3_0= ruleEntityMockResource ) )*
-            loop10:
-            do {
-                int alt10=2;
-                int LA10_0 = input.LA(1);
-
-                if ( (LA10_0==24) ) {
-                    alt10=1;
-                }
-
-
-                switch (alt10) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:526:1: (lv_resources_3_0= ruleEntityMockResource )
-            	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:526:1: (lv_resources_3_0= ruleEntityMockResource )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:527:3: lv_resources_3_0= ruleEntityMockResource
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockResourcesAccess().getResourcesEntityMockResourceParserRuleCall_3_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleEntityMockResource_in_ruleEntityMockResources1072);
-            	    lv_resources_3_0=ruleEntityMockResource();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockResourcesRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"resources",
-            	              		lv_resources_3_0, 
-            	              		"EntityMockResource");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop10;
-                }
-            } while (true);
-
-            otherlv_4=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockResources1085); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourcesAccess().getRightCurlyBracketKeyword_4());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
         finally {
         }
         return current;
@@ -1578,7 +1802,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockResource"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:555:1: entryRuleEntityMockResource returns [EObject current=null] : iv_ruleEntityMockResource= ruleEntityMockResource EOF ;
+    // InternalEntityMockDSL.g:644:1: entryRuleEntityMockResource returns [EObject current=null] : iv_ruleEntityMockResource= ruleEntityMockResource EOF ;
     public final EObject entryRuleEntityMockResource() throws RecognitionException {
         EObject current = null;
 
@@ -1586,13 +1810,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:556:2: (iv_ruleEntityMockResource= ruleEntityMockResource EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:557:2: iv_ruleEntityMockResource= ruleEntityMockResource EOF
+            // InternalEntityMockDSL.g:644:59: (iv_ruleEntityMockResource= ruleEntityMockResource EOF )
+            // InternalEntityMockDSL.g:645:2: iv_ruleEntityMockResource= ruleEntityMockResource EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockResourceRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockResource_in_entryRuleEntityMockResource1121);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockResource=ruleEntityMockResource();
 
             state._fsp--;
@@ -1600,16 +1824,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockResource; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockResource1131); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1618,11 +1842,12 @@
 
 
     // $ANTLR start "ruleEntityMockResource"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:564:1: ruleEntityMockResource returns [EObject current=null] : (otherlv_0= 'resource' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' ) ;
+    // InternalEntityMockDSL.g:651:1: ruleEntityMockResource returns [EObject current=null] : (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' ) ;
     public final EObject ruleEntityMockResource() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token otherlv_3=null;
         Token otherlv_4=null;
@@ -1632,135 +1857,129 @@
         Token otherlv_9=null;
         Token otherlv_11=null;
         Token otherlv_12=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
         EObject lv_attributes_5_0 = null;
 
         EObject lv_datarows_10_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:567:28: ( (otherlv_0= 'resource' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:568:1: (otherlv_0= 'resource' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' )
+            // InternalEntityMockDSL.g:657:2: ( (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' ) )
+            // InternalEntityMockDSL.g:658:2: (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:568:1: (otherlv_0= 'resource' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:568:3: otherlv_0= 'resource' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}'
+            // InternalEntityMockDSL.g:658:2: (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}' )
+            // InternalEntityMockDSL.g:659:3: otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )? otherlv_8= 'items' otherlv_9= '{' ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )* otherlv_11= '}' otherlv_12= '}'
             {
-            otherlv_0=(Token)match(input,24,FOLLOW_24_in_ruleEntityMockResource1168); if (state.failed) return current;
+            otherlv_0=(Token)match(input,23,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockResourceAccess().getResourceKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:572:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:573:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:663:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:664:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:573:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:574:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:664:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:665:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockResource1189);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockResource1201); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockResourceRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:594:1: (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )?
-            int alt13=2;
-            int LA13_0 = input.LA(1);
 
-            if ( (LA13_0==25) ) {
-                alt13=1;
             }
-            switch (alt13) {
+
+
+            }
+
+            otherlv_2=(Token)match(input,14,FOLLOW_16); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:685:3: (otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')' )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==24) ) {
+                alt12=1;
+            }
+            switch (alt12) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:594:3: otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')'
+                    // InternalEntityMockDSL.g:686:4: otherlv_3= 'attributes' otherlv_4= '(' ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )* otherlv_7= ')'
                     {
-                    otherlv_3=(Token)match(input,25,FOLLOW_25_in_ruleEntityMockResource1214); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,24,FOLLOW_17); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_3, grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0());
-                          
+                      				newLeafNode(otherlv_3, grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0());
+                      			
                     }
-                    otherlv_4=(Token)match(input,26,FOLLOW_26_in_ruleEntityMockResource1226); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,25,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:602:1: ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )*
-                    loop12:
+                    // InternalEntityMockDSL.g:694:4: ( ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )? )*
+                    loop11:
                     do {
-                        int alt12=2;
-                        int LA12_0 = input.LA(1);
+                        int alt11=2;
+                        int LA11_0 = input.LA(1);
 
-                        if ( (LA12_0==RULE_ID) ) {
-                            alt12=1;
+                        if ( (LA11_0==RULE_ID) ) {
+                            alt11=1;
                         }
 
 
-                        switch (alt12) {
+                        switch (alt11) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:602:2: ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )?
+                    	    // InternalEntityMockDSL.g:695:5: ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) ) (otherlv_6= ',' )?
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:602:2: ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:603:1: (lv_attributes_5_0= ruleEntityMockResourceAttribute )
+                    	    // InternalEntityMockDSL.g:695:5: ( (lv_attributes_5_0= ruleEntityMockResourceAttribute ) )
+                    	    // InternalEntityMockDSL.g:696:6: (lv_attributes_5_0= ruleEntityMockResourceAttribute )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:603:1: (lv_attributes_5_0= ruleEntityMockResourceAttribute )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:604:3: lv_attributes_5_0= ruleEntityMockResourceAttribute
+                    	    // InternalEntityMockDSL.g:696:6: (lv_attributes_5_0= ruleEntityMockResourceAttribute )
+                    	    // InternalEntityMockDSL.g:697:7: lv_attributes_5_0= ruleEntityMockResourceAttribute
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockResourceAccess().getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockResourceAttribute_in_ruleEntityMockResource1248);
+                    	    pushFollow(FOLLOW_19);
                     	    lv_attributes_5_0=ruleEntityMockResourceAttribute();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"attributes",
-                    	              		lv_attributes_5_0, 
-                    	              		"EntityMockResourceAttribute");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"attributes",
+                    	      								lv_attributes_5_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceAttribute");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -1768,22 +1987,22 @@
 
                     	    }
 
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:620:2: (otherlv_6= ',' )?
-                    	    int alt11=2;
-                    	    int LA11_0 = input.LA(1);
+                    	    // InternalEntityMockDSL.g:714:5: (otherlv_6= ',' )?
+                    	    int alt10=2;
+                    	    int LA10_0 = input.LA(1);
 
-                    	    if ( (LA11_0==27) ) {
-                    	        alt11=1;
+                    	    if ( (LA10_0==26) ) {
+                    	        alt10=1;
                     	    }
-                    	    switch (alt11) {
+                    	    switch (alt10) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:620:4: otherlv_6= ','
+                    	            // InternalEntityMockDSL.g:715:6: otherlv_6= ','
                     	            {
-                    	            otherlv_6=(Token)match(input,27,FOLLOW_27_in_ruleEntityMockResource1261); if (state.failed) return current;
+                    	            otherlv_6=(Token)match(input,26,FOLLOW_18); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	                  	newLeafNode(otherlv_6, grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1());
-                    	                  
+                    	              						newLeafNode(otherlv_6, grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1());
+                    	              					
                     	            }
 
                     	            }
@@ -1796,15 +2015,15 @@
                     	    break;
 
                     	default :
-                    	    break loop12;
+                    	    break loop11;
                         }
                     } while (true);
 
-                    otherlv_7=(Token)match(input,28,FOLLOW_28_in_ruleEntityMockResource1277); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,27,FOLLOW_20); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3());
+                      			
                     }
 
                     }
@@ -1812,58 +2031,58 @@
 
             }
 
-            otherlv_8=(Token)match(input,29,FOLLOW_29_in_ruleEntityMockResource1291); if (state.failed) return current;
+            otherlv_8=(Token)match(input,28,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_8, grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4());
-                  
+              			newLeafNode(otherlv_8, grammarAccess.getEntityMockResourceAccess().getItemsKeyword_4());
+              		
             }
-            otherlv_9=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockResource1303); if (state.failed) return current;
+            otherlv_9=(Token)match(input,14,FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_9, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5());
-                  
+              			newLeafNode(otherlv_9, grammarAccess.getEntityMockResourceAccess().getLeftCurlyBracketKeyword_5());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:636:1: ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )*
-            loop14:
+            // InternalEntityMockDSL.g:734:3: ( (lv_datarows_10_0= ruleEntityMockResourceDataRow ) )*
+            loop13:
             do {
-                int alt14=2;
-                int LA14_0 = input.LA(1);
+                int alt13=2;
+                int LA13_0 = input.LA(1);
 
-                if ( (LA14_0==RULE_ID) ) {
-                    alt14=1;
+                if ( (LA13_0==RULE_ID) ) {
+                    alt13=1;
                 }
 
 
-                switch (alt14) {
+                switch (alt13) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:637:1: (lv_datarows_10_0= ruleEntityMockResourceDataRow )
+            	    // InternalEntityMockDSL.g:735:4: (lv_datarows_10_0= ruleEntityMockResourceDataRow )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:637:1: (lv_datarows_10_0= ruleEntityMockResourceDataRow )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:638:3: lv_datarows_10_0= ruleEntityMockResourceDataRow
+            	    // InternalEntityMockDSL.g:735:4: (lv_datarows_10_0= ruleEntityMockResourceDataRow )
+            	    // InternalEntityMockDSL.g:736:5: lv_datarows_10_0= ruleEntityMockResourceDataRow
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockResourceAccess().getDatarowsEntityMockResourceDataRowParserRuleCall_6_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleEntityMockResourceDataRow_in_ruleEntityMockResource1324);
+            	    pushFollow(FOLLOW_21);
             	    lv_datarows_10_0=ruleEntityMockResourceDataRow();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"datarows",
-            	              		lv_datarows_10_0, 
-            	              		"EntityMockResourceDataRow");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockResourceRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"datarows",
+            	      						lv_datarows_10_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceDataRow");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -1873,21 +2092,21 @@
             	    break;
 
             	default :
-            	    break loop14;
+            	    break loop13;
                 }
             } while (true);
 
-            otherlv_11=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockResource1337); if (state.failed) return current;
+            otherlv_11=(Token)match(input,15,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_11, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7());
-                  
+              			newLeafNode(otherlv_11, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_7());
+              		
             }
-            otherlv_12=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockResource1349); if (state.failed) return current;
+            otherlv_12=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_12, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8());
-                  
+              			newLeafNode(otherlv_12, grammarAccess.getEntityMockResourceAccess().getRightCurlyBracketKeyword_8());
+              		
             }
 
             }
@@ -1896,14 +2115,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1912,7 +2133,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockResourceAttribute"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:670:1: entryRuleEntityMockResourceAttribute returns [EObject current=null] : iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF ;
+    // InternalEntityMockDSL.g:765:1: entryRuleEntityMockResourceAttribute returns [EObject current=null] : iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF ;
     public final EObject entryRuleEntityMockResourceAttribute() throws RecognitionException {
         EObject current = null;
 
@@ -1920,13 +2141,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:671:2: (iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:672:2: iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF
+            // InternalEntityMockDSL.g:765:68: (iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF )
+            // InternalEntityMockDSL.g:766:2: iv_ruleEntityMockResourceAttribute= ruleEntityMockResourceAttribute EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockResourceAttributeRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockResourceAttribute_in_entryRuleEntityMockResourceAttribute1385);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockResourceAttribute=ruleEntityMockResourceAttribute();
 
             state._fsp--;
@@ -1934,16 +2155,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockResourceAttribute; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockResourceAttribute1395); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1952,63 +2173,58 @@
 
 
     // $ANTLR start "ruleEntityMockResourceAttribute"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:679:1: ruleEntityMockResourceAttribute returns [EObject current=null] : ( () ( (lv_name_1_0= ruleQualifiedName ) ) ) ;
+    // InternalEntityMockDSL.g:772:1: ruleEntityMockResourceAttribute returns [EObject current=null] : ( () ( (lv_name_1_0= RULE_ID ) ) ) ;
     public final EObject ruleEntityMockResourceAttribute() throws RecognitionException {
         EObject current = null;
 
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
+        Token lv_name_1_0=null;
 
 
-         enterRule(); 
-            
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:682:28: ( ( () ( (lv_name_1_0= ruleQualifiedName ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:683:1: ( () ( (lv_name_1_0= ruleQualifiedName ) ) )
+            // InternalEntityMockDSL.g:778:2: ( ( () ( (lv_name_1_0= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:779:2: ( () ( (lv_name_1_0= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:683:1: ( () ( (lv_name_1_0= ruleQualifiedName ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:683:2: () ( (lv_name_1_0= ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:779:2: ( () ( (lv_name_1_0= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:780:3: () ( (lv_name_1_0= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:683:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:684:5: 
+            // InternalEntityMockDSL.g:780:3: ()
+            // InternalEntityMockDSL.g:781:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockResourceAttributeAccess().getEntityMockResourceAttributeAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:689:2: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:690:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:787:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:788:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:690:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:691:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:788:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:789:5: lv_name_1_0= RULE_ID
             {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockResourceAttributeAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockResourceAttribute1450);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockResourceAttributeRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockResourceAttributeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -2023,14 +2239,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2039,7 +2257,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockResourceDataRow"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:715:1: entryRuleEntityMockResourceDataRow returns [EObject current=null] : iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF ;
+    // InternalEntityMockDSL.g:809:1: entryRuleEntityMockResourceDataRow returns [EObject current=null] : iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF ;
     public final EObject entryRuleEntityMockResourceDataRow() throws RecognitionException {
         EObject current = null;
 
@@ -2047,13 +2265,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:716:2: (iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:717:2: iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF
+            // InternalEntityMockDSL.g:809:66: (iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF )
+            // InternalEntityMockDSL.g:810:2: iv_ruleEntityMockResourceDataRow= ruleEntityMockResourceDataRow EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockResourceDataRowRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockResourceDataRow_in_entryRuleEntityMockResourceDataRow1486);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockResourceDataRow=ruleEntityMockResourceDataRow();
 
             state._fsp--;
@@ -2061,16 +2279,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockResourceDataRow; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockResourceDataRow1496); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2079,67 +2297,62 @@
 
 
     // $ANTLR start "ruleEntityMockResourceDataRow"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:724:1: ruleEntityMockResourceDataRow returns [EObject current=null] : ( () ( (lv_name_1_0= ruleQualifiedName ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? ) ;
+    // InternalEntityMockDSL.g:816:1: ruleEntityMockResourceDataRow returns [EObject current=null] : ( () ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? ) ;
     public final EObject ruleEntityMockResourceDataRow() throws RecognitionException {
         EObject current = null;
 
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token lv_values_3_0=null;
         Token otherlv_4=null;
         Token otherlv_5=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
 
 
-         enterRule(); 
-            
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:727:28: ( ( () ( (lv_name_1_0= ruleQualifiedName ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:728:1: ( () ( (lv_name_1_0= ruleQualifiedName ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? )
+            // InternalEntityMockDSL.g:822:2: ( ( () ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? ) )
+            // InternalEntityMockDSL.g:823:2: ( () ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:728:1: ( () ( (lv_name_1_0= ruleQualifiedName ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:728:2: () ( (lv_name_1_0= ruleQualifiedName ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )?
+            // InternalEntityMockDSL.g:823:2: ( () ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )? )
+            // InternalEntityMockDSL.g:824:3: () ( (lv_name_1_0= RULE_ID ) ) (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:728:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:729:5: 
+            // InternalEntityMockDSL.g:824:3: ()
+            // InternalEntityMockDSL.g:825:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockResourceDataRowAccess().getEntityMockResourceDataRowAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:734:2: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:735:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:831:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:832:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:735:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:736:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:832:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:833:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockResourceDataRowAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockResourceDataRow1551);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_23); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockResourceDataRowRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockResourceDataRowAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
 
             }
@@ -2147,61 +2360,61 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:752:2: (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )?
-            int alt17=2;
-            int LA17_0 = input.LA(1);
+            // InternalEntityMockDSL.g:849:3: (otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
 
-            if ( (LA17_0==26) ) {
-                alt17=1;
+            if ( (LA16_0==25) ) {
+                alt16=1;
             }
-            switch (alt17) {
+            switch (alt16) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:752:4: otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
+                    // InternalEntityMockDSL.g:850:4: otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
                     {
-                    otherlv_2=(Token)match(input,26,FOLLOW_26_in_ruleEntityMockResourceDataRow1564); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,25,FOLLOW_24); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0());
-                          
+                      				newLeafNode(otherlv_2, grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:756:1: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
-                    loop16:
+                    // InternalEntityMockDSL.g:854:4: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
+                    loop15:
                     do {
-                        int alt16=2;
-                        int LA16_0 = input.LA(1);
+                        int alt15=2;
+                        int LA15_0 = input.LA(1);
 
-                        if ( (LA16_0==RULE_STRING) ) {
-                            alt16=1;
+                        if ( (LA15_0==RULE_STRING) ) {
+                            alt15=1;
                         }
 
 
-                        switch (alt16) {
+                        switch (alt15) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:756:2: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
+                    	    // InternalEntityMockDSL.g:855:5: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:756:2: ( (lv_values_3_0= RULE_STRING ) )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:757:1: (lv_values_3_0= RULE_STRING )
+                    	    // InternalEntityMockDSL.g:855:5: ( (lv_values_3_0= RULE_STRING ) )
+                    	    // InternalEntityMockDSL.g:856:6: (lv_values_3_0= RULE_STRING )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:757:1: (lv_values_3_0= RULE_STRING )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:758:3: lv_values_3_0= RULE_STRING
+                    	    // InternalEntityMockDSL.g:856:6: (lv_values_3_0= RULE_STRING )
+                    	    // InternalEntityMockDSL.g:857:7: lv_values_3_0= RULE_STRING
                     	    {
-                    	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleEntityMockResourceDataRow1582); if (state.failed) return current;
+                    	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_25); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0()); 
-                    	      		
+                    	      							newLeafNode(lv_values_3_0, grammarAccess.getEntityMockResourceDataRowAccess().getValuesSTRINGTerminalRuleCall_2_1_0_0());
+                    	      						
                     	    }
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
-                    	      	        }
-                    	             		addWithLastConsumed(
-                    	             			current, 
-                    	             			"values",
-                    	              		lv_values_3_0, 
-                    	              		"STRING");
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getEntityMockResourceDataRowRule());
+                    	      							}
+                    	      							addWithLastConsumed(
+                    	      								current,
+                    	      								"values",
+                    	      								lv_values_3_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.STRING");
+                    	      						
                     	    }
 
                     	    }
@@ -2209,22 +2422,22 @@
 
                     	    }
 
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:774:2: (otherlv_4= ',' )?
-                    	    int alt15=2;
-                    	    int LA15_0 = input.LA(1);
+                    	    // InternalEntityMockDSL.g:873:5: (otherlv_4= ',' )?
+                    	    int alt14=2;
+                    	    int LA14_0 = input.LA(1);
 
-                    	    if ( (LA15_0==27) ) {
-                    	        alt15=1;
+                    	    if ( (LA14_0==26) ) {
+                    	        alt14=1;
                     	    }
-                    	    switch (alt15) {
+                    	    switch (alt14) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:774:4: otherlv_4= ','
+                    	            // InternalEntityMockDSL.g:874:6: otherlv_4= ','
                     	            {
-                    	            otherlv_4=(Token)match(input,27,FOLLOW_27_in_ruleEntityMockResourceDataRow1600); if (state.failed) return current;
+                    	            otherlv_4=(Token)match(input,26,FOLLOW_24); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1());
-                    	                  
+                    	              						newLeafNode(otherlv_4, grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1());
+                    	              					
                     	            }
 
                     	            }
@@ -2237,15 +2450,15 @@
                     	    break;
 
                     	default :
-                    	    break loop16;
+                    	    break loop15;
                         }
                     } while (true);
 
-                    otherlv_5=(Token)match(input,28,FOLLOW_28_in_ruleEntityMockResourceDataRow1616); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_5, grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2());
+                      			
                     }
 
                     }
@@ -2260,14 +2473,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2276,7 +2491,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjects"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:790:1: entryRuleEntityMockObjects returns [EObject current=null] : iv_ruleEntityMockObjects= ruleEntityMockObjects EOF ;
+    // InternalEntityMockDSL.g:889:1: entryRuleEntityMockObjects returns [EObject current=null] : iv_ruleEntityMockObjects= ruleEntityMockObjects EOF ;
     public final EObject entryRuleEntityMockObjects() throws RecognitionException {
         EObject current = null;
 
@@ -2284,13 +2499,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:791:2: (iv_ruleEntityMockObjects= ruleEntityMockObjects EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:792:2: iv_ruleEntityMockObjects= ruleEntityMockObjects EOF
+            // InternalEntityMockDSL.g:889:58: (iv_ruleEntityMockObjects= ruleEntityMockObjects EOF )
+            // InternalEntityMockDSL.g:890:2: iv_ruleEntityMockObjects= ruleEntityMockObjects EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectsRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjects_in_entryRuleEntityMockObjects1654);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjects=ruleEntityMockObjects();
 
             state._fsp--;
@@ -2298,16 +2513,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjects; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjects1664); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2316,7 +2531,7 @@
 
 
     // $ANTLR start "ruleEntityMockObjects"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:799:1: ruleEntityMockObjects returns [EObject current=null] : ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' ) ;
+    // InternalEntityMockDSL.g:896:1: ruleEntityMockObjects returns [EObject current=null] : ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' ) ;
     public final EObject ruleEntityMockObjects() throws RecognitionException {
         EObject current = null;
 
@@ -2326,80 +2541,284 @@
         EObject lv_objects_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:802:28: ( ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:803:1: ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:902:2: ( ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' ) )
+            // InternalEntityMockDSL.g:903:2: ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:803:1: ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:803:2: () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}'
+            // InternalEntityMockDSL.g:903:2: ( () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:904:3: () otherlv_1= 'objects' otherlv_2= '{' ( (lv_objects_3_0= ruleEntityMockObject ) )* otherlv_4= '}'
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:803:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:804:5: 
+            // InternalEntityMockDSL.g:904:3: ()
+            // InternalEntityMockDSL.g:905:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockObjectsAccess().getEntityMockObjectsAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,30,FOLLOW_30_in_ruleEntityMockObjects1710); if (state.failed) return current;
+            otherlv_1=(Token)match(input,29,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectsAccess().getObjectsKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockObjects1722); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_26); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectsAccess().getLeftCurlyBracketKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:817:1: ( (lv_objects_3_0= ruleEntityMockObject ) )*
-            loop18:
+            // InternalEntityMockDSL.g:919:3: ( (lv_objects_3_0= ruleEntityMockObject ) )*
+            loop17:
             do {
-                int alt18=2;
-                int LA18_0 = input.LA(1);
+                int alt17=2;
+                int LA17_0 = input.LA(1);
 
-                if ( (LA18_0==31) ) {
-                    alt18=1;
+                if ( (LA17_0==30) ) {
+                    alt17=1;
                 }
 
 
-                switch (alt18) {
+                switch (alt17) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:818:1: (lv_objects_3_0= ruleEntityMockObject )
+            	    // InternalEntityMockDSL.g:920:4: (lv_objects_3_0= ruleEntityMockObject )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:818:1: (lv_objects_3_0= ruleEntityMockObject )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:819:3: lv_objects_3_0= ruleEntityMockObject
+            	    // InternalEntityMockDSL.g:920:4: (lv_objects_3_0= ruleEntityMockObject )
+            	    // InternalEntityMockDSL.g:921:5: lv_objects_3_0= ruleEntityMockObject
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockObjectsAccess().getObjectsEntityMockObjectParserRuleCall_3_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleEntityMockObject_in_ruleEntityMockObjects1743);
+            	    pushFollow(FOLLOW_26);
             	    lv_objects_3_0=ruleEntityMockObject();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectsRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"objects",
-            	              		lv_objects_3_0, 
-            	              		"EntityMockObject");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockObjectsRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"objects",
+            	      						lv_objects_3_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObject");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockObjects"
+
+
+    // $ANTLR start "entryRuleEntityMockObject"
+    // InternalEntityMockDSL.g:946:1: entryRuleEntityMockObject returns [EObject current=null] : iv_ruleEntityMockObject= ruleEntityMockObject EOF ;
+    public final EObject entryRuleEntityMockObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockObject = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:946:57: (iv_ruleEntityMockObject= ruleEntityMockObject EOF )
+            // InternalEntityMockDSL.g:947:2: iv_ruleEntityMockObject= ruleEntityMockObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockObjectRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockObject=ruleEntityMockObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockObject; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockObject"
+
+
+    // $ANTLR start "ruleEntityMockObject"
+    // InternalEntityMockDSL.g:953:1: ruleEntityMockObject returns [EObject current=null] : (otherlv_0= 'object' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' ) ;
+    public final EObject ruleEntityMockObject() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        EObject lv_enumerations_3_0 = null;
+
+        EObject lv_attributes_4_0 = null;
+
+        EObject lv_calculations_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:959:2: ( (otherlv_0= 'object' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' ) )
+            // InternalEntityMockDSL.g:960:2: (otherlv_0= 'object' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' )
+            {
+            // InternalEntityMockDSL.g:960:2: (otherlv_0= 'object' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' )
+            // InternalEntityMockDSL.g:961:3: otherlv_0= 'object' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}'
+            {
+            otherlv_0=(Token)match(input,30,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:965:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:966:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:966:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:967:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,14,FOLLOW_27); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:987:3: ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )*
+            loop18:
+            do {
+                int alt18=2;
+                int LA18_0 = input.LA(1);
+
+                if ( (LA18_0==31) ) {
+                    int LA18_1 = input.LA(2);
+
+                    if ( (LA18_1==RULE_ID) ) {
+                        int LA18_3 = input.LA(3);
+
+                        if ( (LA18_3==32) ) {
+                            alt18=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt18) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:988:4: (lv_enumerations_3_0= ruleEntityMockObjectEnum )
+            	    {
+            	    // InternalEntityMockDSL.g:988:4: (lv_enumerations_3_0= ruleEntityMockObjectEnum )
+            	    // InternalEntityMockDSL.g:989:5: lv_enumerations_3_0= ruleEntityMockObjectEnum
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_27);
+            	    lv_enumerations_3_0=ruleEntityMockObjectEnum();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"enumerations",
+            	      						lv_enumerations_3_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectEnum");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -2413,181 +2832,61 @@
                 }
             } while (true);
 
-            otherlv_4=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockObjects1756); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectsAccess().getRightCurlyBracketKeyword_4());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityMockObjects"
-
-
-    // $ANTLR start "entryRuleEntityMockObject"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:847:1: entryRuleEntityMockObject returns [EObject current=null] : iv_ruleEntityMockObject= ruleEntityMockObject EOF ;
-    public final EObject entryRuleEntityMockObject() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockObject = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:848:2: (iv_ruleEntityMockObject= ruleEntityMockObject EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:849:2: iv_ruleEntityMockObject= ruleEntityMockObject EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockObjectRule()); 
-            }
-            pushFollow(FOLLOW_ruleEntityMockObject_in_entryRuleEntityMockObject1792);
-            iv_ruleEntityMockObject=ruleEntityMockObject();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockObject; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObject1802); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockObject"
-
-
-    // $ANTLR start "ruleEntityMockObject"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:856:1: ruleEntityMockObject returns [EObject current=null] : (otherlv_0= 'object' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' ) ;
-    public final EObject ruleEntityMockObject() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_0=null;
-        Token otherlv_2=null;
-        Token otherlv_6=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
-        EObject lv_enumerations_3_0 = null;
-
-        EObject lv_attributes_4_0 = null;
-
-        EObject lv_calculations_5_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:859:28: ( (otherlv_0= 'object' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:860:1: (otherlv_0= 'object' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:860:1: (otherlv_0= 'object' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:860:3: otherlv_0= 'object' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )* ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )* ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )* otherlv_6= '}'
-            {
-            otherlv_0=(Token)match(input,31,FOLLOW_31_in_ruleEntityMockObject1839); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectAccess().getObjectKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:864:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:865:1: (lv_name_1_0= ruleQualifiedName )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:865:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:866:3: lv_name_1_0= ruleQualifiedName
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObject1860);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockObject1872); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:886:1: ( (lv_enumerations_3_0= ruleEntityMockObjectEnum ) )*
+            // InternalEntityMockDSL.g:1006:3: ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )*
             loop19:
             do {
                 int alt19=2;
-                alt19 = dfa19.predict(input);
+                int LA19_0 = input.LA(1);
+
+                if ( (LA19_0==31) ) {
+                    int LA19_1 = input.LA(2);
+
+                    if ( (LA19_1==RULE_ID) ) {
+                        int LA19_4 = input.LA(3);
+
+                        if ( (LA19_4==25||LA19_4==33||LA19_4==35||LA19_4==41) ) {
+                            alt19=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA19_0==37) ) {
+                    alt19=1;
+                }
+
+
                 switch (alt19) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:887:1: (lv_enumerations_3_0= ruleEntityMockObjectEnum )
+            	    // InternalEntityMockDSL.g:1007:4: (lv_attributes_4_0= ruleIEntityMockObjectAttribute )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:887:1: (lv_enumerations_3_0= ruleEntityMockObjectEnum )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:888:3: lv_enumerations_3_0= ruleEntityMockObjectEnum
+            	    // InternalEntityMockDSL.g:1007:4: (lv_attributes_4_0= ruleIEntityMockObjectAttribute )
+            	    // InternalEntityMockDSL.g:1008:5: lv_attributes_4_0= ruleIEntityMockObjectAttribute
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getEnumerationsEntityMockObjectEnumParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleEntityMockObjectEnum_in_ruleEntityMockObject1893);
-            	    lv_enumerations_3_0=ruleEntityMockObjectEnum();
+            	    pushFollow(FOLLOW_27);
+            	    lv_attributes_4_0=ruleIEntityMockObjectAttribute();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"enumerations",
-            	              		lv_enumerations_3_0, 
-            	              		"EntityMockObjectEnum");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"attributes",
+            	      						lv_attributes_4_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockObjectAttribute");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -2601,40 +2900,46 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:904:3: ( (lv_attributes_4_0= ruleIEntityMockObjectAttribute ) )*
+            // InternalEntityMockDSL.g:1025:3: ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )*
             loop20:
             do {
                 int alt20=2;
-                alt20 = dfa20.predict(input);
+                int LA20_0 = input.LA(1);
+
+                if ( (LA20_0==31) ) {
+                    alt20=1;
+                }
+
+
                 switch (alt20) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:905:1: (lv_attributes_4_0= ruleIEntityMockObjectAttribute )
+            	    // InternalEntityMockDSL.g:1026:4: (lv_calculations_5_0= ruleEntityMockObjectFunction )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:905:1: (lv_attributes_4_0= ruleIEntityMockObjectAttribute )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:906:3: lv_attributes_4_0= ruleIEntityMockObjectAttribute
+            	    // InternalEntityMockDSL.g:1026:4: (lv_calculations_5_0= ruleEntityMockObjectFunction )
+            	    // InternalEntityMockDSL.g:1027:5: lv_calculations_5_0= ruleEntityMockObjectFunction
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getAttributesIEntityMockObjectAttributeParserRuleCall_4_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleIEntityMockObjectAttribute_in_ruleEntityMockObject1915);
-            	    lv_attributes_4_0=ruleIEntityMockObjectAttribute();
+            	    pushFollow(FOLLOW_28);
+            	    lv_calculations_5_0=ruleEntityMockObjectFunction();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"attributes",
-            	              		lv_attributes_4_0, 
-            	              		"IEntityMockObjectAttribute");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"calculations",
+            	      						lv_calculations_5_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunction");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -2648,64 +2953,11 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:922:3: ( (lv_calculations_5_0= ruleEntityMockObjectFunction ) )*
-            loop21:
-            do {
-                int alt21=2;
-                int LA21_0 = input.LA(1);
-
-                if ( (LA21_0==32) ) {
-                    alt21=1;
-                }
-
-
-                switch (alt21) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:923:1: (lv_calculations_5_0= ruleEntityMockObjectFunction )
-            	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:923:1: (lv_calculations_5_0= ruleEntityMockObjectFunction )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:924:3: lv_calculations_5_0= ruleEntityMockObjectFunction
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockObjectAccess().getCalculationsEntityMockObjectFunctionParserRuleCall_5_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleEntityMockObjectFunction_in_ruleEntityMockObject1937);
-            	    lv_calculations_5_0=ruleEntityMockObjectFunction();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"calculations",
-            	              		lv_calculations_5_0, 
-            	              		"EntityMockObjectFunction");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop21;
-                }
-            } while (true);
-
-            otherlv_6=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockObject1950); if (state.failed) return current;
+            otherlv_6=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectAccess().getRightCurlyBracketKeyword_6());
+              		
             }
 
             }
@@ -2714,14 +2966,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2730,7 +2984,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectEnum"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:952:1: entryRuleEntityMockObjectEnum returns [EObject current=null] : iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF ;
+    // InternalEntityMockDSL.g:1052:1: entryRuleEntityMockObjectEnum returns [EObject current=null] : iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF ;
     public final EObject entryRuleEntityMockObjectEnum() throws RecognitionException {
         EObject current = null;
 
@@ -2738,13 +2992,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:953:2: (iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:954:2: iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF
+            // InternalEntityMockDSL.g:1052:61: (iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF )
+            // InternalEntityMockDSL.g:1053:2: iv_ruleEntityMockObjectEnum= ruleEntityMockObjectEnum EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectEnumRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectEnum_in_entryRuleEntityMockObjectEnum1986);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectEnum=ruleEntityMockObjectEnum();
 
             state._fsp--;
@@ -2752,16 +3006,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectEnum; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectEnum1996); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2770,90 +3024,85 @@
 
 
     // $ANTLR start "ruleEntityMockObjectEnum"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:961:1: ruleEntityMockObjectEnum returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'by enum' ( (otherlv_3= RULE_ID ) ) ) ;
+    // InternalEntityMockDSL.g:1059:1: ruleEntityMockObjectEnum returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byEnum' ( (otherlv_3= RULE_ID ) ) ) ;
     public final EObject ruleEntityMockObjectEnum() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token otherlv_3=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
 
 
-         enterRule(); 
-            
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:964:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'by enum' ( (otherlv_3= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:965:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'by enum' ( (otherlv_3= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1065:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byEnum' ( (otherlv_3= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:1066:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byEnum' ( (otherlv_3= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:965:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'by enum' ( (otherlv_3= RULE_ID ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:965:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'by enum' ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:1066:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byEnum' ( (otherlv_3= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1067:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byEnum' ( (otherlv_3= RULE_ID ) )
             {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectEnum2033); if (state.failed) return current;
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectEnumAccess().getVarKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:969:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:970:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:1071:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1072:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:970:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:971:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:1072:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1073:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectEnumAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectEnum2054);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_29); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectEnumRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,33,FOLLOW_33_in_ruleEntityMockObjectEnum2066); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:991:1: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:992:1: (otherlv_3= RULE_ID )
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,32,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectEnumAccess().getByEnumKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1093:3: ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:1094:4: (otherlv_3= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:992:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:993:3: otherlv_3= RULE_ID
+            // InternalEntityMockDSL.g:1094:4: (otherlv_3= RULE_ID )
+            // InternalEntityMockDSL.g:1095:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectEnumRule());
+              					}
+              				
             }
-            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectEnum2086); if (state.failed) return current;
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0()); 
-              	
+              					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumCrossReference_3_0());
+              				
             }
 
             }
@@ -2868,14 +3117,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2883,174 +3134,8 @@
     // $ANTLR end "ruleEntityMockObjectEnum"
 
 
-    // $ANTLR start "entryRuleEntityMockDataTypes"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1012:1: entryRuleEntityMockDataTypes returns [EObject current=null] : iv_ruleEntityMockDataTypes= ruleEntityMockDataTypes EOF ;
-    public final EObject entryRuleEntityMockDataTypes() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockDataTypes = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1013:2: (iv_ruleEntityMockDataTypes= ruleEntityMockDataTypes EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1014:2: iv_ruleEntityMockDataTypes= ruleEntityMockDataTypes EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockDataTypesRule()); 
-            }
-            pushFollow(FOLLOW_ruleEntityMockDataTypes_in_entryRuleEntityMockDataTypes2122);
-            iv_ruleEntityMockDataTypes=ruleEntityMockDataTypes();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockDataTypes; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockDataTypes2132); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockDataTypes"
-
-
-    // $ANTLR start "ruleEntityMockDataTypes"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1021:1: ruleEntityMockDataTypes returns [EObject current=null] : ( () otherlv_1= 'datatypes' otherlv_2= '{' ( (lv_datatypes_3_0= ruleEntityMockDataType ) )* otherlv_4= '}' ) ;
-    public final EObject ruleEntityMockDataTypes() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_1=null;
-        Token otherlv_2=null;
-        Token otherlv_4=null;
-        EObject lv_datatypes_3_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1024:28: ( ( () otherlv_1= 'datatypes' otherlv_2= '{' ( (lv_datatypes_3_0= ruleEntityMockDataType ) )* otherlv_4= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1025:1: ( () otherlv_1= 'datatypes' otherlv_2= '{' ( (lv_datatypes_3_0= ruleEntityMockDataType ) )* otherlv_4= '}' )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1025:1: ( () otherlv_1= 'datatypes' otherlv_2= '{' ( (lv_datatypes_3_0= ruleEntityMockDataType ) )* otherlv_4= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1025:2: () otherlv_1= 'datatypes' otherlv_2= '{' ( (lv_datatypes_3_0= ruleEntityMockDataType ) )* otherlv_4= '}'
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1025:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1026:5: 
-            {
-            if ( state.backtracking==0 ) {
-
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockDataTypesAccess().getEntityMockDataTypesAction_0(),
-                          current);
-                  
-            }
-
-            }
-
-            otherlv_1=(Token)match(input,34,FOLLOW_34_in_ruleEntityMockDataTypes2178); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_1, grammarAccess.getEntityMockDataTypesAccess().getDatatypesKeyword_1());
-                  
-            }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockDataTypes2190); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockDataTypesAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1039:1: ( (lv_datatypes_3_0= ruleEntityMockDataType ) )*
-            loop22:
-            do {
-                int alt22=2;
-                int LA22_0 = input.LA(1);
-
-                if ( (LA22_0==63) ) {
-                    alt22=1;
-                }
-
-
-                switch (alt22) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1040:1: (lv_datatypes_3_0= ruleEntityMockDataType )
-            	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1040:1: (lv_datatypes_3_0= ruleEntityMockDataType )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1041:3: lv_datatypes_3_0= ruleEntityMockDataType
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockDataTypesAccess().getDatatypesEntityMockDataTypeParserRuleCall_3_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleEntityMockDataType_in_ruleEntityMockDataTypes2211);
-            	    lv_datatypes_3_0=ruleEntityMockDataType();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockDataTypesRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"datatypes",
-            	              		lv_datatypes_3_0, 
-            	              		"EntityMockDataType");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop22;
-                }
-            } while (true);
-
-            otherlv_4=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockDataTypes2224); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockDataTypesAccess().getRightCurlyBracketKeyword_4());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityMockDataTypes"
-
-
     // $ANTLR start "entryRuleIEntityMockObjectAttribute"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1071:1: entryRuleIEntityMockObjectAttribute returns [EObject current=null] : iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF ;
+    // InternalEntityMockDSL.g:1110:1: entryRuleIEntityMockObjectAttribute returns [EObject current=null] : iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF ;
     public final EObject entryRuleIEntityMockObjectAttribute() throws RecognitionException {
         EObject current = null;
 
@@ -3058,13 +3143,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1072:2: (iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1073:2: iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF
+            // InternalEntityMockDSL.g:1110:67: (iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF )
+            // InternalEntityMockDSL.g:1111:2: iv_ruleIEntityMockObjectAttribute= ruleIEntityMockObjectAttribute EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIEntityMockObjectAttributeRule()); 
             }
-            pushFollow(FOLLOW_ruleIEntityMockObjectAttribute_in_entryRuleIEntityMockObjectAttribute2262);
+            pushFollow(FOLLOW_1);
             iv_ruleIEntityMockObjectAttribute=ruleIEntityMockObjectAttribute();
 
             state._fsp--;
@@ -3072,16 +3157,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleIEntityMockObjectAttribute; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleIEntityMockObjectAttribute2272); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3090,7 +3175,7 @@
 
 
     // $ANTLR start "ruleIEntityMockObjectAttribute"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1080:1: ruleIEntityMockObjectAttribute returns [EObject current=null] : (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill ) ;
+    // InternalEntityMockDSL.g:1117:1: ruleIEntityMockObjectAttribute returns [EObject current=null] : (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill ) ;
     public final EObject ruleIEntityMockObjectAttribute() throws RecognitionException {
         EObject current = null;
 
@@ -3105,122 +3190,176 @@
         EObject this_EntityMockObjectFill_4 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1083:28: ( (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1084:1: (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill )
+            // InternalEntityMockDSL.g:1123:2: ( (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill ) )
+            // InternalEntityMockDSL.g:1124:2: (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1084:1: (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill )
-            int alt23=5;
-            alt23 = dfa23.predict(input);
-            switch (alt23) {
+            // InternalEntityMockDSL.g:1124:2: (this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue | this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue | this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue | this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed | this_EntityMockObjectFill_4= ruleEntityMockObjectFill )
+            int alt21=5;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==31) ) {
+                int LA21_1 = input.LA(2);
+
+                if ( (LA21_1==RULE_ID) ) {
+                    switch ( input.LA(3) ) {
+                    case 33:
+                        {
+                        alt21=1;
+                        }
+                        break;
+                    case 35:
+                        {
+                        alt21=3;
+                        }
+                        break;
+                    case 41:
+                        {
+                        alt21=5;
+                        }
+                        break;
+                    case 25:
+                        {
+                        alt21=2;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 21, 3, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 21, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA21_0==37) ) {
+                alt21=4;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 21, 0, input);
+
+                throw nvae;
+            }
+            switch (alt21) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1085:5: this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue
+                    // InternalEntityMockDSL.g:1125:3: this_EntityMockObjectResourceValue_0= ruleEntityMockObjectResourceValue
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectResourceValueParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectResourceValue_in_ruleIEntityMockObjectAttribute2319);
+                    pushFollow(FOLLOW_2);
                     this_EntityMockObjectResourceValue_0=ruleEntityMockObjectResourceValue();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_EntityMockObjectResourceValue_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_EntityMockObjectResourceValue_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1095:5: this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue
+                    // InternalEntityMockDSL.g:1134:3: this_EntityMockObjectPlainValue_1= ruleEntityMockObjectPlainValue
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectPlainValueParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectPlainValue_in_ruleIEntityMockObjectAttribute2346);
+                    pushFollow(FOLLOW_2);
                     this_EntityMockObjectPlainValue_1=ruleEntityMockObjectPlainValue();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_EntityMockObjectPlainValue_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_EntityMockObjectPlainValue_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1105:5: this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue
+                    // InternalEntityMockDSL.g:1143:3: this_EntityMockObjectArrayValue_2= ruleEntityMockObjectArrayValue
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectArrayValueParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectArrayValue_in_ruleIEntityMockObjectAttribute2373);
+                    pushFollow(FOLLOW_2);
                     this_EntityMockObjectArrayValue_2=ruleEntityMockObjectArrayValue();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_EntityMockObjectArrayValue_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_EntityMockObjectArrayValue_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1115:5: this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed
+                    // InternalEntityMockDSL.g:1152:3: this_EntityMockObjectEmbed_3= ruleEntityMockObjectEmbed
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectEmbedParserRuleCall_3());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectEmbed_in_ruleIEntityMockObjectAttribute2400);
+                    pushFollow(FOLLOW_2);
                     this_EntityMockObjectEmbed_3=ruleEntityMockObjectEmbed();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_EntityMockObjectEmbed_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_EntityMockObjectEmbed_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1125:5: this_EntityMockObjectFill_4= ruleEntityMockObjectFill
+                    // InternalEntityMockDSL.g:1161:3: this_EntityMockObjectFill_4= ruleEntityMockObjectFill
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIEntityMockObjectAttributeAccess().getEntityMockObjectFillParserRuleCall_4());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectFill_in_ruleIEntityMockObjectAttribute2427);
+                    pushFollow(FOLLOW_2);
                     this_EntityMockObjectFill_4=ruleEntityMockObjectFill();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_EntityMockObjectFill_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_EntityMockObjectFill_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -3232,14 +3371,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3248,7 +3389,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectPlainValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1141:1: entryRuleEntityMockObjectPlainValue returns [EObject current=null] : iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF ;
+    // InternalEntityMockDSL.g:1173:1: entryRuleEntityMockObjectPlainValue returns [EObject current=null] : iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF ;
     public final EObject entryRuleEntityMockObjectPlainValue() throws RecognitionException {
         EObject current = null;
 
@@ -3256,13 +3397,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1142:2: (iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1143:2: iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF
+            // InternalEntityMockDSL.g:1173:67: (iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF )
+            // InternalEntityMockDSL.g:1174:2: iv_ruleEntityMockObjectPlainValue= ruleEntityMockObjectPlainValue EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectPlainValueRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectPlainValue_in_entryRuleEntityMockObjectPlainValue2462);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectPlainValue=ruleEntityMockObjectPlainValue();
 
             state._fsp--;
@@ -3270,16 +3411,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectPlainValue; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectPlainValue2472); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3288,144 +3429,560 @@
 
 
     // $ANTLR start "ruleEntityMockObjectPlainValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1150:1: ruleEntityMockObjectPlainValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) ;
+    // InternalEntityMockDSL.g:1180:1: ruleEntityMockObjectPlainValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) ;
     public final EObject ruleEntityMockObjectPlainValue() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token lv_values_3_0=null;
         Token otherlv_4=null;
         Token otherlv_5=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
 
 
-         enterRule(); 
-            
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1153:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1154:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
+            // InternalEntityMockDSL.g:1186:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) )
+            // InternalEntityMockDSL.g:1187:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1154:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1154:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
+            // InternalEntityMockDSL.g:1187:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
+            // InternalEntityMockDSL.g:1188:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
             {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectPlainValue2509); if (state.failed) return current;
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectPlainValueAccess().getVarKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1158:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1159:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:1192:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1193:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1159:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1160:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:1193:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1194:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectPlainValueAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FOLLOW_24); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1214:3: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
+            loop23:
+            do {
+                int alt23=2;
+                int LA23_0 = input.LA(1);
+
+                if ( (LA23_0==RULE_STRING) ) {
+                    alt23=1;
+                }
+
+
+                switch (alt23) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:1215:4: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
+            	    {
+            	    // InternalEntityMockDSL.g:1215:4: ( (lv_values_3_0= RULE_STRING ) )
+            	    // InternalEntityMockDSL.g:1216:5: (lv_values_3_0= RULE_STRING )
+            	    {
+            	    // InternalEntityMockDSL.g:1216:5: (lv_values_3_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:1217:6: lv_values_3_0= RULE_STRING
+            	    {
+            	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0());
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
+            	      						}
+            	      						addWithLastConsumed(
+            	      							current,
+            	      							"values",
+            	      							lv_values_3_0,
+            	      							"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:1233:4: (otherlv_4= ',' )?
+            	    int alt22=2;
+            	    int LA22_0 = input.LA(1);
+
+            	    if ( (LA22_0==26) ) {
+            	        alt22=1;
+            	    }
+            	    switch (alt22) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:1234:5: otherlv_4= ','
+            	            {
+            	            otherlv_4=(Token)match(input,26,FOLLOW_24); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop23;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockObjectPlainValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectResourceValue"
+    // InternalEntityMockDSL.g:1248:1: entryRuleEntityMockObjectResourceValue returns [EObject current=null] : iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF ;
+    public final EObject entryRuleEntityMockObjectResourceValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockObjectResourceValue = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:1248:70: (iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF )
+            // InternalEntityMockDSL.g:1249:2: iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectPlainValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
+               newCompositeNode(grammarAccess.getEntityMockObjectResourceValueRule()); 
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectPlainValue2530);
-            lv_name_1_0=ruleQualifiedName();
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockObjectResourceValue=ruleEntityMockObjectResourceValue();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectPlainValueRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+               current =iv_ruleEntityMockObjectResourceValue; 
             }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
+        }
 
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
             }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectResourceValue"
 
-            otherlv_2=(Token)match(input,26,FOLLOW_26_in_ruleEntityMockObjectPlainValue2542); if (state.failed) return current;
+
+    // $ANTLR start "ruleEntityMockObjectResourceValue"
+    // InternalEntityMockDSL.g:1255:1: ruleEntityMockObjectResourceValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? ) ;
+    public final EObject ruleEntityMockObjectResourceValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:1261:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? ) )
+            // InternalEntityMockDSL.g:1262:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? )
+            {
+            // InternalEntityMockDSL.g:1262:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? )
+            // InternalEntityMockDSL.g:1263:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )?
+            {
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectPlainValueAccess().getLeftParenthesisKeyword_2());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1180:1: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
+            // InternalEntityMockDSL.g:1267:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1268:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:1268:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1269:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_30); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectResourceValueAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,33,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1289:3: ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:1290:4: (otherlv_3= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:1290:4: (otherlv_3= RULE_ID )
+            // InternalEntityMockDSL.g:1291:5: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+              					}
+              				
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:1302:3: (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )?
+            int alt24=2;
+            int LA24_0 = input.LA(1);
+
+            if ( (LA24_0==34) ) {
+                alt24=1;
+            }
+            switch (alt24) {
+                case 1 :
+                    // InternalEntityMockDSL.g:1303:4: otherlv_4= '.' ( (otherlv_5= RULE_ID ) )
+                    {
+                    otherlv_4=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:1307:4: ( (otherlv_5= RULE_ID ) )
+                    // InternalEntityMockDSL.g:1308:5: (otherlv_5= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:1308:5: (otherlv_5= RULE_ID )
+                    // InternalEntityMockDSL.g:1309:6: otherlv_5= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
+                      						}
+                      					
+                    }
+                    otherlv_5=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockObjectResourceValue"
+
+
+    // $ANTLR start "entryRuleEntityMockObjectArrayValue"
+    // InternalEntityMockDSL.g:1325:1: entryRuleEntityMockObjectArrayValue returns [EObject current=null] : iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF ;
+    public final EObject entryRuleEntityMockObjectArrayValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockObjectArrayValue = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:1325:67: (iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF )
+            // InternalEntityMockDSL.g:1326:2: iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockObjectArrayValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockObjectArrayValue=ruleEntityMockObjectArrayValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockObjectArrayValue; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockObjectArrayValue"
+
+
+    // $ANTLR start "ruleEntityMockObjectArrayValue"
+    // InternalEntityMockDSL.g:1332:1: ruleEntityMockObjectArrayValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'switchOn' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' ) ;
+    public final EObject ruleEntityMockObjectArrayValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_items_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:1338:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'switchOn' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' ) )
+            // InternalEntityMockDSL.g:1339:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'switchOn' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' )
+            {
+            // InternalEntityMockDSL.g:1339:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'switchOn' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' )
+            // InternalEntityMockDSL.g:1340:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'switchOn' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}'
+            {
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:1344:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1345:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:1345:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1346:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_32); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectArrayValueAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,35,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1366:3: ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:1367:4: (otherlv_3= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:1367:4: (otherlv_3= RULE_ID )
+            // InternalEntityMockDSL.g:1368:5: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
+              					}
+              				
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,14,FOLLOW_33); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:1383:3: ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )*
             loop25:
             do {
                 int alt25=2;
                 int LA25_0 = input.LA(1);
 
-                if ( (LA25_0==RULE_STRING) ) {
+                if ( (LA25_0==36) ) {
                     alt25=1;
                 }
 
 
                 switch (alt25) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1180:2: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
+            	    // InternalEntityMockDSL.g:1384:4: (lv_items_5_0= ruleEntityMockObjectItemValue )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1180:2: ( (lv_values_3_0= RULE_STRING ) )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1181:1: (lv_values_3_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:1384:4: (lv_items_5_0= ruleEntityMockObjectItemValue )
+            	    // InternalEntityMockDSL.g:1385:5: lv_items_5_0= ruleEntityMockObjectItemValue
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1181:1: (lv_values_3_0= RULE_STRING )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1182:3: lv_values_3_0= RULE_STRING
-            	    {
-            	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleEntityMockObjectPlainValue2560); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectPlainValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
-            	      		
+            	      					newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0());
+            	      				
             	    }
+            	    pushFollow(FOLLOW_33);
+            	    lv_items_5_0=ruleEntityMockObjectItemValue();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getEntityMockObjectPlainValueRule());
-            	      	        }
-            	             		addWithLastConsumed(
-            	             			current, 
-            	             			"values",
-            	              		lv_values_3_0, 
-            	              		"STRING");
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"items",
+            	      						lv_items_5_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectItemValue");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
 
 
             	    }
-
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1198:2: (otherlv_4= ',' )?
-            	    int alt24=2;
-            	    int LA24_0 = input.LA(1);
-
-            	    if ( (LA24_0==27) ) {
-            	        alt24=1;
-            	    }
-            	    switch (alt24) {
-            	        case 1 :
-            	            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1198:4: otherlv_4= ','
-            	            {
-            	            otherlv_4=(Token)match(input,27,FOLLOW_27_in_ruleEntityMockObjectPlainValue2578); if (state.failed) return current;
-            	            if ( state.backtracking==0 ) {
-
-            	                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1());
-            	                  
-            	            }
-
-            	            }
-            	            break;
-
-            	    }
-
-
-            	    }
             	    break;
 
             	default :
@@ -3433,11 +3990,11 @@
                 }
             } while (true);
 
-            otherlv_5=(Token)match(input,28,FOLLOW_28_in_ruleEntityMockObjectPlainValue2594); if (state.failed) return current;
+            otherlv_6=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectPlainValueAccess().getRightParenthesisKeyword_4());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6());
+              		
             }
 
             }
@@ -3446,441 +4003,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityMockObjectPlainValue"
-
-
-    // $ANTLR start "entryRuleEntityMockObjectResourceValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1214:1: entryRuleEntityMockObjectResourceValue returns [EObject current=null] : iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF ;
-    public final EObject entryRuleEntityMockObjectResourceValue() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockObjectResourceValue = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1215:2: (iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1216:2: iv_ruleEntityMockObjectResourceValue= ruleEntityMockObjectResourceValue EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockObjectResourceValueRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectResourceValue_in_entryRuleEntityMockObjectResourceValue2630);
-            iv_ruleEntityMockObjectResourceValue=ruleEntityMockObjectResourceValue();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockObjectResourceValue; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectResourceValue2640); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockObjectResourceValue"
-
-
-    // $ANTLR start "ruleEntityMockObjectResourceValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1223:1: ruleEntityMockObjectResourceValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? ) ;
-    public final EObject ruleEntityMockObjectResourceValue() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_0=null;
-        Token otherlv_2=null;
-        Token otherlv_3=null;
-        Token otherlv_4=null;
-        Token otherlv_5=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1226:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1227:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1227:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1227:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'with' ( (otherlv_3= RULE_ID ) ) (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )?
-            {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectResourceValue2677); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectResourceValueAccess().getVarKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1231:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1232:1: (lv_name_1_0= ruleQualifiedName )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1232:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1233:3: lv_name_1_0= ruleQualifiedName
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectResourceValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectResourceValue2698);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectResourceValueRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,35,FOLLOW_35_in_ruleEntityMockObjectResourceValue2710); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectResourceValueAccess().getWithKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1253:1: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1254:1: (otherlv_3= RULE_ID )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1254:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1255:3: otherlv_3= RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
-              	        }
-                      
-            }
-            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectResourceValue2730); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceEnumEntityMockObjectEnumCrossReference_3_0()); 
-              	
-            }
-
-            }
-
-
-            }
-
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1266:2: (otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )?
-            int alt26=2;
-            int LA26_0 = input.LA(1);
-
-            if ( (LA26_0==18) ) {
-                alt26=1;
-            }
-            switch (alt26) {
-                case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1266:4: otherlv_4= '.' ( (otherlv_5= RULE_ID ) )
-                    {
-                    otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleEntityMockObjectResourceValue2743); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectResourceValueAccess().getFullStopKeyword_4_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1270:1: ( (otherlv_5= RULE_ID ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1271:1: (otherlv_5= RULE_ID )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1271:1: (otherlv_5= RULE_ID )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1272:3: otherlv_5= RULE_ID
-                    {
-                    if ( state.backtracking==0 ) {
-
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockObjectResourceValueRule());
-                      	        }
-                              
-                    }
-                    otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectResourceValue2763); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      		newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectResourceValueAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0()); 
-                      	
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityMockObjectResourceValue"
-
-
-    // $ANTLR start "entryRuleEntityMockObjectArrayValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1291:1: entryRuleEntityMockObjectArrayValue returns [EObject current=null] : iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF ;
-    public final EObject entryRuleEntityMockObjectArrayValue() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockObjectArrayValue = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1292:2: (iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1293:2: iv_ruleEntityMockObjectArrayValue= ruleEntityMockObjectArrayValue EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockObjectArrayValueRule()); 
-            }
-            pushFollow(FOLLOW_ruleEntityMockObjectArrayValue_in_entryRuleEntityMockObjectArrayValue2801);
-            iv_ruleEntityMockObjectArrayValue=ruleEntityMockObjectArrayValue();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockObjectArrayValue; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectArrayValue2811); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockObjectArrayValue"
-
-
-    // $ANTLR start "ruleEntityMockObjectArrayValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1300:1: ruleEntityMockObjectArrayValue returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'switch on' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' ) ;
-    public final EObject ruleEntityMockObjectArrayValue() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_0=null;
-        Token otherlv_2=null;
-        Token otherlv_3=null;
-        Token otherlv_4=null;
-        Token otherlv_6=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
-        EObject lv_items_5_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1303:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'switch on' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1304:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'switch on' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1304:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'switch on' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1304:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'switch on' ( (otherlv_3= RULE_ID ) ) otherlv_4= '{' ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )* otherlv_6= '}'
-            {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectArrayValue2848); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectArrayValueAccess().getVarKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1308:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1309:1: (lv_name_1_0= ruleQualifiedName )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1309:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1310:3: lv_name_1_0= ruleQualifiedName
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectArrayValue2869);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,36,FOLLOW_36_in_ruleEntityMockObjectArrayValue2881); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectArrayValueAccess().getSwitchOnKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1330:1: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1331:1: (otherlv_3= RULE_ID )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1331:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1332:3: otherlv_3= RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectArrayValueRule());
-              	        }
-                      
-            }
-            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectArrayValue2901); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              		newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectArrayValueAccess().getEnumerationEntityMockObjectEnumCrossReference_3_0()); 
-              	
-            }
-
-            }
-
-
-            }
-
-            otherlv_4=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockObjectArrayValue2913); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectArrayValueAccess().getLeftCurlyBracketKeyword_4());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1347:1: ( (lv_items_5_0= ruleEntityMockObjectItemValue ) )*
-            loop27:
-            do {
-                int alt27=2;
-                int LA27_0 = input.LA(1);
-
-                if ( (LA27_0==37) ) {
-                    alt27=1;
-                }
-
-
-                switch (alt27) {
-            	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1348:1: (lv_items_5_0= ruleEntityMockObjectItemValue )
-            	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1348:1: (lv_items_5_0= ruleEntityMockObjectItemValue )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1349:3: lv_items_5_0= ruleEntityMockObjectItemValue
-            	    {
-            	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockObjectArrayValueAccess().getItemsEntityMockObjectItemValueParserRuleCall_5_0()); 
-            	      	    
-            	    }
-            	    pushFollow(FOLLOW_ruleEntityMockObjectItemValue_in_ruleEntityMockObjectArrayValue2934);
-            	    lv_items_5_0=ruleEntityMockObjectItemValue();
-
-            	    state._fsp--;
-            	    if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectArrayValueRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_5_0, 
-            	              		"EntityMockObjectItemValue");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
-            	    }
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop27;
-                }
-            } while (true);
-
-            otherlv_6=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockObjectArrayValue2947); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_6, grammarAccess.getEntityMockObjectArrayValueAccess().getRightCurlyBracketKeyword_6());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
         finally {
         }
         return current;
@@ -3889,7 +4021,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectItemValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1377:1: entryRuleEntityMockObjectItemValue returns [EObject current=null] : iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF ;
+    // InternalEntityMockDSL.g:1410:1: entryRuleEntityMockObjectItemValue returns [EObject current=null] : iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF ;
     public final EObject entryRuleEntityMockObjectItemValue() throws RecognitionException {
         EObject current = null;
 
@@ -3897,13 +4029,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1378:2: (iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1379:2: iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF
+            // InternalEntityMockDSL.g:1410:66: (iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF )
+            // InternalEntityMockDSL.g:1411:2: iv_ruleEntityMockObjectItemValue= ruleEntityMockObjectItemValue EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectItemValueRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectItemValue_in_entryRuleEntityMockObjectItemValue2983);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectItemValue=ruleEntityMockObjectItemValue();
 
             state._fsp--;
@@ -3911,16 +4043,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectItemValue; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectItemValue2993); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3929,7 +4061,7 @@
 
 
     // $ANTLR start "ruleEntityMockObjectItemValue"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1386:1: ruleEntityMockObjectItemValue returns [EObject current=null] : (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) ;
+    // InternalEntityMockDSL.g:1417:1: ruleEntityMockObjectItemValue returns [EObject current=null] : (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) ;
     public final EObject ruleEntityMockObjectItemValue() throws RecognitionException {
         EObject current = null;
 
@@ -3940,39 +4072,40 @@
         Token otherlv_4=null;
         Token otherlv_5=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1389:28: ( (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1390:1: (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
+            // InternalEntityMockDSL.g:1423:2: ( (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' ) )
+            // InternalEntityMockDSL.g:1424:2: (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1390:1: (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1390:3: otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
+            // InternalEntityMockDSL.g:1424:2: (otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')' )
+            // InternalEntityMockDSL.g:1425:3: otherlv_0= 'when' ( (otherlv_1= RULE_ID ) ) otherlv_2= '(' ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )* otherlv_5= ')'
             {
-            otherlv_0=(Token)match(input,37,FOLLOW_37_in_ruleEntityMockObjectItemValue3030); if (state.failed) return current;
+            otherlv_0=(Token)match(input,36,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectItemValueAccess().getWhenKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1394:1: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1395:1: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:1429:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:1430:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1395:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1396:3: otherlv_1= RULE_ID
+            // InternalEntityMockDSL.g:1430:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:1431:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectItemValue3050); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectItemValueAccess().getDatarowLEnumLiteralCrossReference_1_0());
+              				
             }
 
             }
@@ -3980,50 +4113,50 @@
 
             }
 
-            otherlv_2=(Token)match(input,26,FOLLOW_26_in_ruleEntityMockObjectItemValue3062); if (state.failed) return current;
+            otherlv_2=(Token)match(input,25,FOLLOW_24); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectItemValueAccess().getLeftParenthesisKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1411:1: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
-            loop29:
+            // InternalEntityMockDSL.g:1446:3: ( ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )? )*
+            loop27:
             do {
-                int alt29=2;
-                int LA29_0 = input.LA(1);
+                int alt27=2;
+                int LA27_0 = input.LA(1);
 
-                if ( (LA29_0==RULE_STRING) ) {
-                    alt29=1;
+                if ( (LA27_0==RULE_STRING) ) {
+                    alt27=1;
                 }
 
 
-                switch (alt29) {
+                switch (alt27) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1411:2: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
+            	    // InternalEntityMockDSL.g:1447:4: ( (lv_values_3_0= RULE_STRING ) ) (otherlv_4= ',' )?
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1411:2: ( (lv_values_3_0= RULE_STRING ) )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1412:1: (lv_values_3_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:1447:4: ( (lv_values_3_0= RULE_STRING ) )
+            	    // InternalEntityMockDSL.g:1448:5: (lv_values_3_0= RULE_STRING )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1412:1: (lv_values_3_0= RULE_STRING )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1413:3: lv_values_3_0= RULE_STRING
+            	    // InternalEntityMockDSL.g:1448:5: (lv_values_3_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:1449:6: lv_values_3_0= RULE_STRING
             	    {
-            	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleEntityMockObjectItemValue3080); if (state.failed) return current;
+            	    lv_values_3_0=(Token)match(input,RULE_STRING,FOLLOW_25); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0()); 
-            	      		
+            	      						newLeafNode(lv_values_3_0, grammarAccess.getEntityMockObjectItemValueAccess().getValuesSTRINGTerminalRuleCall_3_0_0());
+            	      					
             	    }
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
-            	      	        }
-            	             		addWithLastConsumed(
-            	             			current, 
-            	             			"values",
-            	              		lv_values_3_0, 
-            	              		"STRING");
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getEntityMockObjectItemValueRule());
+            	      						}
+            	      						addWithLastConsumed(
+            	      							current,
+            	      							"values",
+            	      							lv_values_3_0,
+            	      							"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      					
             	    }
 
             	    }
@@ -4031,22 +4164,22 @@
 
             	    }
 
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1429:2: (otherlv_4= ',' )?
-            	    int alt28=2;
-            	    int LA28_0 = input.LA(1);
+            	    // InternalEntityMockDSL.g:1465:4: (otherlv_4= ',' )?
+            	    int alt26=2;
+            	    int LA26_0 = input.LA(1);
 
-            	    if ( (LA28_0==27) ) {
-            	        alt28=1;
+            	    if ( (LA26_0==26) ) {
+            	        alt26=1;
             	    }
-            	    switch (alt28) {
+            	    switch (alt26) {
             	        case 1 :
-            	            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1429:4: otherlv_4= ','
+            	            // InternalEntityMockDSL.g:1466:5: otherlv_4= ','
             	            {
-            	            otherlv_4=(Token)match(input,27,FOLLOW_27_in_ruleEntityMockObjectItemValue3098); if (state.failed) return current;
+            	            otherlv_4=(Token)match(input,26,FOLLOW_24); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
-            	                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1());
-            	                  
+            	              					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1());
+            	              				
             	            }
 
             	            }
@@ -4059,15 +4192,15 @@
             	    break;
 
             	default :
-            	    break loop29;
+            	    break loop27;
                 }
             } while (true);
 
-            otherlv_5=(Token)match(input,28,FOLLOW_28_in_ruleEntityMockObjectItemValue3114); if (state.failed) return current;
+            otherlv_5=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectItemValueAccess().getRightParenthesisKeyword_4());
+              		
             }
 
             }
@@ -4076,14 +4209,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4092,7 +4227,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectEmbed"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1445:1: entryRuleEntityMockObjectEmbed returns [EObject current=null] : iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF ;
+    // InternalEntityMockDSL.g:1480:1: entryRuleEntityMockObjectEmbed returns [EObject current=null] : iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF ;
     public final EObject entryRuleEntityMockObjectEmbed() throws RecognitionException {
         EObject current = null;
 
@@ -4100,13 +4235,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1446:2: (iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1447:2: iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF
+            // InternalEntityMockDSL.g:1480:62: (iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF )
+            // InternalEntityMockDSL.g:1481:2: iv_ruleEntityMockObjectEmbed= ruleEntityMockObjectEmbed EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectEmbedRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectEmbed_in_entryRuleEntityMockObjectEmbed3150);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectEmbed=ruleEntityMockObjectEmbed();
 
             state._fsp--;
@@ -4114,16 +4249,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectEmbed; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectEmbed3160); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4132,103 +4267,98 @@
 
 
     // $ANTLR start "ruleEntityMockObjectEmbed"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1454:1: ruleEntityMockObjectEmbed returns [EObject current=null] : ( () otherlv_1= 'embed' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= 'defined as' ( (otherlv_4= RULE_ID ) ) ) ;
+    // InternalEntityMockDSL.g:1487:1: ruleEntityMockObjectEmbed returns [EObject current=null] : ( () otherlv_1= 'embed' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= 'definedAs' ( (otherlv_4= RULE_ID ) ) ) ;
     public final EObject ruleEntityMockObjectEmbed() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
+        Token lv_name_2_0=null;
         Token otherlv_3=null;
         Token otherlv_4=null;
-        AntlrDatatypeRuleToken lv_name_2_0 = null;
 
 
-         enterRule(); 
-            
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1457:28: ( ( () otherlv_1= 'embed' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= 'defined as' ( (otherlv_4= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1458:1: ( () otherlv_1= 'embed' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= 'defined as' ( (otherlv_4= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1493:2: ( ( () otherlv_1= 'embed' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= 'definedAs' ( (otherlv_4= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:1494:2: ( () otherlv_1= 'embed' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= 'definedAs' ( (otherlv_4= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1458:1: ( () otherlv_1= 'embed' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= 'defined as' ( (otherlv_4= RULE_ID ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1458:2: () otherlv_1= 'embed' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= 'defined as' ( (otherlv_4= RULE_ID ) )
+            // InternalEntityMockDSL.g:1494:2: ( () otherlv_1= 'embed' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= 'definedAs' ( (otherlv_4= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1495:3: () otherlv_1= 'embed' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= 'definedAs' ( (otherlv_4= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1458:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1459:5: 
+            // InternalEntityMockDSL.g:1495:3: ()
+            // InternalEntityMockDSL.g:1496:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockObjectEmbedAccess().getEntityMockObjectEmbedAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,38,FOLLOW_38_in_ruleEntityMockObjectEmbed3206); if (state.failed) return current;
+            otherlv_1=(Token)match(input,37,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectEmbedAccess().getEmbedKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1468:1: ( (lv_name_2_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1469:1: (lv_name_2_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:1506:3: ( (lv_name_2_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1507:4: (lv_name_2_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1469:1: (lv_name_2_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1470:3: lv_name_2_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:1507:4: (lv_name_2_0= RULE_ID )
+            // InternalEntityMockDSL.g:1508:5: lv_name_2_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectEmbedAccess().getNameQualifiedNameParserRuleCall_2_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectEmbed3227);
-            lv_name_2_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_34); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectEmbedRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_2_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_2_0, grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_3=(Token)match(input,39,FOLLOW_39_in_ruleEntityMockObjectEmbed3239); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1490:1: ( (otherlv_4= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1491:1: (otherlv_4= RULE_ID )
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,38,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getEntityMockObjectEmbedAccess().getDefinedAsKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:1528:3: ( (otherlv_4= RULE_ID ) )
+            // InternalEntityMockDSL.g:1529:4: (otherlv_4= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1491:1: (otherlv_4= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1492:3: otherlv_4= RULE_ID
+            // InternalEntityMockDSL.g:1529:4: (otherlv_4= RULE_ID )
+            // InternalEntityMockDSL.g:1530:5: otherlv_4= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectEmbedRule());
+              					}
+              				
             }
-            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectEmbed3259); if (state.failed) return current;
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0()); 
-              	
+              					newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectCrossReference_4_0());
+              				
             }
 
             }
@@ -4243,14 +4373,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4259,7 +4391,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectFunction"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1511:1: entryRuleEntityMockObjectFunction returns [EObject current=null] : iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF ;
+    // InternalEntityMockDSL.g:1545:1: entryRuleEntityMockObjectFunction returns [EObject current=null] : iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF ;
     public final EObject entryRuleEntityMockObjectFunction() throws RecognitionException {
         EObject current = null;
 
@@ -4267,13 +4399,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1512:2: (iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1513:2: iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF
+            // InternalEntityMockDSL.g:1545:65: (iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF )
+            // InternalEntityMockDSL.g:1546:2: iv_ruleEntityMockObjectFunction= ruleEntityMockObjectFunction EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectFunctionRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectFunction_in_entryRuleEntityMockObjectFunction3295);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectFunction=ruleEntityMockObjectFunction();
 
             state._fsp--;
@@ -4281,16 +4413,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectFunction; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectFunction3305); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4299,18 +4431,17 @@
 
 
     // $ANTLR start "ruleEntityMockObjectFunction"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1520:1: ruleEntityMockObjectFunction returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'calculate as' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'based on' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) ) ;
+    // InternalEntityMockDSL.g:1552:1: ruleEntityMockObjectFunction returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'calculateAs' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'basedOn' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) ) ;
     public final EObject ruleEntityMockObjectFunction() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token otherlv_4=null;
         Token otherlv_5=null;
         Token otherlv_7=null;
         Token otherlv_9=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
         EObject lv_oftype_3_0 = null;
 
         EObject lv_params_6_0 = null;
@@ -4320,90 +4451,86 @@
         EObject lv_body_10_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1523:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'calculate as' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'based on' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1524:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'calculate as' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'based on' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) )
+            // InternalEntityMockDSL.g:1558:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'calculateAs' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'basedOn' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) ) )
+            // InternalEntityMockDSL.g:1559:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'calculateAs' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'basedOn' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1524:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'calculate as' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'based on' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1524:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'calculate as' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'based on' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) )
+            // InternalEntityMockDSL.g:1559:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'calculateAs' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'basedOn' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) ) )
+            // InternalEntityMockDSL.g:1560:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'calculateAs' ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) ) otherlv_4= 'basedOn' otherlv_5= '(' ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )? otherlv_9= ')' ( (lv_body_10_0= ruleXBlockExpression ) )
             {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectFunction3342); if (state.failed) return current;
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFunctionAccess().getVarKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1528:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1529:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:1564:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1565:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1529:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1530:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:1565:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1566:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectFunction3363);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_35); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectFunctionAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,40,FOLLOW_40_in_ruleEntityMockObjectFunction3375); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectFunctionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1550:1: ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1551:1: (lv_oftype_3_0= ruleJvmParameterizedTypeReference )
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,39,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFunctionAccess().getCalculateAsKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1586:3: ( (lv_oftype_3_0= ruleJvmParameterizedTypeReference ) )
+            // InternalEntityMockDSL.g:1587:4: (lv_oftype_3_0= ruleJvmParameterizedTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1551:1: (lv_oftype_3_0= ruleJvmParameterizedTypeReference )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1552:3: lv_oftype_3_0= ruleJvmParameterizedTypeReference
+            // InternalEntityMockDSL.g:1587:4: (lv_oftype_3_0= ruleJvmParameterizedTypeReference )
+            // InternalEntityMockDSL.g:1588:5: lv_oftype_3_0= ruleJvmParameterizedTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_ruleEntityMockObjectFunction3396);
+            pushFollow(FOLLOW_36);
             lv_oftype_3_0=ruleJvmParameterizedTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"oftype",
-                      		lv_oftype_3_0, 
-                      		"JvmParameterizedTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+              					}
+              					set(
+              						current,
+              						"oftype",
+              						lv_oftype_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4411,57 +4538,57 @@
 
             }
 
-            otherlv_4=(Token)match(input,41,FOLLOW_41_in_ruleEntityMockObjectFunction3408); if (state.failed) return current;
+            otherlv_4=(Token)match(input,40,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockObjectFunctionAccess().getBasedOnKeyword_4());
+              		
             }
-            otherlv_5=(Token)match(input,26,FOLLOW_26_in_ruleEntityMockObjectFunction3420); if (state.failed) return current;
+            otherlv_5=(Token)match(input,25,FOLLOW_37); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getEntityMockObjectFunctionAccess().getLeftParenthesisKeyword_5());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1576:1: ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )?
-            int alt31=2;
-            int LA31_0 = input.LA(1);
+            // InternalEntityMockDSL.g:1613:3: ( ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )* )?
+            int alt29=2;
+            int LA29_0 = input.LA(1);
 
-            if ( (LA31_0==RULE_ID||LA31_0==26||LA31_0==113) ) {
-                alt31=1;
+            if ( (LA29_0==RULE_ID||LA29_0==25||LA29_0==116) ) {
+                alt29=1;
             }
-            switch (alt31) {
+            switch (alt29) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1576:2: ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )*
+                    // InternalEntityMockDSL.g:1614:4: ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) ) (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )*
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1576:2: ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1577:1: (lv_params_6_0= ruleEntityMockObjectFunctionParameter )
+                    // InternalEntityMockDSL.g:1614:4: ( (lv_params_6_0= ruleEntityMockObjectFunctionParameter ) )
+                    // InternalEntityMockDSL.g:1615:5: (lv_params_6_0= ruleEntityMockObjectFunctionParameter )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1577:1: (lv_params_6_0= ruleEntityMockObjectFunctionParameter )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1578:3: lv_params_6_0= ruleEntityMockObjectFunctionParameter
+                    // InternalEntityMockDSL.g:1615:5: (lv_params_6_0= ruleEntityMockObjectFunctionParameter )
+                    // InternalEntityMockDSL.g:1616:6: lv_params_6_0= ruleEntityMockObjectFunctionParameter
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleEntityMockObjectFunctionParameter_in_ruleEntityMockObjectFunction3442);
+                    pushFollow(FOLLOW_38);
                     lv_params_6_0=ruleEntityMockObjectFunctionParameter();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-                      	        }
-                             		add(
-                             			current, 
-                             			"params",
-                              		lv_params_6_0, 
-                              		"EntityMockObjectFunctionParameter");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"params",
+                      							lv_params_6_0,
+                      							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunctionParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -4469,55 +4596,55 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1594:2: (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )*
-                    loop30:
+                    // InternalEntityMockDSL.g:1633:4: (otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) ) )*
+                    loop28:
                     do {
-                        int alt30=2;
-                        int LA30_0 = input.LA(1);
+                        int alt28=2;
+                        int LA28_0 = input.LA(1);
 
-                        if ( (LA30_0==27) ) {
-                            alt30=1;
+                        if ( (LA28_0==26) ) {
+                            alt28=1;
                         }
 
 
-                        switch (alt30) {
+                        switch (alt28) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1594:4: otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) )
+                    	    // InternalEntityMockDSL.g:1634:5: otherlv_7= ',' ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) )
                     	    {
-                    	    otherlv_7=(Token)match(input,27,FOLLOW_27_in_ruleEntityMockObjectFunction3455); if (state.failed) return current;
+                    	    otherlv_7=(Token)match(input,26,FOLLOW_39); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_7, grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0());
-                    	          
+                    	      					newLeafNode(otherlv_7, grammarAccess.getEntityMockObjectFunctionAccess().getCommaKeyword_6_1_0());
+                    	      				
                     	    }
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1598:1: ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1599:1: (lv_params_8_0= ruleEntityMockObjectFunctionParameter )
+                    	    // InternalEntityMockDSL.g:1638:5: ( (lv_params_8_0= ruleEntityMockObjectFunctionParameter ) )
+                    	    // InternalEntityMockDSL.g:1639:6: (lv_params_8_0= ruleEntityMockObjectFunctionParameter )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1599:1: (lv_params_8_0= ruleEntityMockObjectFunctionParameter )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1600:3: lv_params_8_0= ruleEntityMockObjectFunctionParameter
+                    	    // InternalEntityMockDSL.g:1639:6: (lv_params_8_0= ruleEntityMockObjectFunctionParameter )
+                    	    // InternalEntityMockDSL.g:1640:7: lv_params_8_0= ruleEntityMockObjectFunctionParameter
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockObjectFunctionParameter_in_ruleEntityMockObjectFunction3476);
+                    	    pushFollow(FOLLOW_38);
                     	    lv_params_8_0=ruleEntityMockObjectFunctionParameter();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"params",
-                    	              		lv_params_8_0, 
-                    	              		"EntityMockObjectFunctionParameter");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"params",
+                    	      								lv_params_8_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunctionParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -4530,7 +4657,7 @@
                     	    break;
 
                     	default :
-                    	    break loop30;
+                    	    break loop28;
                         }
                     } while (true);
 
@@ -4540,40 +4667,40 @@
 
             }
 
-            otherlv_9=(Token)match(input,28,FOLLOW_28_in_ruleEntityMockObjectFunction3492); if (state.failed) return current;
+            otherlv_9=(Token)match(input,27,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_9, grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7());
-                  
+              			newLeafNode(otherlv_9, grammarAccess.getEntityMockObjectFunctionAccess().getRightParenthesisKeyword_7());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1620:1: ( (lv_body_10_0= ruleXBlockExpression ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1621:1: (lv_body_10_0= ruleXBlockExpression )
+            // InternalEntityMockDSL.g:1663:3: ( (lv_body_10_0= ruleXBlockExpression ) )
+            // InternalEntityMockDSL.g:1664:4: (lv_body_10_0= ruleXBlockExpression )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1621:1: (lv_body_10_0= ruleXBlockExpression )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1622:3: lv_body_10_0= ruleXBlockExpression
+            // InternalEntityMockDSL.g:1664:4: (lv_body_10_0= ruleXBlockExpression )
+            // InternalEntityMockDSL.g:1665:5: lv_body_10_0= ruleXBlockExpression
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEntityMockObjectFunctionAccess().getBodyXBlockExpressionParserRuleCall_8_0());
+              				
             }
-            pushFollow(FOLLOW_ruleXBlockExpression_in_ruleEntityMockObjectFunction3513);
+            pushFollow(FOLLOW_2);
             lv_body_10_0=ruleXBlockExpression();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"body",
-                      		lv_body_10_0, 
-                      		"XBlockExpression");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionRule());
+              					}
+              					set(
+              						current,
+              						"body",
+              						lv_body_10_0,
+              						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4588,14 +4715,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4604,7 +4733,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectFunctionParameter"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1646:1: entryRuleEntityMockObjectFunctionParameter returns [EObject current=null] : iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF ;
+    // InternalEntityMockDSL.g:1686:1: entryRuleEntityMockObjectFunctionParameter returns [EObject current=null] : iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF ;
     public final EObject entryRuleEntityMockObjectFunctionParameter() throws RecognitionException {
         EObject current = null;
 
@@ -4612,13 +4741,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1647:2: (iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1648:2: iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF
+            // InternalEntityMockDSL.g:1686:74: (iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF )
+            // InternalEntityMockDSL.g:1687:2: iv_ruleEntityMockObjectFunctionParameter= ruleEntityMockObjectFunctionParameter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectFunctionParameter_in_entryRuleEntityMockObjectFunctionParameter3549);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectFunctionParameter=ruleEntityMockObjectFunctionParameter();
 
             state._fsp--;
@@ -4626,16 +4755,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectFunctionParameter; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectFunctionParameter3559); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4644,7 +4773,7 @@
 
 
     // $ANTLR start "ruleEntityMockObjectFunctionParameter"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1655:1: ruleEntityMockObjectFunctionParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) ) ;
+    // InternalEntityMockDSL.g:1693:1: ruleEntityMockObjectFunctionParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) ) ;
     public final EObject ruleEntityMockObjectFunctionParameter() throws RecognitionException {
         EObject current = null;
 
@@ -4652,43 +4781,44 @@
         EObject lv_parameterType_0_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1658:28: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1659:1: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1699:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:1700:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1659:1: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1659:2: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:1700:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:1701:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (otherlv_1= RULE_ID ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1659:2: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1660:1: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:1701:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:1702:4: (lv_parameterType_0_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1660:1: (lv_parameterType_0_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1661:3: lv_parameterType_0_0= ruleJvmTypeReference
+            // InternalEntityMockDSL.g:1702:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:1703:5: lv_parameterType_0_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleEntityMockObjectFunctionParameter3605);
+            pushFollow(FOLLOW_4);
             lv_parameterType_0_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionParameterRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"parameterType",
-                      		lv_parameterType_0_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockObjectFunctionParameterRule());
+              					}
+              					set(
+              						current,
+              						"parameterType",
+              						lv_parameterType_0_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4696,24 +4826,24 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1677:2: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1678:1: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:1720:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:1721:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1678:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1679:3: otherlv_1= RULE_ID
+            // InternalEntityMockDSL.g:1721:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:1722:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockObjectFunctionParameterRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectFunctionParameterRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockObjectFunctionParameter3625); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableCrossReference_1_0());
+              				
             }
 
             }
@@ -4728,14 +4858,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4744,7 +4876,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockObjectFill"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1698:1: entryRuleEntityMockObjectFill returns [EObject current=null] : iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF ;
+    // InternalEntityMockDSL.g:1737:1: entryRuleEntityMockObjectFill returns [EObject current=null] : iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF ;
     public final EObject entryRuleEntityMockObjectFill() throws RecognitionException {
         EObject current = null;
 
@@ -4752,13 +4884,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1699:2: (iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1700:2: iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF
+            // InternalEntityMockDSL.g:1737:61: (iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF )
+            // InternalEntityMockDSL.g:1738:2: iv_ruleEntityMockObjectFill= ruleEntityMockObjectFill EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockObjectFillRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockObjectFill_in_entryRuleEntityMockObjectFill3661);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockObjectFill=ruleEntityMockObjectFill();
 
             state._fsp--;
@@ -4766,16 +4898,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockObjectFill; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockObjectFill3671); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4784,101 +4916,96 @@
 
 
     // $ANTLR start "ruleEntityMockObjectFill"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1707:1: ruleEntityMockObjectFill returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) ;
+    // InternalEntityMockDSL.g:1744:1: ruleEntityMockObjectFill returns [EObject current=null] : (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) ;
     public final EObject ruleEntityMockObjectFill() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
         EObject lv_fillerType_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1710:28: ( (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1711:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
+            // InternalEntityMockDSL.g:1750:2: ( (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) )
+            // InternalEntityMockDSL.g:1751:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1711:1: (otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1711:3: otherlv_0= 'var' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) )
+            // InternalEntityMockDSL.g:1751:2: (otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
+            // InternalEntityMockDSL.g:1752:3: otherlv_0= 'var' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) )
             {
-            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleEntityMockObjectFill3708); if (state.failed) return current;
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockObjectFillAccess().getVarKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1715:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1716:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:1756:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:1757:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1716:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1717:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:1757:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:1758:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockObjectFill3729);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_40); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,42,FOLLOW_42_in_ruleEntityMockObjectFill3741); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockObjectFillRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1737:1: ( (lv_fillerType_3_0= rulePropertyFillerType ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1738:1: (lv_fillerType_3_0= rulePropertyFillerType )
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,41,FOLLOW_41); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockObjectFillAccess().getRandomizeKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:1778:3: ( (lv_fillerType_3_0= rulePropertyFillerType ) )
+            // InternalEntityMockDSL.g:1779:4: (lv_fillerType_3_0= rulePropertyFillerType )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1738:1: (lv_fillerType_3_0= rulePropertyFillerType )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1739:3: lv_fillerType_3_0= rulePropertyFillerType
+            // InternalEntityMockDSL.g:1779:4: (lv_fillerType_3_0= rulePropertyFillerType )
+            // InternalEntityMockDSL.g:1780:5: lv_fillerType_3_0= rulePropertyFillerType
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_rulePropertyFillerType_in_ruleEntityMockObjectFill3762);
+            pushFollow(FOLLOW_2);
             lv_fillerType_3_0=rulePropertyFillerType();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"fillerType",
-                      		lv_fillerType_3_0, 
-                      		"PropertyFillerType");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockObjectFillRule());
+              					}
+              					set(
+              						current,
+              						"fillerType",
+              						lv_fillerType_3_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerType");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4893,14 +5020,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4909,7 +5038,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerType"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1763:1: entryRulePropertyFillerType returns [EObject current=null] : iv_rulePropertyFillerType= rulePropertyFillerType EOF ;
+    // InternalEntityMockDSL.g:1801:1: entryRulePropertyFillerType returns [EObject current=null] : iv_rulePropertyFillerType= rulePropertyFillerType EOF ;
     public final EObject entryRulePropertyFillerType() throws RecognitionException {
         EObject current = null;
 
@@ -4917,13 +5046,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1764:2: (iv_rulePropertyFillerType= rulePropertyFillerType EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1765:2: iv_rulePropertyFillerType= rulePropertyFillerType EOF
+            // InternalEntityMockDSL.g:1801:59: (iv_rulePropertyFillerType= rulePropertyFillerType EOF )
+            // InternalEntityMockDSL.g:1802:2: iv_rulePropertyFillerType= rulePropertyFillerType EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerTypeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerType_in_entryRulePropertyFillerType3798);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerType=rulePropertyFillerType();
 
             state._fsp--;
@@ -4931,16 +5060,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerType; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerType3808); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4949,7 +5078,7 @@
 
 
     // $ANTLR start "rulePropertyFillerType"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1772:1: rulePropertyFillerType returns [EObject current=null] : (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom ) ;
+    // InternalEntityMockDSL.g:1808:1: rulePropertyFillerType returns [EObject current=null] : (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom ) ;
     public final EObject rulePropertyFillerType() throws RecognitionException {
         EObject current = null;
 
@@ -4986,452 +5115,453 @@
         EObject this_PropertyFillerUnsignedIntegerRandom_15 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1775:28: ( (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1776:1: (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom )
+            // InternalEntityMockDSL.g:1814:2: ( (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom ) )
+            // InternalEntityMockDSL.g:1815:2: (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1776:1: (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom )
-            int alt32=16;
+            // InternalEntityMockDSL.g:1815:2: (this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture | this_PropertyFillerDatePast_1= rulePropertyFillerDatePast | this_PropertyFillerDateRange_2= rulePropertyFillerDateRange | this_PropertyFillerBoolean_3= rulePropertyFillerBoolean | this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange | this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom | this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange | this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom | this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom | this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs | this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences | this_PropertyFillerTextWords_11= rulePropertyFillerTextWords | this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange | this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom | this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange | this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom )
+            int alt30=16;
             switch ( input.LA(1) ) {
-            case 43:
+            case 42:
                 {
-                alt32=1;
+                alt30=1;
                 }
                 break;
-            case 45:
+            case 44:
                 {
-                alt32=2;
-                }
-                break;
-            case 47:
-                {
-                alt32=3;
+                alt30=2;
                 }
                 break;
             case 46:
                 {
-                alt32=4;
+                alt30=3;
+                }
+                break;
+            case 45:
+                {
+                alt30=4;
                 }
                 break;
             case 49:
                 {
-                alt32=5;
+                alt30=5;
                 }
                 break;
             case 52:
                 {
-                alt32=6;
+                alt30=6;
                 }
                 break;
             case 53:
                 {
-                alt32=7;
+                alt30=7;
                 }
                 break;
             case 54:
                 {
-                alt32=8;
+                alt30=8;
                 }
                 break;
             case 55:
                 {
-                alt32=9;
+                alt30=9;
                 }
                 break;
             case 56:
                 {
-                alt32=10;
+                alt30=10;
                 }
                 break;
             case 57:
                 {
-                alt32=11;
+                alt30=11;
                 }
                 break;
             case 58:
                 {
-                alt32=12;
+                alt30=12;
                 }
                 break;
             case 59:
                 {
-                alt32=13;
+                alt30=13;
                 }
                 break;
             case 60:
                 {
-                alt32=14;
+                alt30=14;
                 }
                 break;
             case 61:
                 {
-                alt32=15;
+                alt30=15;
                 }
                 break;
             case 62:
                 {
-                alt32=16;
+                alt30=16;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 32, 0, input);
+                    new NoViableAltException("", 30, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt32) {
+            switch (alt30) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1777:5: this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture
+                    // InternalEntityMockDSL.g:1816:3: this_PropertyFillerDateFuture_0= rulePropertyFillerDateFuture
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateFutureParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerDateFuture_in_rulePropertyFillerType3855);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerDateFuture_0=rulePropertyFillerDateFuture();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerDateFuture_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerDateFuture_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1787:5: this_PropertyFillerDatePast_1= rulePropertyFillerDatePast
+                    // InternalEntityMockDSL.g:1825:3: this_PropertyFillerDatePast_1= rulePropertyFillerDatePast
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDatePastParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerDatePast_in_rulePropertyFillerType3882);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerDatePast_1=rulePropertyFillerDatePast();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerDatePast_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerDatePast_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1797:5: this_PropertyFillerDateRange_2= rulePropertyFillerDateRange
+                    // InternalEntityMockDSL.g:1834:3: this_PropertyFillerDateRange_2= rulePropertyFillerDateRange
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerDateRangeParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerDateRange_in_rulePropertyFillerType3909);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerDateRange_2=rulePropertyFillerDateRange();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerDateRange_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerDateRange_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1807:5: this_PropertyFillerBoolean_3= rulePropertyFillerBoolean
+                    // InternalEntityMockDSL.g:1843:3: this_PropertyFillerBoolean_3= rulePropertyFillerBoolean
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerBooleanParserRuleCall_3());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerBoolean_in_rulePropertyFillerType3936);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerBoolean_3=rulePropertyFillerBoolean();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerBoolean_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerBoolean_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1817:5: this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange
+                    // InternalEntityMockDSL.g:1852:3: this_PropertyFillerSignedDoubleRange_4= rulePropertyFillerSignedDoubleRange
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRangeParserRuleCall_4());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerSignedDoubleRange_in_rulePropertyFillerType3963);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerSignedDoubleRange_4=rulePropertyFillerSignedDoubleRange();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerSignedDoubleRange_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerSignedDoubleRange_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1827:5: this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom
+                    // InternalEntityMockDSL.g:1861:3: this_PropertyFillerSignedDoubleRandom_5= rulePropertyFillerSignedDoubleRandom
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedDoubleRandomParserRuleCall_5());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerSignedDoubleRandom_in_rulePropertyFillerType3990);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerSignedDoubleRandom_5=rulePropertyFillerSignedDoubleRandom();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerSignedDoubleRandom_5; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerSignedDoubleRandom_5;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1837:5: this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange
+                    // InternalEntityMockDSL.g:1870:3: this_PropertyFillerSignedIntegerRange_6= rulePropertyFillerSignedIntegerRange
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRangeParserRuleCall_6());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerSignedIntegerRange_in_rulePropertyFillerType4017);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerSignedIntegerRange_6=rulePropertyFillerSignedIntegerRange();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerSignedIntegerRange_6; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerSignedIntegerRange_6;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 8 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1847:5: this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom
+                    // InternalEntityMockDSL.g:1879:3: this_PropertyFillerSignedIntegerRandom_7= rulePropertyFillerSignedIntegerRandom
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerSignedIntegerRandomParserRuleCall_7());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerSignedIntegerRandom_in_rulePropertyFillerType4044);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerSignedIntegerRandom_7=rulePropertyFillerSignedIntegerRandom();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerSignedIntegerRandom_7; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerSignedIntegerRandom_7;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 9 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1857:5: this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom
+                    // InternalEntityMockDSL.g:1888:3: this_PropertyFillerTextRandom_8= rulePropertyFillerTextRandom
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextRandomParserRuleCall_8());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerTextRandom_in_rulePropertyFillerType4071);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerTextRandom_8=rulePropertyFillerTextRandom();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerTextRandom_8; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerTextRandom_8;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 10 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1867:5: this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs
+                    // InternalEntityMockDSL.g:1897:3: this_PropertyFillerTextParagraphs_9= rulePropertyFillerTextParagraphs
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextParagraphsParserRuleCall_9());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerTextParagraphs_in_rulePropertyFillerType4098);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerTextParagraphs_9=rulePropertyFillerTextParagraphs();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerTextParagraphs_9; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerTextParagraphs_9;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 11 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1877:5: this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences
+                    // InternalEntityMockDSL.g:1906:3: this_PropertyFillerTextSentences_10= rulePropertyFillerTextSentences
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextSentencesParserRuleCall_10());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerTextSentences_in_rulePropertyFillerType4125);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerTextSentences_10=rulePropertyFillerTextSentences();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerTextSentences_10; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerTextSentences_10;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 12 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1887:5: this_PropertyFillerTextWords_11= rulePropertyFillerTextWords
+                    // InternalEntityMockDSL.g:1915:3: this_PropertyFillerTextWords_11= rulePropertyFillerTextWords
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerTextWordsParserRuleCall_11());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerTextWords_in_rulePropertyFillerType4152);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerTextWords_11=rulePropertyFillerTextWords();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerTextWords_11; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerTextWords_11;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 13 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1897:5: this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange
+                    // InternalEntityMockDSL.g:1924:3: this_PropertyFillerUnsignedDoubleRange_12= rulePropertyFillerUnsignedDoubleRange
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRangeParserRuleCall_12());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerUnsignedDoubleRange_in_rulePropertyFillerType4179);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerUnsignedDoubleRange_12=rulePropertyFillerUnsignedDoubleRange();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerUnsignedDoubleRange_12; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerUnsignedDoubleRange_12;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 14 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1907:5: this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom
+                    // InternalEntityMockDSL.g:1933:3: this_PropertyFillerUnsignedDoubleRandom_13= rulePropertyFillerUnsignedDoubleRandom
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedDoubleRandomParserRuleCall_13());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerUnsignedDoubleRandom_in_rulePropertyFillerType4206);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerUnsignedDoubleRandom_13=rulePropertyFillerUnsignedDoubleRandom();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerUnsignedDoubleRandom_13; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerUnsignedDoubleRandom_13;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 15 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1917:5: this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange
+                    // InternalEntityMockDSL.g:1942:3: this_PropertyFillerUnsignedIntegerRange_14= rulePropertyFillerUnsignedIntegerRange
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRangeParserRuleCall_14());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerUnsignedIntegerRange_in_rulePropertyFillerType4233);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerUnsignedIntegerRange_14=rulePropertyFillerUnsignedIntegerRange();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerUnsignedIntegerRange_14; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerUnsignedIntegerRange_14;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 16 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1927:5: this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom
+                    // InternalEntityMockDSL.g:1951:3: this_PropertyFillerUnsignedIntegerRandom_15= rulePropertyFillerUnsignedIntegerRandom
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyFillerTypeAccess().getPropertyFillerUnsignedIntegerRandomParserRuleCall_15());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyFillerUnsignedIntegerRandom_in_rulePropertyFillerType4260);
+                    pushFollow(FOLLOW_2);
                     this_PropertyFillerUnsignedIntegerRandom_15=rulePropertyFillerUnsignedIntegerRandom();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyFillerUnsignedIntegerRandom_15; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyFillerUnsignedIntegerRandom_15;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -5443,14 +5573,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5459,7 +5591,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerDateFuture"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1943:1: entryRulePropertyFillerDateFuture returns [EObject current=null] : iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF ;
+    // InternalEntityMockDSL.g:1963:1: entryRulePropertyFillerDateFuture returns [EObject current=null] : iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF ;
     public final EObject entryRulePropertyFillerDateFuture() throws RecognitionException {
         EObject current = null;
 
@@ -5467,13 +5599,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1944:2: (iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1945:2: iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF
+            // InternalEntityMockDSL.g:1963:65: (iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF )
+            // InternalEntityMockDSL.g:1964:2: iv_rulePropertyFillerDateFuture= rulePropertyFillerDateFuture EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerDateFutureRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerDateFuture_in_entryRulePropertyFillerDateFuture4295);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerDateFuture=rulePropertyFillerDateFuture();
 
             state._fsp--;
@@ -5481,16 +5613,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerDateFuture; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerDateFuture4305); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5499,7 +5631,7 @@
 
 
     // $ANTLR start "rulePropertyFillerDateFuture"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1952:1: rulePropertyFillerDateFuture returns [EObject current=null] : (otherlv_0= 'future date' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
+    // InternalEntityMockDSL.g:1970:1: rulePropertyFillerDateFuture returns [EObject current=null] : (otherlv_0= 'future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
     public final EObject rulePropertyFillerDateFuture() throws RecognitionException {
         EObject current = null;
 
@@ -5507,56 +5639,57 @@
         Token lv_dateFutureYears_1_0=null;
         Token otherlv_2=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1955:28: ( (otherlv_0= 'future date' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1956:1: (otherlv_0= 'future date' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
+            // InternalEntityMockDSL.g:1976:2: ( (otherlv_0= 'future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
+            // InternalEntityMockDSL.g:1977:2: (otherlv_0= 'future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1956:1: (otherlv_0= 'future date' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1956:3: otherlv_0= 'future date' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years'
+            // InternalEntityMockDSL.g:1977:2: (otherlv_0= 'future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
+            // InternalEntityMockDSL.g:1978:3: otherlv_0= 'future' ( (lv_dateFutureYears_1_0= RULE_INT ) ) otherlv_2= 'years'
             {
-            otherlv_0=(Token)match(input,43,FOLLOW_43_in_rulePropertyFillerDateFuture4342); if (state.failed) return current;
+            otherlv_0=(Token)match(input,42,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateFutureAccess().getFutureDateKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1960:1: ( (lv_dateFutureYears_1_0= RULE_INT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1961:1: (lv_dateFutureYears_1_0= RULE_INT )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1961:1: (lv_dateFutureYears_1_0= RULE_INT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1962:3: lv_dateFutureYears_1_0= RULE_INT
-            {
-            lv_dateFutureYears_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerDateFuture4359); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_dateFutureYears_1_0, grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateFutureAccess().getFutureKeyword_0());
               		
             }
+            // InternalEntityMockDSL.g:1982:3: ( (lv_dateFutureYears_1_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:1983:4: (lv_dateFutureYears_1_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:1983:4: (lv_dateFutureYears_1_0= RULE_INT )
+            // InternalEntityMockDSL.g:1984:5: lv_dateFutureYears_1_0= RULE_INT
+            {
+            lv_dateFutureYears_1_0=(Token)match(input,RULE_INT,FOLLOW_42); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyFillerDateFutureRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"dateFutureYears",
-                      		lv_dateFutureYears_1_0, 
-                      		"INT");
-              	    
+              					newLeafNode(lv_dateFutureYears_1_0, grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,44,FOLLOW_44_in_rulePropertyFillerDateFuture4376); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyFillerDateFutureRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"dateFutureYears",
+              						lv_dateFutureYears_1_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,43,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateFutureAccess().getYearsKeyword_2());
+              		
             }
 
             }
@@ -5565,14 +5698,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5581,7 +5716,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerDatePast"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1990:1: entryRulePropertyFillerDatePast returns [EObject current=null] : iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF ;
+    // InternalEntityMockDSL.g:2008:1: entryRulePropertyFillerDatePast returns [EObject current=null] : iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF ;
     public final EObject entryRulePropertyFillerDatePast() throws RecognitionException {
         EObject current = null;
 
@@ -5589,13 +5724,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1991:2: (iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1992:2: iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF
+            // InternalEntityMockDSL.g:2008:63: (iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF )
+            // InternalEntityMockDSL.g:2009:2: iv_rulePropertyFillerDatePast= rulePropertyFillerDatePast EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerDatePastRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerDatePast_in_entryRulePropertyFillerDatePast4412);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerDatePast=rulePropertyFillerDatePast();
 
             state._fsp--;
@@ -5603,16 +5738,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerDatePast; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerDatePast4422); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5621,7 +5756,7 @@
 
 
     // $ANTLR start "rulePropertyFillerDatePast"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:1999:1: rulePropertyFillerDatePast returns [EObject current=null] : (otherlv_0= 'past date' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
+    // InternalEntityMockDSL.g:2015:1: rulePropertyFillerDatePast returns [EObject current=null] : (otherlv_0= 'past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) ;
     public final EObject rulePropertyFillerDatePast() throws RecognitionException {
         EObject current = null;
 
@@ -5629,56 +5764,57 @@
         Token lv_datePastYears_1_0=null;
         Token otherlv_2=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2002:28: ( (otherlv_0= 'past date' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2003:1: (otherlv_0= 'past date' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
+            // InternalEntityMockDSL.g:2021:2: ( (otherlv_0= 'past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' ) )
+            // InternalEntityMockDSL.g:2022:2: (otherlv_0= 'past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2003:1: (otherlv_0= 'past date' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2003:3: otherlv_0= 'past date' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years'
+            // InternalEntityMockDSL.g:2022:2: (otherlv_0= 'past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years' )
+            // InternalEntityMockDSL.g:2023:3: otherlv_0= 'past' ( (lv_datePastYears_1_0= RULE_INT ) ) otherlv_2= 'years'
             {
-            otherlv_0=(Token)match(input,45,FOLLOW_45_in_rulePropertyFillerDatePast4459); if (state.failed) return current;
+            otherlv_0=(Token)match(input,44,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDatePastAccess().getPastDateKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2007:1: ( (lv_datePastYears_1_0= RULE_INT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2008:1: (lv_datePastYears_1_0= RULE_INT )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2008:1: (lv_datePastYears_1_0= RULE_INT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2009:3: lv_datePastYears_1_0= RULE_INT
-            {
-            lv_datePastYears_1_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerDatePast4476); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_datePastYears_1_0, grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0()); 
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDatePastAccess().getPastKeyword_0());
               		
             }
+            // InternalEntityMockDSL.g:2027:3: ( (lv_datePastYears_1_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:2028:4: (lv_datePastYears_1_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:2028:4: (lv_datePastYears_1_0= RULE_INT )
+            // InternalEntityMockDSL.g:2029:5: lv_datePastYears_1_0= RULE_INT
+            {
+            lv_datePastYears_1_0=(Token)match(input,RULE_INT,FOLLOW_42); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyFillerDatePastRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"datePastYears",
-                      		lv_datePastYears_1_0, 
-                      		"INT");
-              	    
+              					newLeafNode(lv_datePastYears_1_0, grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,44,FOLLOW_44_in_rulePropertyFillerDatePast4493); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyFillerDatePastRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"datePastYears",
+              						lv_datePastYears_1_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,43,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDatePastAccess().getYearsKeyword_2());
+              		
             }
 
             }
@@ -5687,14 +5823,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5703,7 +5841,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerBoolean"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2037:1: entryRulePropertyFillerBoolean returns [EObject current=null] : iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF ;
+    // InternalEntityMockDSL.g:2053:1: entryRulePropertyFillerBoolean returns [EObject current=null] : iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF ;
     public final EObject entryRulePropertyFillerBoolean() throws RecognitionException {
         EObject current = null;
 
@@ -5711,13 +5849,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2038:2: (iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2039:2: iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF
+            // InternalEntityMockDSL.g:2053:62: (iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF )
+            // InternalEntityMockDSL.g:2054:2: iv_rulePropertyFillerBoolean= rulePropertyFillerBoolean EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerBooleanRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerBoolean_in_entryRulePropertyFillerBoolean4529);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerBoolean=rulePropertyFillerBoolean();
 
             state._fsp--;
@@ -5725,16 +5863,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerBoolean; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerBoolean4539); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5743,39 +5881,40 @@
 
 
     // $ANTLR start "rulePropertyFillerBoolean"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2046:1: rulePropertyFillerBoolean returns [EObject current=null] : ( () otherlv_1= 'boolean' ) ;
+    // InternalEntityMockDSL.g:2060:1: rulePropertyFillerBoolean returns [EObject current=null] : ( () otherlv_1= 'boolean' ) ;
     public final EObject rulePropertyFillerBoolean() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2049:28: ( ( () otherlv_1= 'boolean' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2050:1: ( () otherlv_1= 'boolean' )
+            // InternalEntityMockDSL.g:2066:2: ( ( () otherlv_1= 'boolean' ) )
+            // InternalEntityMockDSL.g:2067:2: ( () otherlv_1= 'boolean' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2050:1: ( () otherlv_1= 'boolean' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2050:2: () otherlv_1= 'boolean'
+            // InternalEntityMockDSL.g:2067:2: ( () otherlv_1= 'boolean' )
+            // InternalEntityMockDSL.g:2068:3: () otherlv_1= 'boolean'
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2050:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2051:5: 
+            // InternalEntityMockDSL.g:2068:3: ()
+            // InternalEntityMockDSL.g:2069:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerBooleanAccess().getPropertyFillerBooleanAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,46,FOLLOW_46_in_rulePropertyFillerBoolean4585); if (state.failed) return current;
+            otherlv_1=(Token)match(input,45,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerBooleanAccess().getBooleanKeyword_1());
+              		
             }
 
             }
@@ -5784,14 +5923,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5800,7 +5941,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerDateRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2068:1: entryRulePropertyFillerDateRange returns [EObject current=null] : iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF ;
+    // InternalEntityMockDSL.g:2083:1: entryRulePropertyFillerDateRange returns [EObject current=null] : iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF ;
     public final EObject entryRulePropertyFillerDateRange() throws RecognitionException {
         EObject current = null;
 
@@ -5808,13 +5949,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2069:2: (iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2070:2: iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF
+            // InternalEntityMockDSL.g:2083:64: (iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF )
+            // InternalEntityMockDSL.g:2084:2: iv_rulePropertyFillerDateRange= rulePropertyFillerDateRange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerDateRangeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerDateRange_in_entryRulePropertyFillerDateRange4621);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerDateRange=rulePropertyFillerDateRange();
 
             state._fsp--;
@@ -5822,16 +5963,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerDateRange; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerDateRange4631); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5840,61 +5981,69 @@
 
 
     // $ANTLR start "rulePropertyFillerDateRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2077:1: rulePropertyFillerDateRange returns [EObject current=null] : (otherlv_0= 'date in range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'up to and including' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' ) ;
+    // InternalEntityMockDSL.g:2090:1: rulePropertyFillerDateRange returns [EObject current=null] : (otherlv_0= 'dateRange' otherlv_1= 'from' ( (lv_dateBeginYears_2_0= ruleSINT ) ) otherlv_3= 'until' ( (lv_dateEndYears_4_0= ruleSINT ) ) otherlv_5= 'years' ) ;
     public final EObject rulePropertyFillerDateRange() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
-        Token otherlv_2=null;
-        Token otherlv_4=null;
-        AntlrDatatypeRuleToken lv_dateBeginYears_1_0 = null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        AntlrDatatypeRuleToken lv_dateBeginYears_2_0 = null;
 
-        AntlrDatatypeRuleToken lv_dateEndYears_3_0 = null;
+        AntlrDatatypeRuleToken lv_dateEndYears_4_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2080:28: ( (otherlv_0= 'date in range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'up to and including' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2081:1: (otherlv_0= 'date in range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'up to and including' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' )
+            // InternalEntityMockDSL.g:2096:2: ( (otherlv_0= 'dateRange' otherlv_1= 'from' ( (lv_dateBeginYears_2_0= ruleSINT ) ) otherlv_3= 'until' ( (lv_dateEndYears_4_0= ruleSINT ) ) otherlv_5= 'years' ) )
+            // InternalEntityMockDSL.g:2097:2: (otherlv_0= 'dateRange' otherlv_1= 'from' ( (lv_dateBeginYears_2_0= ruleSINT ) ) otherlv_3= 'until' ( (lv_dateEndYears_4_0= ruleSINT ) ) otherlv_5= 'years' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2081:1: (otherlv_0= 'date in range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'up to and including' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2081:3: otherlv_0= 'date in range' ( (lv_dateBeginYears_1_0= ruleSINT ) ) otherlv_2= 'up to and including' ( (lv_dateEndYears_3_0= ruleSINT ) ) otherlv_4= 'years'
+            // InternalEntityMockDSL.g:2097:2: (otherlv_0= 'dateRange' otherlv_1= 'from' ( (lv_dateBeginYears_2_0= ruleSINT ) ) otherlv_3= 'until' ( (lv_dateEndYears_4_0= ruleSINT ) ) otherlv_5= 'years' )
+            // InternalEntityMockDSL.g:2098:3: otherlv_0= 'dateRange' otherlv_1= 'from' ( (lv_dateBeginYears_2_0= ruleSINT ) ) otherlv_3= 'until' ( (lv_dateEndYears_4_0= ruleSINT ) ) otherlv_5= 'years'
             {
-            otherlv_0=(Token)match(input,47,FOLLOW_47_in_rulePropertyFillerDateRange4668); if (state.failed) return current;
+            otherlv_0=(Token)match(input,46,FOLLOW_43); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateRangeAccess().getDateInRangeKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerDateRangeAccess().getDateRangeKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2085:1: ( (lv_dateBeginYears_1_0= ruleSINT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2086:1: (lv_dateBeginYears_1_0= ruleSINT )
+            otherlv_1=(Token)match(input,47,FOLLOW_44); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerDateRangeAccess().getFromKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:2106:3: ( (lv_dateBeginYears_2_0= ruleSINT ) )
+            // InternalEntityMockDSL.g:2107:4: (lv_dateBeginYears_2_0= ruleSINT )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2086:1: (lv_dateBeginYears_1_0= ruleSINT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2087:3: lv_dateBeginYears_1_0= ruleSINT
+            // InternalEntityMockDSL.g:2107:4: (lv_dateBeginYears_2_0= ruleSINT )
+            // InternalEntityMockDSL.g:2108:5: lv_dateBeginYears_2_0= ruleSINT
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleSINT_in_rulePropertyFillerDateRange4689);
-            lv_dateBeginYears_1_0=ruleSINT();
+            pushFollow(FOLLOW_45);
+            lv_dateBeginYears_2_0=ruleSINT();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"dateBeginYears",
-                      		lv_dateBeginYears_1_0, 
-                      		"SINT");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
+              					}
+              					set(
+              						current,
+              						"dateBeginYears",
+              						lv_dateBeginYears_2_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -5902,40 +6051,40 @@
 
             }
 
-            otherlv_2=(Token)match(input,48,FOLLOW_48_in_rulePropertyFillerDateRange4701); if (state.failed) return current;
+            otherlv_3=(Token)match(input,48,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyFillerDateRangeAccess().getUpToAndIncludingKeyword_2());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerDateRangeAccess().getUntilKeyword_3());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2107:1: ( (lv_dateEndYears_3_0= ruleSINT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2108:1: (lv_dateEndYears_3_0= ruleSINT )
+            // InternalEntityMockDSL.g:2129:3: ( (lv_dateEndYears_4_0= ruleSINT ) )
+            // InternalEntityMockDSL.g:2130:4: (lv_dateEndYears_4_0= ruleSINT )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2108:1: (lv_dateEndYears_3_0= ruleSINT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2109:3: lv_dateEndYears_3_0= ruleSINT
+            // InternalEntityMockDSL.g:2130:4: (lv_dateEndYears_4_0= ruleSINT )
+            // InternalEntityMockDSL.g:2131:5: lv_dateEndYears_4_0= ruleSINT
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0());
+              				
             }
-            pushFollow(FOLLOW_ruleSINT_in_rulePropertyFillerDateRange4722);
-            lv_dateEndYears_3_0=ruleSINT();
+            pushFollow(FOLLOW_42);
+            lv_dateEndYears_4_0=ruleSINT();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"dateEndYears",
-                      		lv_dateEndYears_3_0, 
-                      		"SINT");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyFillerDateRangeRule());
+              					}
+              					set(
+              						current,
+              						"dateEndYears",
+              						lv_dateEndYears_4_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -5943,11 +6092,11 @@
 
             }
 
-            otherlv_4=(Token)match(input,44,FOLLOW_44_in_rulePropertyFillerDateRange4734); if (state.failed) return current;
+            otherlv_5=(Token)match(input,43,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_4());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getPropertyFillerDateRangeAccess().getYearsKeyword_5());
+              		
             }
 
             }
@@ -5956,14 +6105,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5972,7 +6123,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerSignedDoubleRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2137:1: entryRulePropertyFillerSignedDoubleRange returns [EObject current=null] : iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF ;
+    // InternalEntityMockDSL.g:2156:1: entryRulePropertyFillerSignedDoubleRange returns [EObject current=null] : iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF ;
     public final EObject entryRulePropertyFillerSignedDoubleRange() throws RecognitionException {
         EObject current = null;
 
@@ -5980,13 +6131,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2138:2: (iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2139:2: iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF
+            // InternalEntityMockDSL.g:2156:72: (iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF )
+            // InternalEntityMockDSL.g:2157:2: iv_rulePropertyFillerSignedDoubleRange= rulePropertyFillerSignedDoubleRange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerSignedDoubleRange_in_entryRulePropertyFillerSignedDoubleRange4770);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerSignedDoubleRange=rulePropertyFillerSignedDoubleRange();
 
             state._fsp--;
@@ -5994,16 +6145,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerSignedDoubleRange; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerSignedDoubleRange4780); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6012,93 +6163,101 @@
 
 
     // $ANTLR start "rulePropertyFillerSignedDoubleRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2146:1: rulePropertyFillerSignedDoubleRange returns [EObject current=null] : (otherlv_0= 'signed double in range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) ;
+    // InternalEntityMockDSL.g:2163:1: rulePropertyFillerSignedDoubleRange returns [EObject current=null] : (otherlv_0= 'numberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? ) ;
     public final EObject rulePropertyFillerSignedDoubleRange() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
-        Token otherlv_2=null;
+        Token otherlv_1=null;
         Token otherlv_3=null;
-        Token otherlv_5=null;
+        Token otherlv_4=null;
         Token otherlv_6=null;
-        Token lv_decimals_7_0=null;
-        Token otherlv_8=null;
+        Token otherlv_7=null;
+        Token lv_decimals_8_0=null;
         Token otherlv_9=null;
-        AntlrDatatypeRuleToken lv_beginRange_1_0 = null;
+        Token otherlv_10=null;
+        AntlrDatatypeRuleToken lv_beginRange_2_0 = null;
 
-        AntlrDatatypeRuleToken lv_endRange_4_0 = null;
+        AntlrDatatypeRuleToken lv_endRange_5_0 = null;
 
-        AntlrDatatypeRuleToken lv_rounded_10_0 = null;
+        AntlrDatatypeRuleToken lv_rounded_11_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2149:28: ( (otherlv_0= 'signed double in range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2150:1: (otherlv_0= 'signed double in range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
+            // InternalEntityMockDSL.g:2169:2: ( (otherlv_0= 'numberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? ) )
+            // InternalEntityMockDSL.g:2170:2: (otherlv_0= 'numberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2150:1: (otherlv_0= 'signed double in range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2150:3: otherlv_0= 'signed double in range' ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
+            // InternalEntityMockDSL.g:2170:2: (otherlv_0= 'numberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? )
+            // InternalEntityMockDSL.g:2171:3: otherlv_0= 'numberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )?
             {
-            otherlv_0=(Token)match(input,49,FOLLOW_49_in_rulePropertyFillerSignedDoubleRange4817); if (state.failed) return current;
+            otherlv_0=(Token)match(input,49,FOLLOW_43); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getSignedDoubleInRangeKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getNumberRangeKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2154:1: ( ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )?
-            int alt35=2;
-            int LA35_0 = input.LA(1);
+            otherlv_1=(Token)match(input,47,FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
 
-            if ( ((LA35_0>=RULE_INT && LA35_0<=RULE_ID)||LA35_0==48||LA35_0==80) ) {
-                alt35=1;
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getFromKeyword_1());
+              		
             }
-            switch (alt35) {
+            // InternalEntityMockDSL.g:2179:3: ( ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==RULE_ID||LA33_0==RULE_INT||LA33_0==48||LA33_0==77) ) {
+                alt33=1;
+            }
+            switch (alt33) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2154:2: ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
+                    // InternalEntityMockDSL.g:2180:4: ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2154:2: ( ( (lv_beginRange_1_0= ruleSignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )?
-                    int alt33=3;
-                    int LA33_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2180:4: ( ( (lv_beginRange_2_0= ruleSignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )?
+                    int alt31=3;
+                    int LA31_0 = input.LA(1);
 
-                    if ( (LA33_0==RULE_INT||LA33_0==80) ) {
-                        alt33=1;
+                    if ( (LA31_0==RULE_INT||LA31_0==77) ) {
+                        alt31=1;
                     }
-                    else if ( (LA33_0==RULE_ID) ) {
-                        alt33=2;
+                    else if ( (LA31_0==RULE_ID) ) {
+                        alt31=2;
                     }
-                    switch (alt33) {
+                    switch (alt31) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2154:3: ( (lv_beginRange_1_0= ruleSignedNumber ) )
+                            // InternalEntityMockDSL.g:2181:5: ( (lv_beginRange_2_0= ruleSignedNumber ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2154:3: ( (lv_beginRange_1_0= ruleSignedNumber ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2155:1: (lv_beginRange_1_0= ruleSignedNumber )
+                            // InternalEntityMockDSL.g:2181:5: ( (lv_beginRange_2_0= ruleSignedNumber ) )
+                            // InternalEntityMockDSL.g:2182:6: (lv_beginRange_2_0= ruleSignedNumber )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2155:1: (lv_beginRange_1_0= ruleSignedNumber )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2156:3: lv_beginRange_1_0= ruleSignedNumber
+                            // InternalEntityMockDSL.g:2182:6: (lv_beginRange_2_0= ruleSignedNumber )
+                            // InternalEntityMockDSL.g:2183:7: lv_beginRange_2_0= ruleSignedNumber
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_1_0_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeSignedNumberParserRuleCall_2_0_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleSignedNumber_in_rulePropertyFillerSignedDoubleRange4840);
-                            lv_beginRange_1_0=ruleSignedNumber();
+                            pushFollow(FOLLOW_45);
+                            lv_beginRange_2_0=ruleSignedNumber();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"beginRange",
-                                      		lv_beginRange_1_0, 
-                                      		"SignedNumber");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"beginRange",
+                              								lv_beginRange_2_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -6110,26 +6269,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2173:6: ( (otherlv_2= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2201:5: ( (otherlv_3= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2173:6: ( (otherlv_2= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2174:1: (otherlv_2= RULE_ID )
+                            // InternalEntityMockDSL.g:2201:5: ( (otherlv_3= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2202:6: (otherlv_3= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2174:1: (otherlv_2= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2175:3: otherlv_2= RULE_ID
+                            // InternalEntityMockDSL.g:2202:6: (otherlv_3= RULE_ID )
+                            // InternalEntityMockDSL.g:2203:7: otherlv_3= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerSignedDoubleRange4866); if (state.failed) return current;
+                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_2, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0()); 
-                              	
+                              							newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
+                              						
                             }
 
                             }
@@ -6143,61 +6302,61 @@
 
                     }
 
-                    otherlv_3=(Token)match(input,48,FOLLOW_48_in_rulePropertyFillerSignedDoubleRange4880); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,48,FOLLOW_47); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUpToAndIncludingKeyword_1_1());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getUntilKeyword_2_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2190:1: ( ( (lv_endRange_4_0= ruleSignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
-                    int alt34=2;
-                    int LA34_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2219:4: ( ( (lv_endRange_5_0= ruleSignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) )
+                    int alt32=2;
+                    int LA32_0 = input.LA(1);
 
-                    if ( (LA34_0==RULE_INT||LA34_0==80) ) {
-                        alt34=1;
+                    if ( (LA32_0==RULE_INT||LA32_0==77) ) {
+                        alt32=1;
                     }
-                    else if ( (LA34_0==RULE_ID) ) {
-                        alt34=2;
+                    else if ( (LA32_0==RULE_ID) ) {
+                        alt32=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 34, 0, input);
+                            new NoViableAltException("", 32, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt34) {
+                    switch (alt32) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2190:2: ( (lv_endRange_4_0= ruleSignedNumber ) )
+                            // InternalEntityMockDSL.g:2220:5: ( (lv_endRange_5_0= ruleSignedNumber ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2190:2: ( (lv_endRange_4_0= ruleSignedNumber ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2191:1: (lv_endRange_4_0= ruleSignedNumber )
+                            // InternalEntityMockDSL.g:2220:5: ( (lv_endRange_5_0= ruleSignedNumber ) )
+                            // InternalEntityMockDSL.g:2221:6: (lv_endRange_5_0= ruleSignedNumber )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2191:1: (lv_endRange_4_0= ruleSignedNumber )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2192:3: lv_endRange_4_0= ruleSignedNumber
+                            // InternalEntityMockDSL.g:2221:6: (lv_endRange_5_0= ruleSignedNumber )
+                            // InternalEntityMockDSL.g:2222:7: lv_endRange_5_0= ruleSignedNumber
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_1_2_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeSignedNumberParserRuleCall_2_2_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleSignedNumber_in_rulePropertyFillerSignedDoubleRange4902);
-                            lv_endRange_4_0=ruleSignedNumber();
+                            pushFollow(FOLLOW_30);
+                            lv_endRange_5_0=ruleSignedNumber();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"endRange",
-                                      		lv_endRange_4_0, 
-                                      		"SignedNumber");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"endRange",
+                              								lv_endRange_5_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -6209,26 +6368,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2209:6: ( (otherlv_5= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2240:5: ( (otherlv_6= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2209:6: ( (otherlv_5= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2210:1: (otherlv_5= RULE_ID )
+                            // InternalEntityMockDSL.g:2240:5: ( (otherlv_6= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2241:6: (otherlv_6= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2210:1: (otherlv_5= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2211:3: otherlv_5= RULE_ID
+                            // InternalEntityMockDSL.g:2241:6: (otherlv_6= RULE_ID )
+                            // InternalEntityMockDSL.g:2242:7: otherlv_6= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerSignedDoubleRange4928); if (state.failed) return current;
+                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_30); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_5, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0()); 
-                              	
+                              							newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
+                              						
                             }
 
                             }
@@ -6248,93 +6407,93 @@
 
             }
 
-            otherlv_6=(Token)match(input,35,FOLLOW_35_in_rulePropertyFillerSignedDoubleRange4943); if (state.failed) return current;
+            otherlv_7=(Token)match(input,33,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2226:1: ( (lv_decimals_7_0= RULE_INT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2227:1: (lv_decimals_7_0= RULE_INT )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2227:1: (lv_decimals_7_0= RULE_INT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2228:3: lv_decimals_7_0= RULE_INT
-            {
-            lv_decimals_7_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerSignedDoubleRange4960); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_decimals_7_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getWithKeyword_3());
               		
             }
+            // InternalEntityMockDSL.g:2259:3: ( (lv_decimals_8_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:2260:4: (lv_decimals_8_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:2260:4: (lv_decimals_8_0= RULE_INT )
+            // InternalEntityMockDSL.g:2261:5: lv_decimals_8_0= RULE_INT
+            {
+            lv_decimals_8_0=(Token)match(input,RULE_INT,FOLLOW_48); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"decimals",
-                      		lv_decimals_7_0, 
-                      		"INT");
-              	    
+              					newLeafNode(lv_decimals_8_0, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_8=(Token)match(input,50,FOLLOW_50_in_rulePropertyFillerSignedDoubleRange4977); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_8, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_4());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"decimals",
+              						lv_decimals_8_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2248:1: (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
-            int alt36=2;
-            int LA36_0 = input.LA(1);
 
-            if ( (LA36_0==51) ) {
-                alt36=1;
             }
-            switch (alt36) {
+
+
+            }
+
+            otherlv_9=(Token)match(input,50,FOLLOW_49); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getDecimalsKeyword_5());
+              		
+            }
+            // InternalEntityMockDSL.g:2281:3: (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==51) ) {
+                alt34=1;
+            }
+            switch (alt34) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2248:3: otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) )
+                    // InternalEntityMockDSL.g:2282:4: otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) )
                     {
-                    otherlv_9=(Token)match(input,51,FOLLOW_51_in_rulePropertyFillerSignedDoubleRange4990); if (state.failed) return current;
+                    otherlv_10=(Token)match(input,51,FOLLOW_44); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_5_0());
-                          
+                      				newLeafNode(otherlv_10, grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundToKeyword_6_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2252:1: ( (lv_rounded_10_0= ruleUnsignedNumber ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2253:1: (lv_rounded_10_0= ruleUnsignedNumber )
+                    // InternalEntityMockDSL.g:2286:4: ( (lv_rounded_11_0= ruleUnsignedNumber ) )
+                    // InternalEntityMockDSL.g:2287:5: (lv_rounded_11_0= ruleUnsignedNumber )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2253:1: (lv_rounded_10_0= ruleUnsignedNumber )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2254:3: lv_rounded_10_0= ruleUnsignedNumber
+                    // InternalEntityMockDSL.g:2287:5: (lv_rounded_11_0= ruleUnsignedNumber )
+                    // InternalEntityMockDSL.g:2288:6: lv_rounded_11_0= ruleUnsignedNumber
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePropertyFillerSignedDoubleRange5011);
-                    lv_rounded_10_0=ruleUnsignedNumber();
+                    pushFollow(FOLLOW_2);
+                    lv_rounded_11_0=ruleUnsignedNumber();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"rounded",
-                              		lv_rounded_10_0, 
-                              		"UnsignedNumber");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRangeRule());
+                      						}
+                      						set(
+                      							current,
+                      							"rounded",
+                      							lv_rounded_11_0,
+                      							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -6355,14 +6514,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6371,7 +6532,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerSignedDoubleRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2278:1: entryRulePropertyFillerSignedDoubleRandom returns [EObject current=null] : iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF ;
+    // InternalEntityMockDSL.g:2310:1: entryRulePropertyFillerSignedDoubleRandom returns [EObject current=null] : iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF ;
     public final EObject entryRulePropertyFillerSignedDoubleRandom() throws RecognitionException {
         EObject current = null;
 
@@ -6379,13 +6540,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2279:2: (iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2280:2: iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF
+            // InternalEntityMockDSL.g:2310:73: (iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF )
+            // InternalEntityMockDSL.g:2311:2: iv_rulePropertyFillerSignedDoubleRandom= rulePropertyFillerSignedDoubleRandom EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerSignedDoubleRandom_in_entryRulePropertyFillerSignedDoubleRandom5049);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerSignedDoubleRandom=rulePropertyFillerSignedDoubleRandom();
 
             state._fsp--;
@@ -6393,16 +6554,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerSignedDoubleRandom; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerSignedDoubleRandom5059); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6411,7 +6572,7 @@
 
 
     // $ANTLR start "rulePropertyFillerSignedDoubleRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2287:1: rulePropertyFillerSignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'signed double from' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) ;
+    // InternalEntityMockDSL.g:2317:1: rulePropertyFillerSignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'numberPick' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) ;
     public final EObject rulePropertyFillerSignedDoubleRandom() throws RecognitionException {
         EObject current = null;
 
@@ -6421,68 +6582,69 @@
         AntlrDatatypeRuleToken lv_items_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2290:28: ( (otherlv_0= 'signed double from' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2291:1: (otherlv_0= 'signed double from' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2323:2: ( (otherlv_0= 'numberPick' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' ) )
+            // InternalEntityMockDSL.g:2324:2: (otherlv_0= 'numberPick' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2291:1: (otherlv_0= 'signed double from' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2291:3: otherlv_0= 'signed double from' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')'
+            // InternalEntityMockDSL.g:2324:2: (otherlv_0= 'numberPick' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2325:3: otherlv_0= 'numberPick' otherlv_1= '(' ( (lv_items_2_0= ruleSignedNumber ) )+ otherlv_3= ')'
             {
-            otherlv_0=(Token)match(input,52,FOLLOW_52_in_rulePropertyFillerSignedDoubleRandom5096); if (state.failed) return current;
+            otherlv_0=(Token)match(input,52,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getSignedDoubleFromKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getNumberPickKeyword_0());
+              		
             }
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_rulePropertyFillerSignedDoubleRandom5108); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2299:1: ( (lv_items_2_0= ruleSignedNumber ) )+
-            int cnt37=0;
-            loop37:
+            // InternalEntityMockDSL.g:2333:3: ( (lv_items_2_0= ruleSignedNumber ) )+
+            int cnt35=0;
+            loop35:
             do {
-                int alt37=2;
-                int LA37_0 = input.LA(1);
+                int alt35=2;
+                int LA35_0 = input.LA(1);
 
-                if ( (LA37_0==RULE_INT||LA37_0==80) ) {
-                    alt37=1;
+                if ( (LA35_0==RULE_INT||LA35_0==77) ) {
+                    alt35=1;
                 }
 
 
-                switch (alt37) {
+                switch (alt35) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2300:1: (lv_items_2_0= ruleSignedNumber )
+            	    // InternalEntityMockDSL.g:2334:4: (lv_items_2_0= ruleSignedNumber )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2300:1: (lv_items_2_0= ruleSignedNumber )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2301:3: lv_items_2_0= ruleSignedNumber
+            	    // InternalEntityMockDSL.g:2334:4: (lv_items_2_0= ruleSignedNumber )
+            	    // InternalEntityMockDSL.g:2335:5: lv_items_2_0= ruleSignedNumber
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getItemsSignedNumberParserRuleCall_2_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleSignedNumber_in_rulePropertyFillerSignedDoubleRandom5129);
+            	    pushFollow(FOLLOW_50);
             	    lv_items_2_0=ruleSignedNumber();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRandomRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_2_0, 
-            	              		"SignedNumber");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getPropertyFillerSignedDoubleRandomRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"items",
+            	      						lv_items_2_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -6492,20 +6654,20 @@
             	    break;
 
             	default :
-            	    if ( cnt37 >= 1 ) break loop37;
+            	    if ( cnt35 >= 1 ) break loop35;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(37, input);
+                            new EarlyExitException(35, input);
                         throw eee;
                 }
-                cnt37++;
+                cnt35++;
             } while (true);
 
-            otherlv_3=(Token)match(input,28,FOLLOW_28_in_rulePropertyFillerSignedDoubleRandom5142); if (state.failed) return current;
+            otherlv_3=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedDoubleRandomAccess().getRightParenthesisKeyword_3());
+              		
             }
 
             }
@@ -6514,14 +6676,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6530,7 +6694,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerSignedIntegerRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2329:1: entryRulePropertyFillerSignedIntegerRange returns [EObject current=null] : iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF ;
+    // InternalEntityMockDSL.g:2360:1: entryRulePropertyFillerSignedIntegerRange returns [EObject current=null] : iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF ;
     public final EObject entryRulePropertyFillerSignedIntegerRange() throws RecognitionException {
         EObject current = null;
 
@@ -6538,13 +6702,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2330:2: (iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2331:2: iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF
+            // InternalEntityMockDSL.g:2360:73: (iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF )
+            // InternalEntityMockDSL.g:2361:2: iv_rulePropertyFillerSignedIntegerRange= rulePropertyFillerSignedIntegerRange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerSignedIntegerRange_in_entryRulePropertyFillerSignedIntegerRange5178);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerSignedIntegerRange=rulePropertyFillerSignedIntegerRange();
 
             state._fsp--;
@@ -6552,16 +6716,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerSignedIntegerRange; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerSignedIntegerRange5188); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6570,102 +6734,110 @@
 
 
     // $ANTLR start "rulePropertyFillerSignedIntegerRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2338:1: rulePropertyFillerSignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'signed integer in range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? ) ;
+    // InternalEntityMockDSL.g:2367:1: rulePropertyFillerSignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'integerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? ) ;
     public final EObject rulePropertyFillerSignedIntegerRange() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
-        Token otherlv_3=null;
+        Token otherlv_2=null;
         Token otherlv_4=null;
-        Token otherlv_6=null;
+        Token otherlv_5=null;
         Token otherlv_7=null;
-        Token lv_rounded_8_0=null;
-        AntlrDatatypeRuleToken lv_beginRange_2_0 = null;
+        Token otherlv_8=null;
+        Token lv_rounded_9_0=null;
+        AntlrDatatypeRuleToken lv_beginRange_3_0 = null;
 
-        AntlrDatatypeRuleToken lv_endRange_5_0 = null;
+        AntlrDatatypeRuleToken lv_endRange_6_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2341:28: ( ( () otherlv_1= 'signed integer in range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2342:1: ( () otherlv_1= 'signed integer in range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? )
+            // InternalEntityMockDSL.g:2373:2: ( ( () otherlv_1= 'integerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? ) )
+            // InternalEntityMockDSL.g:2374:2: ( () otherlv_1= 'integerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2342:1: ( () otherlv_1= 'signed integer in range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2342:2: () otherlv_1= 'signed integer in range' ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )?
+            // InternalEntityMockDSL.g:2374:2: ( () otherlv_1= 'integerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? )
+            // InternalEntityMockDSL.g:2375:3: () otherlv_1= 'integerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2342:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2343:5: 
+            // InternalEntityMockDSL.g:2375:3: ()
+            // InternalEntityMockDSL.g:2376:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getPropertyFillerSignedIntegerRangeAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,53,FOLLOW_53_in_rulePropertyFillerSignedIntegerRange5234); if (state.failed) return current;
+            otherlv_1=(Token)match(input,53,FOLLOW_43); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getSignedIntegerInRangeKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getIntegerRangeKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2352:1: ( ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
-            int alt40=2;
-            int LA40_0 = input.LA(1);
+            otherlv_2=(Token)match(input,47,FOLLOW_51); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
 
-            if ( ((LA40_0>=RULE_INT && LA40_0<=RULE_ID)||LA40_0==48||LA40_0==80) ) {
-                alt40=1;
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getFromKeyword_2());
+              		
             }
-            switch (alt40) {
+            // InternalEntityMockDSL.g:2390:3: ( ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) ) )?
+            int alt38=2;
+            int LA38_0 = input.LA(1);
+
+            if ( (LA38_0==RULE_ID||LA38_0==RULE_INT||LA38_0==48||LA38_0==77) ) {
+                alt38=1;
+            }
+            switch (alt38) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2352:2: ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) )
+                    // InternalEntityMockDSL.g:2391:4: ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2352:2: ( ( (lv_beginRange_2_0= ruleSINT ) ) | ( (otherlv_3= RULE_ID ) ) )?
-                    int alt38=3;
-                    int LA38_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2391:4: ( ( (lv_beginRange_3_0= ruleSINT ) ) | ( (otherlv_4= RULE_ID ) ) )?
+                    int alt36=3;
+                    int LA36_0 = input.LA(1);
 
-                    if ( (LA38_0==RULE_INT||LA38_0==80) ) {
-                        alt38=1;
+                    if ( (LA36_0==RULE_INT||LA36_0==77) ) {
+                        alt36=1;
                     }
-                    else if ( (LA38_0==RULE_ID) ) {
-                        alt38=2;
+                    else if ( (LA36_0==RULE_ID) ) {
+                        alt36=2;
                     }
-                    switch (alt38) {
+                    switch (alt36) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2352:3: ( (lv_beginRange_2_0= ruleSINT ) )
+                            // InternalEntityMockDSL.g:2392:5: ( (lv_beginRange_3_0= ruleSINT ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2352:3: ( (lv_beginRange_2_0= ruleSINT ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2353:1: (lv_beginRange_2_0= ruleSINT )
+                            // InternalEntityMockDSL.g:2392:5: ( (lv_beginRange_3_0= ruleSINT ) )
+                            // InternalEntityMockDSL.g:2393:6: (lv_beginRange_3_0= ruleSINT )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2353:1: (lv_beginRange_2_0= ruleSINT )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2354:3: lv_beginRange_2_0= ruleSINT
+                            // InternalEntityMockDSL.g:2393:6: (lv_beginRange_3_0= ruleSINT )
+                            // InternalEntityMockDSL.g:2394:7: lv_beginRange_3_0= ruleSINT
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_2_0_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeSINTParserRuleCall_3_0_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleSINT_in_rulePropertyFillerSignedIntegerRange5257);
-                            lv_beginRange_2_0=ruleSINT();
+                            pushFollow(FOLLOW_45);
+                            lv_beginRange_3_0=ruleSINT();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"beginRange",
-                                      		lv_beginRange_2_0, 
-                                      		"SINT");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"beginRange",
+                              								lv_beginRange_3_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -6677,26 +6849,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2371:6: ( (otherlv_3= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2412:5: ( (otherlv_4= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2371:6: ( (otherlv_3= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2372:1: (otherlv_3= RULE_ID )
+                            // InternalEntityMockDSL.g:2412:5: ( (otherlv_4= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2413:6: (otherlv_4= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2372:1: (otherlv_3= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2373:3: otherlv_3= RULE_ID
+                            // InternalEntityMockDSL.g:2413:6: (otherlv_4= RULE_ID )
+                            // InternalEntityMockDSL.g:2414:7: otherlv_4= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerSignedIntegerRange5283); if (state.failed) return current;
+                            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
-                              	
+                              							newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0());
+                              						
                             }
 
                             }
@@ -6710,61 +6882,61 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,48,FOLLOW_48_in_rulePropertyFillerSignedIntegerRange5297); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,48,FOLLOW_47); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUpToAndIncludingKeyword_2_1());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getUntilKeyword_3_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2388:1: ( ( (lv_endRange_5_0= ruleSINT ) ) | ( (otherlv_6= RULE_ID ) ) )
-                    int alt39=2;
-                    int LA39_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2430:4: ( ( (lv_endRange_6_0= ruleSINT ) ) | ( (otherlv_7= RULE_ID ) ) )
+                    int alt37=2;
+                    int LA37_0 = input.LA(1);
 
-                    if ( (LA39_0==RULE_INT||LA39_0==80) ) {
-                        alt39=1;
+                    if ( (LA37_0==RULE_INT||LA37_0==77) ) {
+                        alt37=1;
                     }
-                    else if ( (LA39_0==RULE_ID) ) {
-                        alt39=2;
+                    else if ( (LA37_0==RULE_ID) ) {
+                        alt37=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 39, 0, input);
+                            new NoViableAltException("", 37, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt39) {
+                    switch (alt37) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2388:2: ( (lv_endRange_5_0= ruleSINT ) )
+                            // InternalEntityMockDSL.g:2431:5: ( (lv_endRange_6_0= ruleSINT ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2388:2: ( (lv_endRange_5_0= ruleSINT ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2389:1: (lv_endRange_5_0= ruleSINT )
+                            // InternalEntityMockDSL.g:2431:5: ( (lv_endRange_6_0= ruleSINT ) )
+                            // InternalEntityMockDSL.g:2432:6: (lv_endRange_6_0= ruleSINT )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2389:1: (lv_endRange_5_0= ruleSINT )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2390:3: lv_endRange_5_0= ruleSINT
+                            // InternalEntityMockDSL.g:2432:6: (lv_endRange_6_0= ruleSINT )
+                            // InternalEntityMockDSL.g:2433:7: lv_endRange_6_0= ruleSINT
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_2_2_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeSINTParserRuleCall_3_2_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleSINT_in_rulePropertyFillerSignedIntegerRange5319);
-                            lv_endRange_5_0=ruleSINT();
+                            pushFollow(FOLLOW_49);
+                            lv_endRange_6_0=ruleSINT();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"endRange",
-                                      		lv_endRange_5_0, 
-                                      		"SINT");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"endRange",
+                              								lv_endRange_6_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -6776,26 +6948,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2407:6: ( (otherlv_6= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2451:5: ( (otherlv_7= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2407:6: ( (otherlv_6= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2408:1: (otherlv_6= RULE_ID )
+                            // InternalEntityMockDSL.g:2451:5: ( (otherlv_7= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2452:6: (otherlv_7= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2408:1: (otherlv_6= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2409:3: otherlv_6= RULE_ID
+                            // InternalEntityMockDSL.g:2452:6: (otherlv_7= RULE_ID )
+                            // InternalEntityMockDSL.g:2453:7: otherlv_7= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerSignedIntegerRange5345); if (state.failed) return current;
+                            otherlv_7=(Token)match(input,RULE_ID,FOLLOW_49); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_6, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
-                              	
+                              							newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0());
+                              						
                             }
 
                             }
@@ -6815,46 +6987,46 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2420:5: (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )?
-            int alt41=2;
-            int LA41_0 = input.LA(1);
+            // InternalEntityMockDSL.g:2466:3: (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )?
+            int alt39=2;
+            int LA39_0 = input.LA(1);
 
-            if ( (LA41_0==51) ) {
-                alt41=1;
+            if ( (LA39_0==51) ) {
+                alt39=1;
             }
-            switch (alt41) {
+            switch (alt39) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2420:7: otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:2467:4: otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) )
                     {
-                    otherlv_7=(Token)match(input,51,FOLLOW_51_in_rulePropertyFillerSignedIntegerRange5361); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,51,FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_3_0());
-                          
+                      				newLeafNode(otherlv_8, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundToKeyword_4_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2424:1: ( (lv_rounded_8_0= RULE_INT ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2425:1: (lv_rounded_8_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2471:4: ( (lv_rounded_9_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:2472:5: (lv_rounded_9_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2425:1: (lv_rounded_8_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2426:3: lv_rounded_8_0= RULE_INT
+                    // InternalEntityMockDSL.g:2472:5: (lv_rounded_9_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2473:6: lv_rounded_9_0= RULE_INT
                     {
-                    lv_rounded_8_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerSignedIntegerRange5378); if (state.failed) return current;
+                    lv_rounded_9_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_rounded_8_0, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0()); 
-                      		
+                      						newLeafNode(lv_rounded_9_0, grammarAccess.getPropertyFillerSignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"rounded",
-                              		lv_rounded_8_0, 
-                              		"INT");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPropertyFillerSignedIntegerRangeRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"rounded",
+                      							lv_rounded_9_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
                     }
 
                     }
@@ -6875,14 +7047,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6891,7 +7065,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerSignedIntegerRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2450:1: entryRulePropertyFillerSignedIntegerRandom returns [EObject current=null] : iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF ;
+    // InternalEntityMockDSL.g:2494:1: entryRulePropertyFillerSignedIntegerRandom returns [EObject current=null] : iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF ;
     public final EObject entryRulePropertyFillerSignedIntegerRandom() throws RecognitionException {
         EObject current = null;
 
@@ -6899,13 +7073,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2451:2: (iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2452:2: iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF
+            // InternalEntityMockDSL.g:2494:74: (iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF )
+            // InternalEntityMockDSL.g:2495:2: iv_rulePropertyFillerSignedIntegerRandom= rulePropertyFillerSignedIntegerRandom EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerSignedIntegerRandom_in_entryRulePropertyFillerSignedIntegerRandom5421);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerSignedIntegerRandom=rulePropertyFillerSignedIntegerRandom();
 
             state._fsp--;
@@ -6913,16 +7087,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerSignedIntegerRandom; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerSignedIntegerRandom5431); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6931,7 +7105,7 @@
 
 
     // $ANTLR start "rulePropertyFillerSignedIntegerRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2459:1: rulePropertyFillerSignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'signed integer from' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) ;
+    // InternalEntityMockDSL.g:2501:1: rulePropertyFillerSignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'integerPick' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) ;
     public final EObject rulePropertyFillerSignedIntegerRandom() throws RecognitionException {
         EObject current = null;
 
@@ -6941,68 +7115,69 @@
         AntlrDatatypeRuleToken lv_items_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2462:28: ( (otherlv_0= 'signed integer from' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2463:1: (otherlv_0= 'signed integer from' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2507:2: ( (otherlv_0= 'integerPick' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' ) )
+            // InternalEntityMockDSL.g:2508:2: (otherlv_0= 'integerPick' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2463:1: (otherlv_0= 'signed integer from' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2463:3: otherlv_0= 'signed integer from' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')'
+            // InternalEntityMockDSL.g:2508:2: (otherlv_0= 'integerPick' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2509:3: otherlv_0= 'integerPick' otherlv_1= '(' ( (lv_items_2_0= ruleSINT ) )+ otherlv_3= ')'
             {
-            otherlv_0=(Token)match(input,54,FOLLOW_54_in_rulePropertyFillerSignedIntegerRandom5468); if (state.failed) return current;
+            otherlv_0=(Token)match(input,54,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getSignedIntegerFromKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getIntegerPickKeyword_0());
+              		
             }
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_rulePropertyFillerSignedIntegerRandom5480); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2471:1: ( (lv_items_2_0= ruleSINT ) )+
-            int cnt42=0;
-            loop42:
+            // InternalEntityMockDSL.g:2517:3: ( (lv_items_2_0= ruleSINT ) )+
+            int cnt40=0;
+            loop40:
             do {
-                int alt42=2;
-                int LA42_0 = input.LA(1);
+                int alt40=2;
+                int LA40_0 = input.LA(1);
 
-                if ( (LA42_0==RULE_INT||LA42_0==80) ) {
-                    alt42=1;
+                if ( (LA40_0==RULE_INT||LA40_0==77) ) {
+                    alt40=1;
                 }
 
 
-                switch (alt42) {
+                switch (alt40) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2472:1: (lv_items_2_0= ruleSINT )
+            	    // InternalEntityMockDSL.g:2518:4: (lv_items_2_0= ruleSINT )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2472:1: (lv_items_2_0= ruleSINT )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2473:3: lv_items_2_0= ruleSINT
+            	    // InternalEntityMockDSL.g:2518:4: (lv_items_2_0= ruleSINT )
+            	    // InternalEntityMockDSL.g:2519:5: lv_items_2_0= ruleSINT
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getItemsSINTParserRuleCall_2_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleSINT_in_rulePropertyFillerSignedIntegerRandom5501);
+            	    pushFollow(FOLLOW_50);
             	    lv_items_2_0=ruleSINT();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRandomRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_2_0, 
-            	              		"SINT");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getPropertyFillerSignedIntegerRandomRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"items",
+            	      						lv_items_2_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -7012,20 +7187,20 @@
             	    break;
 
             	default :
-            	    if ( cnt42 >= 1 ) break loop42;
+            	    if ( cnt40 >= 1 ) break loop40;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(42, input);
+                            new EarlyExitException(40, input);
                         throw eee;
                 }
-                cnt42++;
+                cnt40++;
             } while (true);
 
-            otherlv_3=(Token)match(input,28,FOLLOW_28_in_rulePropertyFillerSignedIntegerRandom5514); if (state.failed) return current;
+            otherlv_3=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerSignedIntegerRandomAccess().getRightParenthesisKeyword_3());
+              		
             }
 
             }
@@ -7034,14 +7209,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7050,7 +7227,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerTextRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2501:1: entryRulePropertyFillerTextRandom returns [EObject current=null] : iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF ;
+    // InternalEntityMockDSL.g:2544:1: entryRulePropertyFillerTextRandom returns [EObject current=null] : iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF ;
     public final EObject entryRulePropertyFillerTextRandom() throws RecognitionException {
         EObject current = null;
 
@@ -7058,13 +7235,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2502:2: (iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2503:2: iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF
+            // InternalEntityMockDSL.g:2544:65: (iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF )
+            // InternalEntityMockDSL.g:2545:2: iv_rulePropertyFillerTextRandom= rulePropertyFillerTextRandom EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerTextRandomRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerTextRandom_in_entryRulePropertyFillerTextRandom5550);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerTextRandom=rulePropertyFillerTextRandom();
 
             state._fsp--;
@@ -7072,16 +7249,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerTextRandom; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerTextRandom5560); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7090,7 +7267,7 @@
 
 
     // $ANTLR start "rulePropertyFillerTextRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2510:1: rulePropertyFillerTextRandom returns [EObject current=null] : (otherlv_0= 'text from' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) ;
+    // InternalEntityMockDSL.g:2551:1: rulePropertyFillerTextRandom returns [EObject current=null] : (otherlv_0= 'textPick' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) ;
     public final EObject rulePropertyFillerTextRandom() throws RecognitionException {
         EObject current = null;
 
@@ -7099,63 +7276,64 @@
         Token lv_items_2_0=null;
         Token otherlv_3=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2513:28: ( (otherlv_0= 'text from' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2514:1: (otherlv_0= 'text from' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2557:2: ( (otherlv_0= 'textPick' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' ) )
+            // InternalEntityMockDSL.g:2558:2: (otherlv_0= 'textPick' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2514:1: (otherlv_0= 'text from' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2514:3: otherlv_0= 'text from' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')'
+            // InternalEntityMockDSL.g:2558:2: (otherlv_0= 'textPick' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2559:3: otherlv_0= 'textPick' otherlv_1= '(' ( (lv_items_2_0= RULE_STRING ) )+ otherlv_3= ')'
             {
-            otherlv_0=(Token)match(input,55,FOLLOW_55_in_rulePropertyFillerTextRandom5597); if (state.failed) return current;
+            otherlv_0=(Token)match(input,55,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerTextRandomAccess().getTextFromKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerTextRandomAccess().getTextPickKeyword_0());
+              		
             }
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_rulePropertyFillerTextRandom5609); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_8); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextRandomAccess().getLeftParenthesisKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2522:1: ( (lv_items_2_0= RULE_STRING ) )+
-            int cnt43=0;
-            loop43:
+            // InternalEntityMockDSL.g:2567:3: ( (lv_items_2_0= RULE_STRING ) )+
+            int cnt41=0;
+            loop41:
             do {
-                int alt43=2;
-                int LA43_0 = input.LA(1);
+                int alt41=2;
+                int LA41_0 = input.LA(1);
 
-                if ( (LA43_0==RULE_STRING) ) {
-                    alt43=1;
+                if ( (LA41_0==RULE_STRING) ) {
+                    alt41=1;
                 }
 
 
-                switch (alt43) {
+                switch (alt41) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2523:1: (lv_items_2_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:2568:4: (lv_items_2_0= RULE_STRING )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2523:1: (lv_items_2_0= RULE_STRING )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2524:3: lv_items_2_0= RULE_STRING
+            	    // InternalEntityMockDSL.g:2568:4: (lv_items_2_0= RULE_STRING )
+            	    // InternalEntityMockDSL.g:2569:5: lv_items_2_0= RULE_STRING
             	    {
-            	    lv_items_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyFillerTextRandom5626); if (state.failed) return current;
+            	    lv_items_2_0=(Token)match(input,RULE_STRING,FOLLOW_24); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0()); 
-            	      		
+            	      					newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerTextRandomAccess().getItemsSTRINGTerminalRuleCall_2_0());
+            	      				
             	    }
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getPropertyFillerTextRandomRule());
-            	      	        }
-            	             		addWithLastConsumed(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_2_0, 
-            	              		"STRING");
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElement(grammarAccess.getPropertyFillerTextRandomRule());
+            	      					}
+            	      					addWithLastConsumed(
+            	      						current,
+            	      						"items",
+            	      						lv_items_2_0,
+            	      						"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      				
             	    }
 
             	    }
@@ -7165,20 +7343,20 @@
             	    break;
 
             	default :
-            	    if ( cnt43 >= 1 ) break loop43;
+            	    if ( cnt41 >= 1 ) break loop41;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(43, input);
+                            new EarlyExitException(41, input);
                         throw eee;
                 }
-                cnt43++;
+                cnt41++;
             } while (true);
 
-            otherlv_3=(Token)match(input,28,FOLLOW_28_in_rulePropertyFillerTextRandom5644); if (state.failed) return current;
+            otherlv_3=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerTextRandomAccess().getRightParenthesisKeyword_3());
+              		
             }
 
             }
@@ -7187,14 +7365,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7203,7 +7383,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerTextParagraphs"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2552:1: entryRulePropertyFillerTextParagraphs returns [EObject current=null] : iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF ;
+    // InternalEntityMockDSL.g:2593:1: entryRulePropertyFillerTextParagraphs returns [EObject current=null] : iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF ;
     public final EObject entryRulePropertyFillerTextParagraphs() throws RecognitionException {
         EObject current = null;
 
@@ -7211,13 +7391,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2553:2: (iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2554:2: iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF
+            // InternalEntityMockDSL.g:2593:69: (iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF )
+            // InternalEntityMockDSL.g:2594:2: iv_rulePropertyFillerTextParagraphs= rulePropertyFillerTextParagraphs EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerTextParagraphsRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerTextParagraphs_in_entryRulePropertyFillerTextParagraphs5680);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerTextParagraphs=rulePropertyFillerTextParagraphs();
 
             state._fsp--;
@@ -7225,16 +7405,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerTextParagraphs; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerTextParagraphs5690); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7243,72 +7423,73 @@
 
 
     // $ANTLR start "rulePropertyFillerTextParagraphs"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2561:1: rulePropertyFillerTextParagraphs returns [EObject current=null] : ( () otherlv_1= 'paragraps' ( (lv_count_2_0= RULE_INT ) )? ) ;
+    // InternalEntityMockDSL.g:2600:1: rulePropertyFillerTextParagraphs returns [EObject current=null] : ( () otherlv_1= 'paragraphs' ( (lv_count_2_0= RULE_INT ) )? ) ;
     public final EObject rulePropertyFillerTextParagraphs() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token lv_count_2_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2564:28: ( ( () otherlv_1= 'paragraps' ( (lv_count_2_0= RULE_INT ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2565:1: ( () otherlv_1= 'paragraps' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2606:2: ( ( () otherlv_1= 'paragraphs' ( (lv_count_2_0= RULE_INT ) )? ) )
+            // InternalEntityMockDSL.g:2607:2: ( () otherlv_1= 'paragraphs' ( (lv_count_2_0= RULE_INT ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2565:1: ( () otherlv_1= 'paragraps' ( (lv_count_2_0= RULE_INT ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2565:2: () otherlv_1= 'paragraps' ( (lv_count_2_0= RULE_INT ) )?
+            // InternalEntityMockDSL.g:2607:2: ( () otherlv_1= 'paragraphs' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2608:3: () otherlv_1= 'paragraphs' ( (lv_count_2_0= RULE_INT ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2565:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2566:5: 
+            // InternalEntityMockDSL.g:2608:3: ()
+            // InternalEntityMockDSL.g:2609:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerTextParagraphsAccess().getPropertyFillerTextParagraphsAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,56,FOLLOW_56_in_rulePropertyFillerTextParagraphs5736); if (state.failed) return current;
+            otherlv_1=(Token)match(input,56,FOLLOW_52); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextParagraphsAccess().getParagrapsKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextParagraphsAccess().getParagraphsKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2575:1: ( (lv_count_2_0= RULE_INT ) )?
-            int alt44=2;
-            int LA44_0 = input.LA(1);
+            // InternalEntityMockDSL.g:2619:3: ( (lv_count_2_0= RULE_INT ) )?
+            int alt42=2;
+            int LA42_0 = input.LA(1);
 
-            if ( (LA44_0==RULE_INT) ) {
-                alt44=1;
+            if ( (LA42_0==RULE_INT) ) {
+                alt42=1;
             }
-            switch (alt44) {
+            switch (alt42) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2576:1: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2620:4: (lv_count_2_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2576:1: (lv_count_2_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2577:3: lv_count_2_0= RULE_INT
+                    // InternalEntityMockDSL.g:2620:4: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2621:5: lv_count_2_0= RULE_INT
                     {
-                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerTextParagraphs5753); if (state.failed) return current;
+                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0()); 
-                      		
+                      					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextParagraphsAccess().getCountINTTerminalRuleCall_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyFillerTextParagraphsRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"count",
-                              		lv_count_2_0, 
-                              		"INT");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getPropertyFillerTextParagraphsRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"count",
+                      						lv_count_2_0,
+                      						"org.eclipse.xtext.xbase.Xbase.INT");
+                      				
                     }
 
                     }
@@ -7326,14 +7507,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7342,7 +7525,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerTextSentences"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2601:1: entryRulePropertyFillerTextSentences returns [EObject current=null] : iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF ;
+    // InternalEntityMockDSL.g:2641:1: entryRulePropertyFillerTextSentences returns [EObject current=null] : iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF ;
     public final EObject entryRulePropertyFillerTextSentences() throws RecognitionException {
         EObject current = null;
 
@@ -7350,13 +7533,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2602:2: (iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2603:2: iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF
+            // InternalEntityMockDSL.g:2641:68: (iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF )
+            // InternalEntityMockDSL.g:2642:2: iv_rulePropertyFillerTextSentences= rulePropertyFillerTextSentences EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerTextSentencesRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerTextSentences_in_entryRulePropertyFillerTextSentences5795);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerTextSentences=rulePropertyFillerTextSentences();
 
             state._fsp--;
@@ -7364,16 +7547,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerTextSentences; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerTextSentences5805); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7382,72 +7565,73 @@
 
 
     // $ANTLR start "rulePropertyFillerTextSentences"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2610:1: rulePropertyFillerTextSentences returns [EObject current=null] : ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? ) ;
+    // InternalEntityMockDSL.g:2648:1: rulePropertyFillerTextSentences returns [EObject current=null] : ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? ) ;
     public final EObject rulePropertyFillerTextSentences() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token lv_count_2_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2613:28: ( ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2614:1: ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2654:2: ( ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? ) )
+            // InternalEntityMockDSL.g:2655:2: ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2614:1: ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2614:2: () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )?
+            // InternalEntityMockDSL.g:2655:2: ( () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2656:3: () otherlv_1= 'sentences' ( (lv_count_2_0= RULE_INT ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2614:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2615:5: 
+            // InternalEntityMockDSL.g:2656:3: ()
+            // InternalEntityMockDSL.g:2657:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerTextSentencesAccess().getPropertyFillerTextSentencesAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,57,FOLLOW_57_in_rulePropertyFillerTextSentences5851); if (state.failed) return current;
+            otherlv_1=(Token)match(input,57,FOLLOW_52); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextSentencesAccess().getSentencesKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2624:1: ( (lv_count_2_0= RULE_INT ) )?
-            int alt45=2;
-            int LA45_0 = input.LA(1);
+            // InternalEntityMockDSL.g:2667:3: ( (lv_count_2_0= RULE_INT ) )?
+            int alt43=2;
+            int LA43_0 = input.LA(1);
 
-            if ( (LA45_0==RULE_INT) ) {
-                alt45=1;
+            if ( (LA43_0==RULE_INT) ) {
+                alt43=1;
             }
-            switch (alt45) {
+            switch (alt43) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2625:1: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2668:4: (lv_count_2_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2625:1: (lv_count_2_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2626:3: lv_count_2_0= RULE_INT
+                    // InternalEntityMockDSL.g:2668:4: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2669:5: lv_count_2_0= RULE_INT
                     {
-                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerTextSentences5868); if (state.failed) return current;
+                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0()); 
-                      		
+                      					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextSentencesAccess().getCountINTTerminalRuleCall_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyFillerTextSentencesRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"count",
-                              		lv_count_2_0, 
-                              		"INT");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getPropertyFillerTextSentencesRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"count",
+                      						lv_count_2_0,
+                      						"org.eclipse.xtext.xbase.Xbase.INT");
+                      				
                     }
 
                     }
@@ -7465,14 +7649,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7481,7 +7667,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerTextWords"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2650:1: entryRulePropertyFillerTextWords returns [EObject current=null] : iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF ;
+    // InternalEntityMockDSL.g:2689:1: entryRulePropertyFillerTextWords returns [EObject current=null] : iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF ;
     public final EObject entryRulePropertyFillerTextWords() throws RecognitionException {
         EObject current = null;
 
@@ -7489,13 +7675,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2651:2: (iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2652:2: iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF
+            // InternalEntityMockDSL.g:2689:64: (iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF )
+            // InternalEntityMockDSL.g:2690:2: iv_rulePropertyFillerTextWords= rulePropertyFillerTextWords EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerTextWordsRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerTextWords_in_entryRulePropertyFillerTextWords5910);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerTextWords=rulePropertyFillerTextWords();
 
             state._fsp--;
@@ -7503,16 +7689,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerTextWords; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerTextWords5920); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7521,72 +7707,73 @@
 
 
     // $ANTLR start "rulePropertyFillerTextWords"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2659:1: rulePropertyFillerTextWords returns [EObject current=null] : ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? ) ;
+    // InternalEntityMockDSL.g:2696:1: rulePropertyFillerTextWords returns [EObject current=null] : ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? ) ;
     public final EObject rulePropertyFillerTextWords() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token lv_count_2_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2662:28: ( ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2663:1: ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2702:2: ( ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? ) )
+            // InternalEntityMockDSL.g:2703:2: ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2663:1: ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2663:2: () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )?
+            // InternalEntityMockDSL.g:2703:2: ( () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )? )
+            // InternalEntityMockDSL.g:2704:3: () otherlv_1= 'words' ( (lv_count_2_0= RULE_INT ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2663:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2664:5: 
+            // InternalEntityMockDSL.g:2704:3: ()
+            // InternalEntityMockDSL.g:2705:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerTextWordsAccess().getPropertyFillerTextWordsAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,58,FOLLOW_58_in_rulePropertyFillerTextWords5966); if (state.failed) return current;
+            otherlv_1=(Token)match(input,58,FOLLOW_52); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerTextWordsAccess().getWordsKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2673:1: ( (lv_count_2_0= RULE_INT ) )?
-            int alt46=2;
-            int LA46_0 = input.LA(1);
+            // InternalEntityMockDSL.g:2715:3: ( (lv_count_2_0= RULE_INT ) )?
+            int alt44=2;
+            int LA44_0 = input.LA(1);
 
-            if ( (LA46_0==RULE_INT) ) {
-                alt46=1;
+            if ( (LA44_0==RULE_INT) ) {
+                alt44=1;
             }
-            switch (alt46) {
+            switch (alt44) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2674:1: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2716:4: (lv_count_2_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2674:1: (lv_count_2_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2675:3: lv_count_2_0= RULE_INT
+                    // InternalEntityMockDSL.g:2716:4: (lv_count_2_0= RULE_INT )
+                    // InternalEntityMockDSL.g:2717:5: lv_count_2_0= RULE_INT
                     {
-                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerTextWords5983); if (state.failed) return current;
+                    lv_count_2_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0()); 
-                      		
+                      					newLeafNode(lv_count_2_0, grammarAccess.getPropertyFillerTextWordsAccess().getCountINTTerminalRuleCall_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyFillerTextWordsRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"count",
-                              		lv_count_2_0, 
-                              		"INT");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getPropertyFillerTextWordsRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"count",
+                      						lv_count_2_0,
+                      						"org.eclipse.xtext.xbase.Xbase.INT");
+                      				
                     }
 
                     }
@@ -7604,14 +7791,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7620,7 +7809,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerUnsignedDoubleRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2699:1: entryRulePropertyFillerUnsignedDoubleRange returns [EObject current=null] : iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF ;
+    // InternalEntityMockDSL.g:2737:1: entryRulePropertyFillerUnsignedDoubleRange returns [EObject current=null] : iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF ;
     public final EObject entryRulePropertyFillerUnsignedDoubleRange() throws RecognitionException {
         EObject current = null;
 
@@ -7628,13 +7817,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2700:2: (iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2701:2: iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF
+            // InternalEntityMockDSL.g:2737:74: (iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF )
+            // InternalEntityMockDSL.g:2738:2: iv_rulePropertyFillerUnsignedDoubleRange= rulePropertyFillerUnsignedDoubleRange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerUnsignedDoubleRange_in_entryRulePropertyFillerUnsignedDoubleRange6025);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerUnsignedDoubleRange=rulePropertyFillerUnsignedDoubleRange();
 
             state._fsp--;
@@ -7642,16 +7831,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerUnsignedDoubleRange; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerUnsignedDoubleRange6035); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7660,93 +7849,101 @@
 
 
     // $ANTLR start "rulePropertyFillerUnsignedDoubleRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2708:1: rulePropertyFillerUnsignedDoubleRange returns [EObject current=null] : (otherlv_0= 'unsigned double in range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) ;
+    // InternalEntityMockDSL.g:2744:1: rulePropertyFillerUnsignedDoubleRange returns [EObject current=null] : (otherlv_0= 'unsignedNumberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? ) ;
     public final EObject rulePropertyFillerUnsignedDoubleRange() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
-        Token otherlv_2=null;
+        Token otherlv_1=null;
         Token otherlv_3=null;
-        Token otherlv_5=null;
+        Token otherlv_4=null;
         Token otherlv_6=null;
-        Token lv_decimals_7_0=null;
-        Token otherlv_8=null;
+        Token otherlv_7=null;
+        Token lv_decimals_8_0=null;
         Token otherlv_9=null;
-        AntlrDatatypeRuleToken lv_beginRange_1_0 = null;
+        Token otherlv_10=null;
+        AntlrDatatypeRuleToken lv_beginRange_2_0 = null;
 
-        AntlrDatatypeRuleToken lv_endRange_4_0 = null;
+        AntlrDatatypeRuleToken lv_endRange_5_0 = null;
 
-        AntlrDatatypeRuleToken lv_rounded_10_0 = null;
+        AntlrDatatypeRuleToken lv_rounded_11_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2711:28: ( (otherlv_0= 'unsigned double in range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2712:1: (otherlv_0= 'unsigned double in range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
+            // InternalEntityMockDSL.g:2750:2: ( (otherlv_0= 'unsignedNumberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? ) )
+            // InternalEntityMockDSL.g:2751:2: (otherlv_0= 'unsignedNumberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2712:1: (otherlv_0= 'unsigned double in range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2712:3: otherlv_0= 'unsigned double in range' ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )? otherlv_6= 'with' ( (lv_decimals_7_0= RULE_INT ) ) otherlv_8= 'decimals' (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
+            // InternalEntityMockDSL.g:2751:2: (otherlv_0= 'unsignedNumberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )? )
+            // InternalEntityMockDSL.g:2752:3: otherlv_0= 'unsignedNumberRange' otherlv_1= 'from' ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )? otherlv_7= 'with' ( (lv_decimals_8_0= RULE_INT ) ) otherlv_9= 'decimals' (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )?
             {
-            otherlv_0=(Token)match(input,59,FOLLOW_59_in_rulePropertyFillerUnsignedDoubleRange6072); if (state.failed) return current;
+            otherlv_0=(Token)match(input,59,FOLLOW_43); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedDoubleInRangeKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUnsignedNumberRangeKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2716:1: ( ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) ) )?
-            int alt49=2;
-            int LA49_0 = input.LA(1);
+            otherlv_1=(Token)match(input,47,FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
 
-            if ( ((LA49_0>=RULE_INT && LA49_0<=RULE_ID)||LA49_0==48) ) {
-                alt49=1;
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getFromKeyword_1());
+              		
             }
-            switch (alt49) {
+            // InternalEntityMockDSL.g:2760:3: ( ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
+            int alt47=2;
+            int LA47_0 = input.LA(1);
+
+            if ( (LA47_0==RULE_ID||LA47_0==RULE_INT||LA47_0==48) ) {
+                alt47=1;
+            }
+            switch (alt47) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2716:2: ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )? otherlv_3= 'up to and including' ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
+                    // InternalEntityMockDSL.g:2761:4: ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'until' ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2716:2: ( ( (lv_beginRange_1_0= ruleUnsignedNumber ) ) | ( (otherlv_2= RULE_ID ) ) )?
-                    int alt47=3;
-                    int LA47_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2761:4: ( ( (lv_beginRange_2_0= ruleUnsignedNumber ) ) | ( (otherlv_3= RULE_ID ) ) )?
+                    int alt45=3;
+                    int LA45_0 = input.LA(1);
 
-                    if ( (LA47_0==RULE_INT) ) {
-                        alt47=1;
+                    if ( (LA45_0==RULE_INT) ) {
+                        alt45=1;
                     }
-                    else if ( (LA47_0==RULE_ID) ) {
-                        alt47=2;
+                    else if ( (LA45_0==RULE_ID) ) {
+                        alt45=2;
                     }
-                    switch (alt47) {
+                    switch (alt45) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2716:3: ( (lv_beginRange_1_0= ruleUnsignedNumber ) )
+                            // InternalEntityMockDSL.g:2762:5: ( (lv_beginRange_2_0= ruleUnsignedNumber ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2716:3: ( (lv_beginRange_1_0= ruleUnsignedNumber ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2717:1: (lv_beginRange_1_0= ruleUnsignedNumber )
+                            // InternalEntityMockDSL.g:2762:5: ( (lv_beginRange_2_0= ruleUnsignedNumber ) )
+                            // InternalEntityMockDSL.g:2763:6: (lv_beginRange_2_0= ruleUnsignedNumber )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2717:1: (lv_beginRange_1_0= ruleUnsignedNumber )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2718:3: lv_beginRange_1_0= ruleUnsignedNumber
+                            // InternalEntityMockDSL.g:2763:6: (lv_beginRange_2_0= ruleUnsignedNumber )
+                            // InternalEntityMockDSL.g:2764:7: lv_beginRange_2_0= ruleUnsignedNumber
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_1_0_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePropertyFillerUnsignedDoubleRange6095);
-                            lv_beginRange_1_0=ruleUnsignedNumber();
+                            pushFollow(FOLLOW_45);
+                            lv_beginRange_2_0=ruleUnsignedNumber();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"beginRange",
-                                      		lv_beginRange_1_0, 
-                                      		"UnsignedNumber");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"beginRange",
+                              								lv_beginRange_2_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -7758,26 +7955,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2735:6: ( (otherlv_2= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2782:5: ( (otherlv_3= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2735:6: ( (otherlv_2= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2736:1: (otherlv_2= RULE_ID )
+                            // InternalEntityMockDSL.g:2782:5: ( (otherlv_3= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2783:6: (otherlv_3= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2736:1: (otherlv_2= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2737:3: otherlv_2= RULE_ID
+                            // InternalEntityMockDSL.g:2783:6: (otherlv_3= RULE_ID )
+                            // InternalEntityMockDSL.g:2784:7: otherlv_3= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerUnsignedDoubleRange6121); if (state.failed) return current;
+                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_2, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0()); 
-                              	
+                              							newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0());
+                              						
                             }
 
                             }
@@ -7791,61 +7988,61 @@
 
                     }
 
-                    otherlv_3=(Token)match(input,48,FOLLOW_48_in_rulePropertyFillerUnsignedDoubleRange6135); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,48,FOLLOW_47); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUpToAndIncludingKeyword_1_1());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getUntilKeyword_2_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2752:1: ( ( (lv_endRange_4_0= ruleUnsignedNumber ) ) | ( (otherlv_5= RULE_ID ) ) )
-                    int alt48=2;
-                    int LA48_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2800:4: ( ( (lv_endRange_5_0= ruleUnsignedNumber ) ) | ( (otherlv_6= RULE_ID ) ) )
+                    int alt46=2;
+                    int LA46_0 = input.LA(1);
 
-                    if ( (LA48_0==RULE_INT) ) {
-                        alt48=1;
+                    if ( (LA46_0==RULE_INT) ) {
+                        alt46=1;
                     }
-                    else if ( (LA48_0==RULE_ID) ) {
-                        alt48=2;
+                    else if ( (LA46_0==RULE_ID) ) {
+                        alt46=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 48, 0, input);
+                            new NoViableAltException("", 46, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt48) {
+                    switch (alt46) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2752:2: ( (lv_endRange_4_0= ruleUnsignedNumber ) )
+                            // InternalEntityMockDSL.g:2801:5: ( (lv_endRange_5_0= ruleUnsignedNumber ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2752:2: ( (lv_endRange_4_0= ruleUnsignedNumber ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2753:1: (lv_endRange_4_0= ruleUnsignedNumber )
+                            // InternalEntityMockDSL.g:2801:5: ( (lv_endRange_5_0= ruleUnsignedNumber ) )
+                            // InternalEntityMockDSL.g:2802:6: (lv_endRange_5_0= ruleUnsignedNumber )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2753:1: (lv_endRange_4_0= ruleUnsignedNumber )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2754:3: lv_endRange_4_0= ruleUnsignedNumber
+                            // InternalEntityMockDSL.g:2802:6: (lv_endRange_5_0= ruleUnsignedNumber )
+                            // InternalEntityMockDSL.g:2803:7: lv_endRange_5_0= ruleUnsignedNumber
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_1_2_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeUnsignedNumberParserRuleCall_2_2_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePropertyFillerUnsignedDoubleRange6157);
-                            lv_endRange_4_0=ruleUnsignedNumber();
+                            pushFollow(FOLLOW_30);
+                            lv_endRange_5_0=ruleUnsignedNumber();
 
                             state._fsp--;
                             if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-                              	        }
-                                     		set(
-                                     			current, 
-                                     			"endRange",
-                                      		lv_endRange_4_0, 
-                                      		"UnsignedNumber");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"endRange",
+                              								lv_endRange_5_0,
+                              								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -7857,26 +8054,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2771:6: ( (otherlv_5= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2821:5: ( (otherlv_6= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2771:6: ( (otherlv_5= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2772:1: (otherlv_5= RULE_ID )
+                            // InternalEntityMockDSL.g:2821:5: ( (otherlv_6= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2822:6: (otherlv_6= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2772:1: (otherlv_5= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2773:3: otherlv_5= RULE_ID
+                            // InternalEntityMockDSL.g:2822:6: (otherlv_6= RULE_ID )
+                            // InternalEntityMockDSL.g:2823:7: otherlv_6= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerUnsignedDoubleRange6183); if (state.failed) return current;
+                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_30); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_5, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_1_2_1_0()); 
-                              	
+                              							newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0());
+                              						
                             }
 
                             }
@@ -7896,93 +8093,93 @@
 
             }
 
-            otherlv_6=(Token)match(input,35,FOLLOW_35_in_rulePropertyFillerUnsignedDoubleRange6198); if (state.failed) return current;
+            otherlv_7=(Token)match(input,33,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2788:1: ( (lv_decimals_7_0= RULE_INT ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2789:1: (lv_decimals_7_0= RULE_INT )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2789:1: (lv_decimals_7_0= RULE_INT )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2790:3: lv_decimals_7_0= RULE_INT
-            {
-            lv_decimals_7_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerUnsignedDoubleRange6215); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_decimals_7_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getWithKeyword_3());
               		
             }
+            // InternalEntityMockDSL.g:2840:3: ( (lv_decimals_8_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:2841:4: (lv_decimals_8_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:2841:4: (lv_decimals_8_0= RULE_INT )
+            // InternalEntityMockDSL.g:2842:5: lv_decimals_8_0= RULE_INT
+            {
+            lv_decimals_8_0=(Token)match(input,RULE_INT,FOLLOW_48); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"decimals",
-                      		lv_decimals_7_0, 
-                      		"INT");
-              	    
+              					newLeafNode(lv_decimals_8_0, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsINTTerminalRuleCall_4_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_8=(Token)match(input,50,FOLLOW_50_in_rulePropertyFillerUnsignedDoubleRange6232); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_8, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_4());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"decimals",
+              						lv_decimals_8_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2810:1: (otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) ) )?
-            int alt50=2;
-            int LA50_0 = input.LA(1);
 
-            if ( (LA50_0==51) ) {
-                alt50=1;
             }
-            switch (alt50) {
+
+
+            }
+
+            otherlv_9=(Token)match(input,50,FOLLOW_49); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getDecimalsKeyword_5());
+              		
+            }
+            // InternalEntityMockDSL.g:2862:3: (otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) ) )?
+            int alt48=2;
+            int LA48_0 = input.LA(1);
+
+            if ( (LA48_0==51) ) {
+                alt48=1;
+            }
+            switch (alt48) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2810:3: otherlv_9= 'round to' ( (lv_rounded_10_0= ruleUnsignedNumber ) )
+                    // InternalEntityMockDSL.g:2863:4: otherlv_10= 'roundTo' ( (lv_rounded_11_0= ruleUnsignedNumber ) )
                     {
-                    otherlv_9=(Token)match(input,51,FOLLOW_51_in_rulePropertyFillerUnsignedDoubleRange6245); if (state.failed) return current;
+                    otherlv_10=(Token)match(input,51,FOLLOW_44); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_5_0());
-                          
+                      				newLeafNode(otherlv_10, grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundToKeyword_6_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2814:1: ( (lv_rounded_10_0= ruleUnsignedNumber ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2815:1: (lv_rounded_10_0= ruleUnsignedNumber )
+                    // InternalEntityMockDSL.g:2867:4: ( (lv_rounded_11_0= ruleUnsignedNumber ) )
+                    // InternalEntityMockDSL.g:2868:5: (lv_rounded_11_0= ruleUnsignedNumber )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2815:1: (lv_rounded_10_0= ruleUnsignedNumber )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2816:3: lv_rounded_10_0= ruleUnsignedNumber
+                    // InternalEntityMockDSL.g:2868:5: (lv_rounded_11_0= ruleUnsignedNumber )
+                    // InternalEntityMockDSL.g:2869:6: lv_rounded_11_0= ruleUnsignedNumber
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_5_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRangeAccess().getRoundedUnsignedNumberParserRuleCall_6_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePropertyFillerUnsignedDoubleRange6266);
-                    lv_rounded_10_0=ruleUnsignedNumber();
+                    pushFollow(FOLLOW_2);
+                    lv_rounded_11_0=ruleUnsignedNumber();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"rounded",
-                              		lv_rounded_10_0, 
-                              		"UnsignedNumber");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRangeRule());
+                      						}
+                      						set(
+                      							current,
+                      							"rounded",
+                      							lv_rounded_11_0,
+                      							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -8003,14 +8200,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8019,7 +8218,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerUnsignedDoubleRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2840:1: entryRulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] : iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF ;
+    // InternalEntityMockDSL.g:2891:1: entryRulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] : iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF ;
     public final EObject entryRulePropertyFillerUnsignedDoubleRandom() throws RecognitionException {
         EObject current = null;
 
@@ -8027,13 +8226,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2841:2: (iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2842:2: iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF
+            // InternalEntityMockDSL.g:2891:75: (iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF )
+            // InternalEntityMockDSL.g:2892:2: iv_rulePropertyFillerUnsignedDoubleRandom= rulePropertyFillerUnsignedDoubleRandom EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerUnsignedDoubleRandom_in_entryRulePropertyFillerUnsignedDoubleRandom6304);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerUnsignedDoubleRandom=rulePropertyFillerUnsignedDoubleRandom();
 
             state._fsp--;
@@ -8041,16 +8240,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerUnsignedDoubleRandom; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerUnsignedDoubleRandom6314); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8059,7 +8258,7 @@
 
 
     // $ANTLR start "rulePropertyFillerUnsignedDoubleRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2849:1: rulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'unsigned double from' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) ;
+    // InternalEntityMockDSL.g:2898:1: rulePropertyFillerUnsignedDoubleRandom returns [EObject current=null] : (otherlv_0= 'unsignedNumberPick' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) ;
     public final EObject rulePropertyFillerUnsignedDoubleRandom() throws RecognitionException {
         EObject current = null;
 
@@ -8069,68 +8268,69 @@
         AntlrDatatypeRuleToken lv_items_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2852:28: ( (otherlv_0= 'unsigned double from' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2853:1: (otherlv_0= 'unsigned double from' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2904:2: ( (otherlv_0= 'unsignedNumberPick' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' ) )
+            // InternalEntityMockDSL.g:2905:2: (otherlv_0= 'unsignedNumberPick' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2853:1: (otherlv_0= 'unsigned double from' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2853:3: otherlv_0= 'unsigned double from' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')'
+            // InternalEntityMockDSL.g:2905:2: (otherlv_0= 'unsignedNumberPick' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:2906:3: otherlv_0= 'unsignedNumberPick' otherlv_1= '(' ( (lv_items_2_0= ruleUnsignedNumber ) )+ otherlv_3= ')'
             {
-            otherlv_0=(Token)match(input,60,FOLLOW_60_in_rulePropertyFillerUnsignedDoubleRandom6351); if (state.failed) return current;
+            otherlv_0=(Token)match(input,60,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedDoubleFromKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getUnsignedNumberPickKeyword_0());
+              		
             }
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_rulePropertyFillerUnsignedDoubleRandom6363); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getLeftParenthesisKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2861:1: ( (lv_items_2_0= ruleUnsignedNumber ) )+
-            int cnt51=0;
-            loop51:
+            // InternalEntityMockDSL.g:2914:3: ( (lv_items_2_0= ruleUnsignedNumber ) )+
+            int cnt49=0;
+            loop49:
             do {
-                int alt51=2;
-                int LA51_0 = input.LA(1);
+                int alt49=2;
+                int LA49_0 = input.LA(1);
 
-                if ( (LA51_0==RULE_INT) ) {
-                    alt51=1;
+                if ( (LA49_0==RULE_INT) ) {
+                    alt49=1;
                 }
 
 
-                switch (alt51) {
+                switch (alt49) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2862:1: (lv_items_2_0= ruleUnsignedNumber )
+            	    // InternalEntityMockDSL.g:2915:4: (lv_items_2_0= ruleUnsignedNumber )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2862:1: (lv_items_2_0= ruleUnsignedNumber )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2863:3: lv_items_2_0= ruleUnsignedNumber
+            	    // InternalEntityMockDSL.g:2915:4: (lv_items_2_0= ruleUnsignedNumber )
+            	    // InternalEntityMockDSL.g:2916:5: lv_items_2_0= ruleUnsignedNumber
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getItemsUnsignedNumberParserRuleCall_2_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePropertyFillerUnsignedDoubleRandom6384);
+            	    pushFollow(FOLLOW_50);
             	    lv_items_2_0=ruleUnsignedNumber();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_2_0, 
-            	              		"UnsignedNumber");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getPropertyFillerUnsignedDoubleRandomRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"items",
+            	      						lv_items_2_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -8140,20 +8340,20 @@
             	    break;
 
             	default :
-            	    if ( cnt51 >= 1 ) break loop51;
+            	    if ( cnt49 >= 1 ) break loop49;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(51, input);
+                            new EarlyExitException(49, input);
                         throw eee;
                 }
-                cnt51++;
+                cnt49++;
             } while (true);
 
-            otherlv_3=(Token)match(input,28,FOLLOW_28_in_rulePropertyFillerUnsignedDoubleRandom6397); if (state.failed) return current;
+            otherlv_3=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedDoubleRandomAccess().getRightParenthesisKeyword_3());
+              		
             }
 
             }
@@ -8162,14 +8362,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8178,7 +8380,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerUnsignedIntegerRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2891:1: entryRulePropertyFillerUnsignedIntegerRange returns [EObject current=null] : iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF ;
+    // InternalEntityMockDSL.g:2941:1: entryRulePropertyFillerUnsignedIntegerRange returns [EObject current=null] : iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF ;
     public final EObject entryRulePropertyFillerUnsignedIntegerRange() throws RecognitionException {
         EObject current = null;
 
@@ -8186,13 +8388,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2892:2: (iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2893:2: iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF
+            // InternalEntityMockDSL.g:2941:75: (iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF )
+            // InternalEntityMockDSL.g:2942:2: iv_rulePropertyFillerUnsignedIntegerRange= rulePropertyFillerUnsignedIntegerRange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerUnsignedIntegerRange_in_entryRulePropertyFillerUnsignedIntegerRange6433);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerUnsignedIntegerRange=rulePropertyFillerUnsignedIntegerRange();
 
             state._fsp--;
@@ -8200,16 +8402,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerUnsignedIntegerRange; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerUnsignedIntegerRange6443); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8218,95 +8420,103 @@
 
 
     // $ANTLR start "rulePropertyFillerUnsignedIntegerRange"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2900:1: rulePropertyFillerUnsignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'unsigned integer in range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? ) ;
+    // InternalEntityMockDSL.g:2948:1: rulePropertyFillerUnsignedIntegerRange returns [EObject current=null] : ( () otherlv_1= 'unsignedIntegerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? ) ;
     public final EObject rulePropertyFillerUnsignedIntegerRange() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
-        Token lv_beginRange_2_0=null;
-        Token otherlv_3=null;
+        Token otherlv_2=null;
+        Token lv_beginRange_3_0=null;
         Token otherlv_4=null;
-        Token lv_endRange_5_0=null;
-        Token otherlv_6=null;
+        Token otherlv_5=null;
+        Token lv_endRange_6_0=null;
         Token otherlv_7=null;
-        Token lv_rounded_8_0=null;
+        Token otherlv_8=null;
+        Token lv_rounded_9_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2903:28: ( ( () otherlv_1= 'unsigned integer in range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2904:1: ( () otherlv_1= 'unsigned integer in range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? )
+            // InternalEntityMockDSL.g:2954:2: ( ( () otherlv_1= 'unsignedIntegerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? ) )
+            // InternalEntityMockDSL.g:2955:2: ( () otherlv_1= 'unsignedIntegerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2904:1: ( () otherlv_1= 'unsigned integer in range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )? )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2904:2: () otherlv_1= 'unsigned integer in range' ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )? (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )?
+            // InternalEntityMockDSL.g:2955:2: ( () otherlv_1= 'unsignedIntegerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )? )
+            // InternalEntityMockDSL.g:2956:3: () otherlv_1= 'unsignedIntegerRange' otherlv_2= 'from' ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )? (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )?
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2904:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2905:5: 
+            // InternalEntityMockDSL.g:2956:3: ()
+            // InternalEntityMockDSL.g:2957:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getPropertyFillerUnsignedIntegerRangeAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,61,FOLLOW_61_in_rulePropertyFillerUnsignedIntegerRange6489); if (state.failed) return current;
+            otherlv_1=(Token)match(input,61,FOLLOW_43); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerInRangeKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUnsignedIntegerRangeKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2914:1: ( ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) ) )?
-            int alt54=2;
-            int LA54_0 = input.LA(1);
+            otherlv_2=(Token)match(input,47,FOLLOW_53); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
 
-            if ( ((LA54_0>=RULE_INT && LA54_0<=RULE_ID)||LA54_0==48) ) {
-                alt54=1;
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getFromKeyword_2());
+              		
             }
-            switch (alt54) {
+            // InternalEntityMockDSL.g:2971:3: ( ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) ) )?
+            int alt52=2;
+            int LA52_0 = input.LA(1);
+
+            if ( (LA52_0==RULE_ID||LA52_0==RULE_INT||LA52_0==48) ) {
+                alt52=1;
+            }
+            switch (alt52) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2914:2: ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )? otherlv_4= 'up to and including' ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) )
+                    // InternalEntityMockDSL.g:2972:4: ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )? otherlv_5= 'until' ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2914:2: ( ( (lv_beginRange_2_0= RULE_INT ) ) | ( (otherlv_3= RULE_ID ) ) )?
-                    int alt52=3;
-                    int LA52_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:2972:4: ( ( (lv_beginRange_3_0= RULE_INT ) ) | ( (otherlv_4= RULE_ID ) ) )?
+                    int alt50=3;
+                    int LA50_0 = input.LA(1);
 
-                    if ( (LA52_0==RULE_INT) ) {
-                        alt52=1;
+                    if ( (LA50_0==RULE_INT) ) {
+                        alt50=1;
                     }
-                    else if ( (LA52_0==RULE_ID) ) {
-                        alt52=2;
+                    else if ( (LA50_0==RULE_ID) ) {
+                        alt50=2;
                     }
-                    switch (alt52) {
+                    switch (alt50) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2914:3: ( (lv_beginRange_2_0= RULE_INT ) )
+                            // InternalEntityMockDSL.g:2973:5: ( (lv_beginRange_3_0= RULE_INT ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2914:3: ( (lv_beginRange_2_0= RULE_INT ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2915:1: (lv_beginRange_2_0= RULE_INT )
+                            // InternalEntityMockDSL.g:2973:5: ( (lv_beginRange_3_0= RULE_INT ) )
+                            // InternalEntityMockDSL.g:2974:6: (lv_beginRange_3_0= RULE_INT )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2915:1: (lv_beginRange_2_0= RULE_INT )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2916:3: lv_beginRange_2_0= RULE_INT
+                            // InternalEntityMockDSL.g:2974:6: (lv_beginRange_3_0= RULE_INT )
+                            // InternalEntityMockDSL.g:2975:7: lv_beginRange_3_0= RULE_INT
                             {
-                            lv_beginRange_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerUnsignedIntegerRange6508); if (state.failed) return current;
+                            lv_beginRange_3_0=(Token)match(input,RULE_INT,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              			newLeafNode(lv_beginRange_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_2_0_0_0()); 
-                              		
+                              							newLeafNode(lv_beginRange_3_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeINTTerminalRuleCall_3_0_0_0());
+                              						
                             }
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-                              	        }
-                                     		setWithLastConsumed(
-                                     			current, 
-                                     			"beginRange",
-                                      		lv_beginRange_2_0, 
-                                      		"INT");
-                              	    
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+                              							}
+                              							setWithLastConsumed(
+                              								current,
+                              								"beginRange",
+                              								lv_beginRange_3_0,
+                              								"org.eclipse.xtext.xbase.Xbase.INT");
+                              						
                             }
 
                             }
@@ -8318,26 +8528,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2933:6: ( (otherlv_3= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2992:5: ( (otherlv_4= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2933:6: ( (otherlv_3= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2934:1: (otherlv_3= RULE_ID )
+                            // InternalEntityMockDSL.g:2992:5: ( (otherlv_4= RULE_ID ) )
+                            // InternalEntityMockDSL.g:2993:6: (otherlv_4= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2934:1: (otherlv_3= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2935:3: otherlv_3= RULE_ID
+                            // InternalEntityMockDSL.g:2993:6: (otherlv_4= RULE_ID )
+                            // InternalEntityMockDSL.g:2994:7: otherlv_4= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerUnsignedIntegerRange6539); if (state.failed) return current;
+                            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0()); 
-                              	
+                              							newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0());
+                              						
                             }
 
                             }
@@ -8351,56 +8561,56 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,48,FOLLOW_48_in_rulePropertyFillerUnsignedIntegerRange6553); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,48,FOLLOW_54); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUpToAndIncludingKeyword_2_1());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getUntilKeyword_3_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2950:1: ( ( (lv_endRange_5_0= RULE_INT ) ) | ( (otherlv_6= RULE_ID ) ) )
-                    int alt53=2;
-                    int LA53_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:3010:4: ( ( (lv_endRange_6_0= RULE_INT ) ) | ( (otherlv_7= RULE_ID ) ) )
+                    int alt51=2;
+                    int LA51_0 = input.LA(1);
 
-                    if ( (LA53_0==RULE_INT) ) {
-                        alt53=1;
+                    if ( (LA51_0==RULE_INT) ) {
+                        alt51=1;
                     }
-                    else if ( (LA53_0==RULE_ID) ) {
-                        alt53=2;
+                    else if ( (LA51_0==RULE_ID) ) {
+                        alt51=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 53, 0, input);
+                            new NoViableAltException("", 51, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt53) {
+                    switch (alt51) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2950:2: ( (lv_endRange_5_0= RULE_INT ) )
+                            // InternalEntityMockDSL.g:3011:5: ( (lv_endRange_6_0= RULE_INT ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2950:2: ( (lv_endRange_5_0= RULE_INT ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2951:1: (lv_endRange_5_0= RULE_INT )
+                            // InternalEntityMockDSL.g:3011:5: ( (lv_endRange_6_0= RULE_INT ) )
+                            // InternalEntityMockDSL.g:3012:6: (lv_endRange_6_0= RULE_INT )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2951:1: (lv_endRange_5_0= RULE_INT )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2952:3: lv_endRange_5_0= RULE_INT
+                            // InternalEntityMockDSL.g:3012:6: (lv_endRange_6_0= RULE_INT )
+                            // InternalEntityMockDSL.g:3013:7: lv_endRange_6_0= RULE_INT
                             {
-                            lv_endRange_5_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerUnsignedIntegerRange6571); if (state.failed) return current;
+                            lv_endRange_6_0=(Token)match(input,RULE_INT,FOLLOW_49); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              			newLeafNode(lv_endRange_5_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_2_2_0_0()); 
-                              		
+                              							newLeafNode(lv_endRange_6_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeINTTerminalRuleCall_3_2_0_0());
+                              						
                             }
                             if ( state.backtracking==0 ) {
 
-                              	        if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-                              	        }
-                                     		setWithLastConsumed(
-                                     			current, 
-                                     			"endRange",
-                                      		lv_endRange_5_0, 
-                                      		"INT");
-                              	    
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+                              							}
+                              							setWithLastConsumed(
+                              								current,
+                              								"endRange",
+                              								lv_endRange_6_0,
+                              								"org.eclipse.xtext.xbase.Xbase.INT");
+                              						
                             }
 
                             }
@@ -8412,26 +8622,26 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2969:6: ( (otherlv_6= RULE_ID ) )
+                            // InternalEntityMockDSL.g:3030:5: ( (otherlv_7= RULE_ID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2969:6: ( (otherlv_6= RULE_ID ) )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2970:1: (otherlv_6= RULE_ID )
+                            // InternalEntityMockDSL.g:3030:5: ( (otherlv_7= RULE_ID ) )
+                            // InternalEntityMockDSL.g:3031:6: (otherlv_7= RULE_ID )
                             {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2970:1: (otherlv_6= RULE_ID )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2971:3: otherlv_6= RULE_ID
+                            // InternalEntityMockDSL.g:3031:6: (otherlv_7= RULE_ID )
+                            // InternalEntityMockDSL.g:3032:7: otherlv_7= RULE_ID
                             {
                             if ( state.backtracking==0 ) {
 
-                              			if (current==null) {
-                              	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-                              	        }
-                                      
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+                              							}
+                              						
                             }
-                            otherlv_6=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePropertyFillerUnsignedIntegerRange6602); if (state.failed) return current;
+                            otherlv_7=(Token)match(input,RULE_ID,FOLLOW_49); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                              		newLeafNode(otherlv_6, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_2_2_1_0()); 
-                              	
+                              							newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getEndRangeRefLEntityAttributeCrossReference_3_2_1_0());
+                              						
                             }
 
                             }
@@ -8451,46 +8661,46 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2982:5: (otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) ) )?
-            int alt55=2;
-            int LA55_0 = input.LA(1);
+            // InternalEntityMockDSL.g:3045:3: (otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) ) )?
+            int alt53=2;
+            int LA53_0 = input.LA(1);
 
-            if ( (LA55_0==51) ) {
-                alt55=1;
+            if ( (LA53_0==51) ) {
+                alt53=1;
             }
-            switch (alt55) {
+            switch (alt53) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2982:7: otherlv_7= 'round to' ( (lv_rounded_8_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3046:4: otherlv_8= 'roundTo' ( (lv_rounded_9_0= RULE_INT ) )
                     {
-                    otherlv_7=(Token)match(input,51,FOLLOW_51_in_rulePropertyFillerUnsignedIntegerRange6618); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,51,FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_3_0());
-                          
+                      				newLeafNode(otherlv_8, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundToKeyword_4_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2986:1: ( (lv_rounded_8_0= RULE_INT ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2987:1: (lv_rounded_8_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3050:4: ( (lv_rounded_9_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3051:5: (lv_rounded_9_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2987:1: (lv_rounded_8_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:2988:3: lv_rounded_8_0= RULE_INT
+                    // InternalEntityMockDSL.g:3051:5: (lv_rounded_9_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3052:6: lv_rounded_9_0= RULE_INT
                     {
-                    lv_rounded_8_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerUnsignedIntegerRange6635); if (state.failed) return current;
+                    lv_rounded_9_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_rounded_8_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_3_1_0()); 
-                      		
+                      						newLeafNode(lv_rounded_9_0, grammarAccess.getPropertyFillerUnsignedIntegerRangeAccess().getRoundedINTTerminalRuleCall_4_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"rounded",
-                              		lv_rounded_8_0, 
-                              		"INT");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRangeRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"rounded",
+                      							lv_rounded_9_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
                     }
 
                     }
@@ -8511,14 +8721,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8527,7 +8739,7 @@
 
 
     // $ANTLR start "entryRulePropertyFillerUnsignedIntegerRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3012:1: entryRulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] : iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF ;
+    // InternalEntityMockDSL.g:3073:1: entryRulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] : iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF ;
     public final EObject entryRulePropertyFillerUnsignedIntegerRandom() throws RecognitionException {
         EObject current = null;
 
@@ -8535,13 +8747,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3013:2: (iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3014:2: iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF
+            // InternalEntityMockDSL.g:3073:76: (iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF )
+            // InternalEntityMockDSL.g:3074:2: iv_rulePropertyFillerUnsignedIntegerRandom= rulePropertyFillerUnsignedIntegerRandom EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyFillerUnsignedIntegerRandom_in_entryRulePropertyFillerUnsignedIntegerRandom6678);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyFillerUnsignedIntegerRandom=rulePropertyFillerUnsignedIntegerRandom();
 
             state._fsp--;
@@ -8549,16 +8761,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyFillerUnsignedIntegerRandom; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyFillerUnsignedIntegerRandom6688); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8567,7 +8779,7 @@
 
 
     // $ANTLR start "rulePropertyFillerUnsignedIntegerRandom"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3021:1: rulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'unsigned integer from' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) ;
+    // InternalEntityMockDSL.g:3080:1: rulePropertyFillerUnsignedIntegerRandom returns [EObject current=null] : (otherlv_0= 'unsignedIntegerPick' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) ;
     public final EObject rulePropertyFillerUnsignedIntegerRandom() throws RecognitionException {
         EObject current = null;
 
@@ -8576,63 +8788,64 @@
         Token lv_items_2_0=null;
         Token otherlv_3=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3024:28: ( (otherlv_0= 'unsigned integer from' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3025:1: (otherlv_0= 'unsigned integer from' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:3086:2: ( (otherlv_0= 'unsignedIntegerPick' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' ) )
+            // InternalEntityMockDSL.g:3087:2: (otherlv_0= 'unsignedIntegerPick' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3025:1: (otherlv_0= 'unsigned integer from' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3025:3: otherlv_0= 'unsigned integer from' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')'
+            // InternalEntityMockDSL.g:3087:2: (otherlv_0= 'unsignedIntegerPick' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')' )
+            // InternalEntityMockDSL.g:3088:3: otherlv_0= 'unsignedIntegerPick' otherlv_1= '(' ( (lv_items_2_0= RULE_INT ) )+ otherlv_3= ')'
             {
-            otherlv_0=(Token)match(input,62,FOLLOW_62_in_rulePropertyFillerUnsignedIntegerRandom6725); if (state.failed) return current;
+            otherlv_0=(Token)match(input,62,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerFromKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getUnsignedIntegerPickKeyword_0());
+              		
             }
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_rulePropertyFillerUnsignedIntegerRandom6737); if (state.failed) return current;
+            otherlv_1=(Token)match(input,25,FOLLOW_10); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getLeftParenthesisKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3033:1: ( (lv_items_2_0= RULE_INT ) )+
-            int cnt56=0;
-            loop56:
+            // InternalEntityMockDSL.g:3096:3: ( (lv_items_2_0= RULE_INT ) )+
+            int cnt54=0;
+            loop54:
             do {
-                int alt56=2;
-                int LA56_0 = input.LA(1);
+                int alt54=2;
+                int LA54_0 = input.LA(1);
 
-                if ( (LA56_0==RULE_INT) ) {
-                    alt56=1;
+                if ( (LA54_0==RULE_INT) ) {
+                    alt54=1;
                 }
 
 
-                switch (alt56) {
+                switch (alt54) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3034:1: (lv_items_2_0= RULE_INT )
+            	    // InternalEntityMockDSL.g:3097:4: (lv_items_2_0= RULE_INT )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3034:1: (lv_items_2_0= RULE_INT )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3035:3: lv_items_2_0= RULE_INT
+            	    // InternalEntityMockDSL.g:3097:4: (lv_items_2_0= RULE_INT )
+            	    // InternalEntityMockDSL.g:3098:5: lv_items_2_0= RULE_INT
             	    {
-            	    lv_items_2_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_rulePropertyFillerUnsignedIntegerRandom6754); if (state.failed) return current;
+            	    lv_items_2_0=(Token)match(input,RULE_INT,FOLLOW_55); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      			newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0()); 
-            	      		
+            	      					newLeafNode(lv_items_2_0, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getItemsINTTerminalRuleCall_2_0());
+            	      				
             	    }
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule());
-            	      	        }
-            	             		addWithLastConsumed(
-            	             			current, 
-            	             			"items",
-            	              		lv_items_2_0, 
-            	              		"INT");
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElement(grammarAccess.getPropertyFillerUnsignedIntegerRandomRule());
+            	      					}
+            	      					addWithLastConsumed(
+            	      						current,
+            	      						"items",
+            	      						lv_items_2_0,
+            	      						"org.eclipse.xtext.xbase.Xbase.INT");
+            	      				
             	    }
 
             	    }
@@ -8642,20 +8855,20 @@
             	    break;
 
             	default :
-            	    if ( cnt56 >= 1 ) break loop56;
+            	    if ( cnt54 >= 1 ) break loop54;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(56, input);
+                            new EarlyExitException(54, input);
                         throw eee;
                 }
-                cnt56++;
+                cnt54++;
             } while (true);
 
-            otherlv_3=(Token)match(input,28,FOLLOW_28_in_rulePropertyFillerUnsignedIntegerRandom6772); if (state.failed) return current;
+            otherlv_3=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyFillerUnsignedIntegerRandomAccess().getRightParenthesisKeyword_3());
+              		
             }
 
             }
@@ -8664,14 +8877,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8679,143 +8894,8 @@
     // $ANTLR end "rulePropertyFillerUnsignedIntegerRandom"
 
 
-    // $ANTLR start "entryRuleEntityMockDataType"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3063:1: entryRuleEntityMockDataType returns [EObject current=null] : iv_ruleEntityMockDataType= ruleEntityMockDataType EOF ;
-    public final EObject entryRuleEntityMockDataType() throws RecognitionException {
-        EObject current = null;
-
-        EObject iv_ruleEntityMockDataType = null;
-
-
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3064:2: (iv_ruleEntityMockDataType= ruleEntityMockDataType EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3065:2: iv_ruleEntityMockDataType= ruleEntityMockDataType EOF
-            {
-            if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getEntityMockDataTypeRule()); 
-            }
-            pushFollow(FOLLOW_ruleEntityMockDataType_in_entryRuleEntityMockDataType6808);
-            iv_ruleEntityMockDataType=ruleEntityMockDataType();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-               current =iv_ruleEntityMockDataType; 
-            }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockDataType6818); if (state.failed) return current;
-
-            }
-
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "entryRuleEntityMockDataType"
-
-
-    // $ANTLR start "ruleEntityMockDataType"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3072:1: ruleEntityMockDataType returns [EObject current=null] : (otherlv_0= 'datatype' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' otherlv_3= '}' ) ;
-    public final EObject ruleEntityMockDataType() throws RecognitionException {
-        EObject current = null;
-
-        Token otherlv_0=null;
-        Token otherlv_2=null;
-        Token otherlv_3=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
-
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3075:28: ( (otherlv_0= 'datatype' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' otherlv_3= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3076:1: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' otherlv_3= '}' )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3076:1: (otherlv_0= 'datatype' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' otherlv_3= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3076:3: otherlv_0= 'datatype' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= '{' otherlv_3= '}'
-            {
-            otherlv_0=(Token)match(input,63,FOLLOW_63_in_ruleEntityMockDataType6855); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockDataTypeAccess().getDatatypeKeyword_0());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3080:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3081:1: (lv_name_1_0= ruleQualifiedName )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3081:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3082:3: lv_name_1_0= ruleQualifiedName
-            {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockDataTypeAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockDataType6876);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockDataTypeRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockDataType6888); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockDataTypeAccess().getLeftCurlyBracketKeyword_2());
-                  
-            }
-            otherlv_3=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockDataType6900); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_3, grammarAccess.getEntityMockDataTypeAccess().getRightCurlyBracketKeyword_3());
-                  
-            }
-
-            }
-
-
-            }
-
-            if ( state.backtracking==0 ) {
-               leaveRule(); 
-            }
-        }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
-                appendSkippedTokens();
-            } 
-        finally {
-        }
-        return current;
-    }
-    // $ANTLR end "ruleEntityMockDataType"
-
-
     // $ANTLR start "entryRuleEntityMockEntities"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3114:1: entryRuleEntityMockEntities returns [EObject current=null] : iv_ruleEntityMockEntities= ruleEntityMockEntities EOF ;
+    // InternalEntityMockDSL.g:3122:1: entryRuleEntityMockEntities returns [EObject current=null] : iv_ruleEntityMockEntities= ruleEntityMockEntities EOF ;
     public final EObject entryRuleEntityMockEntities() throws RecognitionException {
         EObject current = null;
 
@@ -8823,13 +8903,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3115:2: (iv_ruleEntityMockEntities= ruleEntityMockEntities EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3116:2: iv_ruleEntityMockEntities= ruleEntityMockEntities EOF
+            // InternalEntityMockDSL.g:3122:59: (iv_ruleEntityMockEntities= ruleEntityMockEntities EOF )
+            // InternalEntityMockDSL.g:3123:2: iv_ruleEntityMockEntities= ruleEntityMockEntities EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockEntitiesRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockEntities_in_entryRuleEntityMockEntities6936);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockEntities=ruleEntityMockEntities();
 
             state._fsp--;
@@ -8837,16 +8917,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockEntities; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockEntities6946); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8855,7 +8935,7 @@
 
 
     // $ANTLR start "ruleEntityMockEntities"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3123:1: ruleEntityMockEntities returns [EObject current=null] : ( () otherlv_1= 'mock entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' ) ;
+    // InternalEntityMockDSL.g:3129:1: ruleEntityMockEntities returns [EObject current=null] : ( () otherlv_1= 'entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' ) ;
     public final EObject ruleEntityMockEntities() throws RecognitionException {
         EObject current = null;
 
@@ -8865,80 +8945,81 @@
         EObject lv_entities_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3126:28: ( ( () otherlv_1= 'mock entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3127:1: ( () otherlv_1= 'mock entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:3135:2: ( ( () otherlv_1= 'entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' ) )
+            // InternalEntityMockDSL.g:3136:2: ( () otherlv_1= 'entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3127:1: ( () otherlv_1= 'mock entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3127:2: () otherlv_1= 'mock entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}'
+            // InternalEntityMockDSL.g:3136:2: ( () otherlv_1= 'entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:3137:3: () otherlv_1= 'entities' otherlv_2= '{' ( (lv_entities_3_0= ruleEntityMockEntity ) )* otherlv_4= '}'
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3127:2: ()
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3128:5: 
+            // InternalEntityMockDSL.g:3137:3: ()
+            // InternalEntityMockDSL.g:3138:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockEntitiesAccess().getEntityMockEntitiesAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,64,FOLLOW_64_in_ruleEntityMockEntities6992); if (state.failed) return current;
+            otherlv_1=(Token)match(input,63,FOLLOW_12); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getEntityMockEntitiesAccess().getMockEntitiesKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockEntitiesAccess().getEntitiesKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockEntities7004); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_56); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntitiesAccess().getLeftCurlyBracketKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3141:1: ( (lv_entities_3_0= ruleEntityMockEntity ) )*
-            loop57:
+            // InternalEntityMockDSL.g:3152:3: ( (lv_entities_3_0= ruleEntityMockEntity ) )*
+            loop55:
             do {
-                int alt57=2;
-                int LA57_0 = input.LA(1);
+                int alt55=2;
+                int LA55_0 = input.LA(1);
 
-                if ( (LA57_0==65) ) {
-                    alt57=1;
+                if ( (LA55_0==64) ) {
+                    alt55=1;
                 }
 
 
-                switch (alt57) {
+                switch (alt55) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3142:1: (lv_entities_3_0= ruleEntityMockEntity )
+            	    // InternalEntityMockDSL.g:3153:4: (lv_entities_3_0= ruleEntityMockEntity )
             	    {
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3142:1: (lv_entities_3_0= ruleEntityMockEntity )
-            	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3143:3: lv_entities_3_0= ruleEntityMockEntity
+            	    // InternalEntityMockDSL.g:3153:4: (lv_entities_3_0= ruleEntityMockEntity )
+            	    // InternalEntityMockDSL.g:3154:5: lv_entities_3_0= ruleEntityMockEntity
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getEntityMockEntitiesAccess().getEntitiesEntityMockEntityParserRuleCall_3_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleEntityMockEntity_in_ruleEntityMockEntities7025);
+            	    pushFollow(FOLLOW_56);
             	    lv_entities_3_0=ruleEntityMockEntity();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntitiesRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"entities",
-            	              		lv_entities_3_0, 
-            	              		"EntityMockEntity");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getEntityMockEntitiesRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"entities",
+            	      						lv_entities_3_0,
+            	      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntity");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -8948,15 +9029,15 @@
             	    break;
 
             	default :
-            	    break loop57;
+            	    break loop55;
                 }
             } while (true);
 
-            otherlv_4=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockEntities7038); if (state.failed) return current;
+            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockEntitiesAccess().getRightCurlyBracketKeyword_4());
+              		
             }
 
             }
@@ -8965,14 +9046,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -8981,7 +9064,7 @@
 
 
     // $ANTLR start "entryRuleEntityMockEntity"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3171:1: entryRuleEntityMockEntity returns [EObject current=null] : iv_ruleEntityMockEntity= ruleEntityMockEntity EOF ;
+    // InternalEntityMockDSL.g:3179:1: entryRuleEntityMockEntity returns [EObject current=null] : iv_ruleEntityMockEntity= ruleEntityMockEntity EOF ;
     public final EObject entryRuleEntityMockEntity() throws RecognitionException {
         EObject current = null;
 
@@ -8989,13 +9072,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3172:2: (iv_ruleEntityMockEntity= ruleEntityMockEntity EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3173:2: iv_ruleEntityMockEntity= ruleEntityMockEntity EOF
+            // InternalEntityMockDSL.g:3179:57: (iv_ruleEntityMockEntity= ruleEntityMockEntity EOF )
+            // InternalEntityMockDSL.g:3180:2: iv_ruleEntityMockEntity= ruleEntityMockEntity EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEntityMockEntityRule()); 
             }
-            pushFollow(FOLLOW_ruleEntityMockEntity_in_entryRuleEntityMockEntity7074);
+            pushFollow(FOLLOW_1);
             iv_ruleEntityMockEntity=ruleEntityMockEntity();
 
             state._fsp--;
@@ -9003,16 +9086,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEntityMockEntity; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEntityMockEntity7084); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9021,11 +9104,12 @@
 
 
     // $ANTLR start "ruleEntityMockEntity"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3180:1: ruleEntityMockEntity returns [EObject current=null] : (otherlv_0= 'mocking' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'for entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) ) ) ;
+    // InternalEntityMockDSL.g:3186:1: ruleEntityMockEntity returns [EObject current=null] : (otherlv_0= 'mocking' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) ) ) ;
     public final EObject ruleEntityMockEntity() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
+        Token lv_name_1_0=null;
         Token otherlv_2=null;
         Token otherlv_3=null;
         Token otherlv_4=null;
@@ -9037,106 +9121,100 @@
         Token otherlv_13=null;
         Token otherlv_14=null;
         Token otherlv_15=null;
-        Token lv_createBlobMapping_17_0=null;
-        Token otherlv_18=null;
+        Token lv_createBlobMapping_18_0=null;
         Token otherlv_19=null;
         Token otherlv_20=null;
         Token otherlv_21=null;
-        Token otherlv_23=null;
-        Token otherlv_27=null;
-        AntlrDatatypeRuleToken lv_name_1_0 = null;
-
-        EObject lv_temporaries_9_0 = null;
+        Token otherlv_22=null;
+        Token otherlv_24=null;
+        Token otherlv_28=null;
+        EObject lv_templates_9_0 = null;
 
         EObject lv_attributes_10_0 = null;
 
         EObject lv_calculations_11_0 = null;
 
-        EObject lv_byResourceAttributes_16_0 = null;
+        EObject lv_byResourceAttributes_17_0 = null;
 
-        EObject lv_iterate_22_0 = null;
+        EObject lv_iterate_23_0 = null;
 
-        EObject lv_temporaries_24_0 = null;
+        EObject lv_templates_25_0 = null;
 
-        EObject lv_attributes_25_0 = null;
+        EObject lv_attributes_26_0 = null;
 
-        EObject lv_calculations_26_0 = null;
+        EObject lv_calculations_27_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3183:28: ( (otherlv_0= 'mocking' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'for entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3184:1: (otherlv_0= 'mocking' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'for entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) ) )
+            // InternalEntityMockDSL.g:3192:2: ( (otherlv_0= 'mocking' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) ) ) )
+            // InternalEntityMockDSL.g:3193:2: (otherlv_0= 'mocking' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) ) )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3184:1: (otherlv_0= 'mocking' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'for entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3184:3: otherlv_0= 'mocking' ( (lv_name_1_0= ruleQualifiedName ) ) otherlv_2= 'for entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) )
+            // InternalEntityMockDSL.g:3193:2: (otherlv_0= 'mocking' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) ) )
+            // InternalEntityMockDSL.g:3194:3: otherlv_0= 'mocking' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'entity' ( (otherlv_3= RULE_ID ) ) ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) )
             {
-            otherlv_0=(Token)match(input,65,FOLLOW_65_in_ruleEntityMockEntity7121); if (state.failed) return current;
+            otherlv_0=(Token)match(input,64,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityAccess().getMockingKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3188:1: ( (lv_name_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3189:1: (lv_name_1_0= ruleQualifiedName )
+            // InternalEntityMockDSL.g:3198:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:3199:4: (lv_name_1_0= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3189:1: (lv_name_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3190:3: lv_name_1_0= ruleQualifiedName
+            // InternalEntityMockDSL.g:3199:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:3200:5: lv_name_1_0= RULE_ID
             {
-            if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getNameQualifiedNameParserRuleCall_1_0()); 
-              	    
-            }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleEntityMockEntity7142);
-            lv_name_1_0=ruleQualifiedName();
-
-            state._fsp--;
-            if (state.failed) return current;
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_57); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"name",
-                      		lv_name_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockEntityAccess().getNameIDTerminalRuleCall_1_0());
+              				
             }
-
-            }
-
-
-            }
-
-            otherlv_2=(Token)match(input,66,FOLLOW_66_in_ruleEntityMockEntity7154); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityAccess().getForEntityKeyword_2());
-                  
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockEntityRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
             }
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3210:1: ( (otherlv_3= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3211:1: (otherlv_3= RULE_ID )
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,65,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityAccess().getEntityKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:3220:3: ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:3221:4: (otherlv_3= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3211:1: (otherlv_3= RULE_ID )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3212:3: otherlv_3= RULE_ID
+            // InternalEntityMockDSL.g:3221:4: (otherlv_3= RULE_ID )
+            // InternalEntityMockDSL.g:3222:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockEntityRule());
+              					}
+              				
             }
-            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockEntity7174); if (state.failed) return current;
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_58); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0()); 
-              	
+              					newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityAccess().getEntityRefLEntityCrossReference_3_0());
+              				
             }
 
             }
@@ -9144,68 +9222,68 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3223:2: ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' ) | (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' ) )
-            int alt66=3;
+            // InternalEntityMockDSL.g:3233:3: ( (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' ) | (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' ) | (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' ) )
+            int alt64=3;
             switch ( input.LA(1) ) {
-            case 67:
+            case 66:
                 {
-                alt66=1;
+                alt64=1;
+                }
+                break;
+            case 23:
+                {
+                alt64=2;
                 }
                 break;
             case 69:
                 {
-                alt66=2;
-                }
-                break;
-            case 71:
-                {
-                alt66=3;
+                alt64=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 66, 0, input);
+                    new NoViableAltException("", 64, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt66) {
+            switch (alt64) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3223:3: (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' )
+                    // InternalEntityMockDSL.g:3234:4: (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3223:3: (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3223:5: otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}'
+                    // InternalEntityMockDSL.g:3234:4: (otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}' )
+                    // InternalEntityMockDSL.g:3235:5: otherlv_4= 'rows' ( (lv_minRows_5_0= RULE_INT ) ) otherlv_6= 'to' ( (lv_maxRows_7_0= RULE_INT ) ) otherlv_8= '{' ( (lv_templates_9_0= ruleEntityMockTemplate ) )* ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )* otherlv_12= '}'
                     {
-                    otherlv_4=(Token)match(input,67,FOLLOW_67_in_ruleEntityMockEntity7188); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,66,FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0());
-                          
+                      					newLeafNode(otherlv_4, grammarAccess.getEntityMockEntityAccess().getRowsKeyword_4_0_0());
+                      				
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3227:1: ( (lv_minRows_5_0= RULE_INT ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3228:1: (lv_minRows_5_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3239:5: ( (lv_minRows_5_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3240:6: (lv_minRows_5_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3228:1: (lv_minRows_5_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3229:3: lv_minRows_5_0= RULE_INT
+                    // InternalEntityMockDSL.g:3240:6: (lv_minRows_5_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3241:7: lv_minRows_5_0= RULE_INT
                     {
-                    lv_minRows_5_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleEntityMockEntity7205); if (state.failed) return current;
+                    lv_minRows_5_0=(Token)match(input,RULE_INT,FOLLOW_59); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_minRows_5_0, grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0()); 
-                      		
+                      							newLeafNode(lv_minRows_5_0, grammarAccess.getEntityMockEntityAccess().getMinRowsINTTerminalRuleCall_4_0_1_0());
+                      						
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"minRows",
-                              		lv_minRows_5_0, 
-                              		"INT");
-                      	    
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getEntityMockEntityRule());
+                      							}
+                      							setWithLastConsumed(
+                      								current,
+                      								"minRows",
+                      								lv_minRows_5_0,
+                      								"org.eclipse.xtext.xbase.Xbase.INT");
+                      						
                     }
 
                     }
@@ -9213,35 +9291,35 @@
 
                     }
 
-                    otherlv_6=(Token)match(input,68,FOLLOW_68_in_ruleEntityMockEntity7222); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,67,FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2());
-                          
+                      					newLeafNode(otherlv_6, grammarAccess.getEntityMockEntityAccess().getToKeyword_4_0_2());
+                      				
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3249:1: ( (lv_maxRows_7_0= RULE_INT ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3250:1: (lv_maxRows_7_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3261:5: ( (lv_maxRows_7_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3262:6: (lv_maxRows_7_0= RULE_INT )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3250:1: (lv_maxRows_7_0= RULE_INT )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3251:3: lv_maxRows_7_0= RULE_INT
+                    // InternalEntityMockDSL.g:3262:6: (lv_maxRows_7_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3263:7: lv_maxRows_7_0= RULE_INT
                     {
-                    lv_maxRows_7_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleEntityMockEntity7239); if (state.failed) return current;
+                    lv_maxRows_7_0=(Token)match(input,RULE_INT,FOLLOW_12); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_maxRows_7_0, grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0()); 
-                      		
+                      							newLeafNode(lv_maxRows_7_0, grammarAccess.getEntityMockEntityAccess().getMaxRowsINTTerminalRuleCall_4_0_3_0());
+                      						
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"maxRows",
-                              		lv_maxRows_7_0, 
-                              		"INT");
-                      	    
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getEntityMockEntityRule());
+                      							}
+                      							setWithLastConsumed(
+                      								current,
+                      								"maxRows",
+                      								lv_maxRows_7_0,
+                      								"org.eclipse.xtext.xbase.Xbase.INT");
+                      						
                     }
 
                     }
@@ -9249,52 +9327,173 @@
 
                     }
 
-                    otherlv_8=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockEntity7256); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,14,FOLLOW_60); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_8, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4());
-                          
+                      					newLeafNode(otherlv_8, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_0_4());
+                      				
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3271:1: ( (lv_temporaries_9_0= ruleEntityMockTemporary ) )*
+                    // InternalEntityMockDSL.g:3283:5: ( (lv_templates_9_0= ruleEntityMockTemplate ) )*
+                    loop56:
+                    do {
+                        int alt56=2;
+                        int LA56_0 = input.LA(1);
+
+                        if ( (LA56_0==79) ) {
+                            alt56=1;
+                        }
+
+
+                        switch (alt56) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:3284:6: (lv_templates_9_0= ruleEntityMockTemplate )
+                    	    {
+                    	    // InternalEntityMockDSL.g:3284:6: (lv_templates_9_0= ruleEntityMockTemplate )
+                    	    // InternalEntityMockDSL.g:3285:7: lv_templates_9_0= ruleEntityMockTemplate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_60);
+                    	    lv_templates_9_0=ruleEntityMockTemplate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"templates",
+                    	      								lv_templates_9_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockTemplate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop56;
+                        }
+                    } while (true);
+
+                    // InternalEntityMockDSL.g:3302:5: ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )*
+                    loop57:
+                    do {
+                        int alt57=2;
+                        int LA57_0 = input.LA(1);
+
+                        if ( (LA57_0==31) ) {
+                            int LA57_1 = input.LA(2);
+
+                            if ( (LA57_1==RULE_ID) ) {
+                                int LA57_4 = input.LA(3);
+
+                                if ( (LA57_4==41||LA57_4==78) ) {
+                                    alt57=1;
+                                }
+
+
+                            }
+
+
+                        }
+                        else if ( ((LA57_0>=82 && LA57_0<=83)) ) {
+                            alt57=1;
+                        }
+
+
+                        switch (alt57) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:3303:6: (lv_attributes_10_0= ruleIEntityMockAttribute )
+                    	    {
+                    	    // InternalEntityMockDSL.g:3303:6: (lv_attributes_10_0= ruleIEntityMockAttribute )
+                    	    // InternalEntityMockDSL.g:3304:7: lv_attributes_10_0= ruleIEntityMockAttribute
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_61);
+                    	    lv_attributes_10_0=ruleIEntityMockAttribute();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"attributes",
+                    	      								lv_attributes_10_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockAttribute");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop57;
+                        }
+                    } while (true);
+
+                    // InternalEntityMockDSL.g:3321:5: ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )*
                     loop58:
                     do {
                         int alt58=2;
                         int LA58_0 = input.LA(1);
 
-                        if ( (LA58_0==82) ) {
+                        if ( (LA58_0==31) ) {
                             alt58=1;
                         }
 
 
                         switch (alt58) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3272:1: (lv_temporaries_9_0= ruleEntityMockTemporary )
+                    	    // InternalEntityMockDSL.g:3322:6: (lv_calculations_11_0= ruleEntityMockEntityFunction )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3272:1: (lv_temporaries_9_0= ruleEntityMockTemporary )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3273:3: lv_temporaries_9_0= ruleEntityMockTemporary
+                    	    // InternalEntityMockDSL.g:3322:6: (lv_calculations_11_0= ruleEntityMockEntityFunction )
+                    	    // InternalEntityMockDSL.g:3323:7: lv_calculations_11_0= ruleEntityMockEntityFunction
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemporariesEntityMockTemporaryParserRuleCall_4_0_5_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockTemporary_in_ruleEntityMockEntity7277);
-                    	    lv_temporaries_9_0=ruleEntityMockTemporary();
+                    	    pushFollow(FOLLOW_28);
+                    	    lv_calculations_11_0=ruleEntityMockEntityFunction();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"temporaries",
-                    	              		lv_temporaries_9_0, 
-                    	              		"EntityMockTemporary");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"calculations",
+                    	      								lv_calculations_11_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunction");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -9308,115 +9507,239 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3289:3: ( (lv_attributes_10_0= ruleIEntityMockAttribute ) )*
-                    loop59:
+                    otherlv_12=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_12, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3346:4: (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' )
+                    {
+                    // InternalEntityMockDSL.g:3346:4: (otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}' )
+                    // InternalEntityMockDSL.g:3347:5: otherlv_13= 'resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) ) otherlv_19= '}'
+                    {
+                    otherlv_13=(Token)match(input,23,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_13, grammarAccess.getEntityMockEntityAccess().getResourceKeyword_4_1_0());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:3351:5: ( (otherlv_14= RULE_ID ) )
+                    // InternalEntityMockDSL.g:3352:6: (otherlv_14= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:3352:6: (otherlv_14= RULE_ID )
+                    // InternalEntityMockDSL.g:3353:7: otherlv_14= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getEntityMockEntityRule());
+                      							}
+                      						
+                    }
+                    otherlv_14=(Token)match(input,RULE_ID,FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_14, grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0());
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_15=(Token)match(input,14,FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_15, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:3368:5: ( ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) ) )
+                    // InternalEntityMockDSL.g:3369:6: ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) )
+                    {
+                    // InternalEntityMockDSL.g:3369:6: ( ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* ) )
+                    // InternalEntityMockDSL.g:3370:7: ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+                    // InternalEntityMockDSL.g:3373:7: ( ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )* )
+                    // InternalEntityMockDSL.g:3374:8: ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:3374:8: ( ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) ) | ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) ) )*
+                    loop60:
                     do {
-                        int alt59=2;
-                        int LA59_0 = input.LA(1);
+                        int alt60=3;
+                        int LA60_0 = input.LA(1);
 
-                        if ( (LA59_0==32) ) {
-                            int LA59_1 = input.LA(2);
-
-                            if ( (LA59_1==RULE_ID) ) {
-                                int LA59_4 = input.LA(3);
-
-                                if ( (LA59_4==42||LA59_4==81) ) {
-                                    alt59=1;
-                                }
-
-
-                            }
-
-
+                        if ( LA60_0 == 31 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                            alt60=1;
                         }
-                        else if ( ((LA59_0>=85 && LA59_0<=86)) ) {
-                            alt59=1;
+                        else if ( LA60_0 == 68 && getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                            alt60=2;
                         }
 
 
-                        switch (alt59) {
+                        switch (alt60) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3290:1: (lv_attributes_10_0= ruleIEntityMockAttribute )
+                    	    // InternalEntityMockDSL.g:3375:6: ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3290:1: (lv_attributes_10_0= ruleIEntityMockAttribute )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3291:3: lv_attributes_10_0= ruleIEntityMockAttribute
+                    	    // InternalEntityMockDSL.g:3375:6: ({...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ ) )
+                    	    // InternalEntityMockDSL.g:3376:7: {...}? => ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ )
                     	    {
-                    	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0()); 
-                    	      	    
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMockEntity", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0)");
                     	    }
-                    	    pushFollow(FOLLOW_ruleIEntityMockAttribute_in_ruleEntityMockEntity7299);
-                    	    lv_attributes_10_0=ruleIEntityMockAttribute();
+                    	    // InternalEntityMockDSL.g:3376:119: ( ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+ )
+                    	    // InternalEntityMockDSL.g:3377:8: ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 0);
+                    	    // InternalEntityMockDSL.g:3380:11: ({...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) ) )+
+                    	    int cnt59=0;
+                    	    loop59:
+                    	    do {
+                    	        int alt59=2;
+                    	        int LA59_0 = input.LA(1);
 
-                    	    state._fsp--;
-                    	    if (state.failed) return current;
-                    	    if ( state.backtracking==0 ) {
+                    	        if ( (LA59_0==31) ) {
+                    	            int LA59_2 = input.LA(2);
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"attributes",
-                    	              		lv_attributes_10_0, 
-                    	              		"IEntityMockAttribute");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	            if ( ((true)) ) {
+                    	                alt59=1;
+                    	            }
+
+
+                    	        }
+
+
+                    	        switch (alt59) {
+                    	    	case 1 :
+                    	    	    // InternalEntityMockDSL.g:3380:12: {...}? => ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) )
+                    	    	    {
+                    	    	    if ( !((true)) ) {
+                    	    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	    	        throw new FailedPredicateException(input, "ruleEntityMockEntity", "true");
+                    	    	    }
+                    	    	    // InternalEntityMockDSL.g:3380:21: ( (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute ) )
+                    	    	    // InternalEntityMockDSL.g:3380:22: (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute )
+                    	    	    {
+                    	    	    // InternalEntityMockDSL.g:3380:22: (lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute )
+                    	    	    // InternalEntityMockDSL.g:3381:12: lv_byResourceAttributes_17_0= ruleEntityMockByResourceAttribute
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      												newCompositeNode(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0());
+                    	    	      											
+                    	    	    }
+                    	    	    pushFollow(FOLLOW_62);
+                    	    	    lv_byResourceAttributes_17_0=ruleEntityMockByResourceAttribute();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      												if (current==null) {
+                    	    	      													current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	    	      												}
+                    	    	      												add(
+                    	    	      													current,
+                    	    	      													"byResourceAttributes",
+                    	    	      													lv_byResourceAttributes_17_0,
+                    	    	      													"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockByResourceAttribute");
+                    	    	      												afterParserOrEnumRuleCall();
+                    	    	      											
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt59 >= 1 ) break loop59;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(59, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt59++;
+                    	    } while (true);
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+
                     	    }
 
+
                     	    }
 
 
                     	    }
                     	    break;
-
-                    	default :
-                    	    break loop59;
-                        }
-                    } while (true);
-
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3307:3: ( (lv_calculations_11_0= ruleEntityMockEntityFunction ) )*
-                    loop60:
-                    do {
-                        int alt60=2;
-                        int LA60_0 = input.LA(1);
-
-                        if ( (LA60_0==32) ) {
-                            alt60=1;
-                        }
-
-
-                        switch (alt60) {
-                    	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3308:1: (lv_calculations_11_0= ruleEntityMockEntityFunction )
+                    	case 2 :
+                    	    // InternalEntityMockDSL.g:3403:6: ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3308:1: (lv_calculations_11_0= ruleEntityMockEntityFunction )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3309:3: lv_calculations_11_0= ruleEntityMockEntityFunction
+                    	    // InternalEntityMockDSL.g:3403:6: ({...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) ) )
+                    	    // InternalEntityMockDSL.g:3404:7: {...}? => ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) )
                     	    {
-                    	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0()); 
-                    	      	    
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMockEntity", "getUnorderedGroupHelper().canSelect(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1)");
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockEntityFunction_in_ruleEntityMockEntity7321);
-                    	    lv_calculations_11_0=ruleEntityMockEntityFunction();
-
-                    	    state._fsp--;
-                    	    if (state.failed) return current;
+                    	    // InternalEntityMockDSL.g:3404:119: ( ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) ) )
+                    	    // InternalEntityMockDSL.g:3405:8: ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3(), 1);
+                    	    // InternalEntityMockDSL.g:3408:11: ({...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) ) )
+                    	    // InternalEntityMockDSL.g:3408:12: {...}? => ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleEntityMockEntity", "true");
+                    	    }
+                    	    // InternalEntityMockDSL.g:3408:21: ( (lv_createBlobMapping_18_0= 'createBlobMapping' ) )
+                    	    // InternalEntityMockDSL.g:3408:22: (lv_createBlobMapping_18_0= 'createBlobMapping' )
+                    	    {
+                    	    // InternalEntityMockDSL.g:3408:22: (lv_createBlobMapping_18_0= 'createBlobMapping' )
+                    	    // InternalEntityMockDSL.g:3409:12: lv_createBlobMapping_18_0= 'createBlobMapping'
+                    	    {
+                    	    lv_createBlobMapping_18_0=(Token)match(input,68,FOLLOW_62); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"calculations",
-                    	              		lv_calculations_11_0, 
-                    	              		"EntityMockEntityFunction");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      												newLeafNode(lv_createBlobMapping_18_0, grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0());
+                    	      											
                     	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      												if (current==null) {
+                    	      													current = createModelElement(grammarAccess.getEntityMockEntityRule());
+                    	      												}
+                    	      												setWithLastConsumed(current, "createBlobMapping", true, "createBlobMapping");
+                    	      											
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+
+                    	    }
+
 
                     	    }
 
@@ -9429,11 +9752,21 @@
                         }
                     } while (true);
 
-                    otherlv_12=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockEntity7334); if (state.failed) return current;
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getEntityMockEntityAccess().getUnorderedGroup_4_1_3());
+
+                    }
+
+                    otherlv_19=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_12, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_0_8());
-                          
+                      					newLeafNode(otherlv_19, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_4());
+                      				
                     }
 
                     }
@@ -9441,36 +9774,36 @@
 
                     }
                     break;
-                case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3330:6: (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' )
+                case 3 :
+                    // InternalEntityMockDSL.g:3439:4: (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3330:6: (otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}' )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3330:8: otherlv_13= 'by resource' ( (otherlv_14= RULE_ID ) ) otherlv_15= '{' ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )* ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )? otherlv_18= '}'
+                    // InternalEntityMockDSL.g:3439:4: (otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}' )
+                    // InternalEntityMockDSL.g:3440:5: otherlv_20= 'iterate' ( (otherlv_21= RULE_ID ) ) otherlv_22= 'with' ( (lv_iterate_23_0= ruleIIterate ) ) otherlv_24= '{' ( (lv_templates_25_0= ruleEntityMockTemplate ) )* ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )* otherlv_28= '}'
                     {
-                    otherlv_13=(Token)match(input,69,FOLLOW_69_in_ruleEntityMockEntity7354); if (state.failed) return current;
+                    otherlv_20=(Token)match(input,69,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_13, grammarAccess.getEntityMockEntityAccess().getByResourceKeyword_4_1_0());
-                          
+                      					newLeafNode(otherlv_20, grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0());
+                      				
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3334:1: ( (otherlv_14= RULE_ID ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3335:1: (otherlv_14= RULE_ID )
+                    // InternalEntityMockDSL.g:3444:5: ( (otherlv_21= RULE_ID ) )
+                    // InternalEntityMockDSL.g:3445:6: (otherlv_21= RULE_ID )
                     {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3335:1: (otherlv_14= RULE_ID )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3336:3: otherlv_14= RULE_ID
+                    // InternalEntityMockDSL.g:3445:6: (otherlv_21= RULE_ID )
+                    // InternalEntityMockDSL.g:3446:7: otherlv_21= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-                      	        }
-                              
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getEntityMockEntityRule());
+                      							}
+                      						
                     }
-                    otherlv_14=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockEntity7374); if (state.failed) return current;
+                    otherlv_21=(Token)match(input,RULE_ID,FOLLOW_30); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      		newLeafNode(otherlv_14, grammarAccess.getEntityMockEntityAccess().getByResourceEntityMockResourceCrossReference_4_1_1_0()); 
-                      	
+                      							newLeafNode(otherlv_21, grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0());
+                      						
                     }
 
                     }
@@ -9478,52 +9811,93 @@
 
                     }
 
-                    otherlv_15=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockEntity7386); if (state.failed) return current;
+                    otherlv_22=(Token)match(input,33,FOLLOW_63); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_15, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_1_2());
-                          
+                      					newLeafNode(otherlv_22, grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2());
+                      				
                     }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3351:1: ( (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute ) )*
+                    // InternalEntityMockDSL.g:3461:5: ( (lv_iterate_23_0= ruleIIterate ) )
+                    // InternalEntityMockDSL.g:3462:6: (lv_iterate_23_0= ruleIIterate )
+                    {
+                    // InternalEntityMockDSL.g:3462:6: (lv_iterate_23_0= ruleIIterate )
+                    // InternalEntityMockDSL.g:3463:7: lv_iterate_23_0= ruleIIterate
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_12);
+                    lv_iterate_23_0=ruleIIterate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                      							}
+                      							set(
+                      								current,
+                      								"iterate",
+                      								lv_iterate_23_0,
+                      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IIterate");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_24=(Token)match(input,14,FOLLOW_60); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_24, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:3484:5: ( (lv_templates_25_0= ruleEntityMockTemplate ) )*
                     loop61:
                     do {
                         int alt61=2;
                         int LA61_0 = input.LA(1);
 
-                        if ( (LA61_0==32) ) {
+                        if ( (LA61_0==79) ) {
                             alt61=1;
                         }
 
 
                         switch (alt61) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3352:1: (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute )
+                    	    // InternalEntityMockDSL.g:3485:6: (lv_templates_25_0= ruleEntityMockTemplate )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3352:1: (lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3353:3: lv_byResourceAttributes_16_0= ruleEntityMockByResourceAttribute
+                    	    // InternalEntityMockDSL.g:3485:6: (lv_templates_25_0= ruleEntityMockTemplate )
+                    	    // InternalEntityMockDSL.g:3486:7: lv_templates_25_0= ruleEntityMockTemplate
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockByResourceAttribute_in_ruleEntityMockEntity7407);
-                    	    lv_byResourceAttributes_16_0=ruleEntityMockByResourceAttribute();
+                    	    pushFollow(FOLLOW_60);
+                    	    lv_templates_25_0=ruleEntityMockTemplate();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"byResourceAttributes",
-                    	              		lv_byResourceAttributes_16_0, 
-                    	              		"EntityMockByResourceAttribute");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"templates",
+                    	      								lv_templates_25_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockTemplate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -9537,179 +9911,114 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3369:3: ( (lv_createBlobMapping_17_0= 'createBlobMapping' ) )?
-                    int alt62=2;
-                    int LA62_0 = input.LA(1);
+                    // InternalEntityMockDSL.g:3503:5: ( (lv_attributes_26_0= ruleIEntityMockAttribute ) )*
+                    loop62:
+                    do {
+                        int alt62=2;
+                        int LA62_0 = input.LA(1);
 
-                    if ( (LA62_0==70) ) {
-                        alt62=1;
-                    }
-                    switch (alt62) {
-                        case 1 :
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3370:1: (lv_createBlobMapping_17_0= 'createBlobMapping' )
-                            {
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3370:1: (lv_createBlobMapping_17_0= 'createBlobMapping' )
-                            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3371:3: lv_createBlobMapping_17_0= 'createBlobMapping'
-                            {
-                            lv_createBlobMapping_17_0=(Token)match(input,70,FOLLOW_70_in_ruleEntityMockEntity7426); if (state.failed) return current;
-                            if ( state.backtracking==0 ) {
+                        if ( (LA62_0==31) ) {
+                            int LA62_1 = input.LA(2);
 
-                                      newLeafNode(lv_createBlobMapping_17_0, grammarAccess.getEntityMockEntityAccess().getCreateBlobMappingCreateBlobMappingKeyword_4_1_4_0());
-                                  
-                            }
-                            if ( state.backtracking==0 ) {
+                            if ( (LA62_1==RULE_ID) ) {
+                                int LA62_4 = input.LA(3);
 
-                              	        if (current==null) {
-                              	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-                              	        }
-                                     		setWithLastConsumed(current, "createBlobMapping", true, "createBlobMapping");
-                              	    
-                            }
-
-                            }
+                                if ( (LA62_4==41||LA62_4==78) ) {
+                                    alt62=1;
+                                }
 
 
                             }
-                            break;
-
-                    }
-
-                    otherlv_18=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockEntity7452); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_18, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_1_5());
-                          
-                    }
-
-                    }
 
 
-                    }
-                    break;
-                case 3 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3389:6: (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3389:6: (otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}' )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3389:8: otherlv_19= 'iterate' ( (otherlv_20= RULE_ID ) ) otherlv_21= 'with' ( (lv_iterate_22_0= ruleIIterate ) ) otherlv_23= '{' ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )* ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )* ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )* otherlv_27= '}'
-                    {
-                    otherlv_19=(Token)match(input,71,FOLLOW_71_in_ruleEntityMockEntity7472); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                          	newLeafNode(otherlv_19, grammarAccess.getEntityMockEntityAccess().getIterateKeyword_4_2_0());
-                          
-                    }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3393:1: ( (otherlv_20= RULE_ID ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3394:1: (otherlv_20= RULE_ID )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3394:1: (otherlv_20= RULE_ID )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3395:3: otherlv_20= RULE_ID
-                    {
-                    if ( state.backtracking==0 ) {
-
-                      			if (current==null) {
-                      	            current = createModelElement(grammarAccess.getEntityMockEntityRule());
-                      	        }
-                              
-                    }
-                    otherlv_20=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleEntityMockEntity7492); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      		newLeafNode(otherlv_20, grammarAccess.getEntityMockEntityAccess().getIteratorLEntityAttributeCrossReference_4_2_1_0()); 
-                      	
-                    }
-
-                    }
+                        }
+                        else if ( ((LA62_0>=82 && LA62_0<=83)) ) {
+                            alt62=1;
+                        }
 
 
-                    }
+                        switch (alt62) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:3504:6: (lv_attributes_26_0= ruleIEntityMockAttribute )
+                    	    {
+                    	    // InternalEntityMockDSL.g:3504:6: (lv_attributes_26_0= ruleIEntityMockAttribute )
+                    	    // InternalEntityMockDSL.g:3505:7: lv_attributes_26_0= ruleIEntityMockAttribute
+                    	    {
+                    	    if ( state.backtracking==0 ) {
 
-                    otherlv_21=(Token)match(input,35,FOLLOW_35_in_ruleEntityMockEntity7504); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_61);
+                    	    lv_attributes_26_0=ruleIEntityMockAttribute();
 
-                          	newLeafNode(otherlv_21, grammarAccess.getEntityMockEntityAccess().getWithKeyword_4_2_2());
-                          
-                    }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3410:1: ( (lv_iterate_22_0= ruleIIterate ) )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3411:1: (lv_iterate_22_0= ruleIIterate )
-                    {
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3411:1: (lv_iterate_22_0= ruleIIterate )
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3412:3: lv_iterate_22_0= ruleIIterate
-                    {
-                    if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getIterateIIterateParserRuleCall_4_2_3_0()); 
-                      	    
-                    }
-                    pushFollow(FOLLOW_ruleIIterate_in_ruleEntityMockEntity7525);
-                    lv_iterate_22_0=ruleIIterate();
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
 
-                    state._fsp--;
-                    if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"attributes",
+                    	      								lv_attributes_26_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockAttribute");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"iterate",
-                              		lv_iterate_22_0, 
-                              		"IIterate");
-                      	        afterParserOrEnumRuleCall();
-                      	    
-                    }
-
-                    }
+                    	    }
 
 
-                    }
+                    	    }
+                    	    break;
 
-                    otherlv_23=(Token)match(input,14,FOLLOW_14_in_ruleEntityMockEntity7537); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
+                    	default :
+                    	    break loop62;
+                        }
+                    } while (true);
 
-                          	newLeafNode(otherlv_23, grammarAccess.getEntityMockEntityAccess().getLeftCurlyBracketKeyword_4_2_4());
-                          
-                    }
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3432:1: ( (lv_temporaries_24_0= ruleEntityMockTemporary ) )*
+                    // InternalEntityMockDSL.g:3522:5: ( (lv_calculations_27_0= ruleEntityMockEntityFunction ) )*
                     loop63:
                     do {
                         int alt63=2;
                         int LA63_0 = input.LA(1);
 
-                        if ( (LA63_0==82) ) {
+                        if ( (LA63_0==31) ) {
                             alt63=1;
                         }
 
 
                         switch (alt63) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3433:1: (lv_temporaries_24_0= ruleEntityMockTemporary )
+                    	    // InternalEntityMockDSL.g:3523:6: (lv_calculations_27_0= ruleEntityMockEntityFunction )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3433:1: (lv_temporaries_24_0= ruleEntityMockTemporary )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3434:3: lv_temporaries_24_0= ruleEntityMockTemporary
+                    	    // InternalEntityMockDSL.g:3523:6: (lv_calculations_27_0= ruleEntityMockEntityFunction )
+                    	    // InternalEntityMockDSL.g:3524:7: lv_calculations_27_0= ruleEntityMockEntityFunction
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getTemporariesEntityMockTemporaryParserRuleCall_4_2_5_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockTemporary_in_ruleEntityMockEntity7558);
-                    	    lv_temporaries_24_0=ruleEntityMockTemporary();
+                    	    pushFollow(FOLLOW_28);
+                    	    lv_calculations_27_0=ruleEntityMockEntityFunction();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"temporaries",
-                    	              		lv_temporaries_24_0, 
-                    	              		"EntityMockTemporary");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"calculations",
+                    	      								lv_calculations_27_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunction");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -9723,132 +10032,11 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3450:3: ( (lv_attributes_25_0= ruleIEntityMockAttribute ) )*
-                    loop64:
-                    do {
-                        int alt64=2;
-                        int LA64_0 = input.LA(1);
-
-                        if ( (LA64_0==32) ) {
-                            int LA64_1 = input.LA(2);
-
-                            if ( (LA64_1==RULE_ID) ) {
-                                int LA64_4 = input.LA(3);
-
-                                if ( (LA64_4==42||LA64_4==81) ) {
-                                    alt64=1;
-                                }
-
-
-                            }
-
-
-                        }
-                        else if ( ((LA64_0>=85 && LA64_0<=86)) ) {
-                            alt64=1;
-                        }
-
-
-                        switch (alt64) {
-                    	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3451:1: (lv_attributes_25_0= ruleIEntityMockAttribute )
-                    	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3451:1: (lv_attributes_25_0= ruleIEntityMockAttribute )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3452:3: lv_attributes_25_0= ruleIEntityMockAttribute
-                    	    {
-                    	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0()); 
-                    	      	    
-                    	    }
-                    	    pushFollow(FOLLOW_ruleIEntityMockAttribute_in_ruleEntityMockEntity7580);
-                    	    lv_attributes_25_0=ruleIEntityMockAttribute();
-
-                    	    state._fsp--;
-                    	    if (state.failed) return current;
-                    	    if ( state.backtracking==0 ) {
-
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"attributes",
-                    	              		lv_attributes_25_0, 
-                    	              		"IEntityMockAttribute");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
-                    	    }
-
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop64;
-                        }
-                    } while (true);
-
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3468:3: ( (lv_calculations_26_0= ruleEntityMockEntityFunction ) )*
-                    loop65:
-                    do {
-                        int alt65=2;
-                        int LA65_0 = input.LA(1);
-
-                        if ( (LA65_0==32) ) {
-                            alt65=1;
-                        }
-
-
-                        switch (alt65) {
-                    	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3469:1: (lv_calculations_26_0= ruleEntityMockEntityFunction )
-                    	    {
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3469:1: (lv_calculations_26_0= ruleEntityMockEntityFunction )
-                    	    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3470:3: lv_calculations_26_0= ruleEntityMockEntityFunction
-                    	    {
-                    	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getEntityMockEntityAccess().getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0()); 
-                    	      	    
-                    	    }
-                    	    pushFollow(FOLLOW_ruleEntityMockEntityFunction_in_ruleEntityMockEntity7602);
-                    	    lv_calculations_26_0=ruleEntityMockEntityFunction();
-
-                    	    state._fsp--;
-                    	    if (state.failed) return current;
-                    	    if ( state.backtracking==0 ) {
-
-                    	      	        if (current==null) {
-                    	      	            current = createModelElementForParent(grammarAccess.getEntityMockEntityRule());
-                    	      	        }
-                    	             		add(
-                    	             			current, 
-                    	             			"calculations",
-                    	              		lv_calculations_26_0, 
-                    	              		"EntityMockEntityFunction");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
-                    	    }
-
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop65;
-                        }
-                    } while (true);
-
-                    otherlv_27=(Token)match(input,17,FOLLOW_17_in_ruleEntityMockEntity7615); if (state.failed) return current;
+                    otherlv_28=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_27, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8());
-                          
+                      					newLeafNode(otherlv_28, grammarAccess.getEntityMockEntityAccess().getRightCurlyBracketKeyword_4_2_8());
+                      				
                     }
 
                     }
@@ -9866,14 +10054,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9882,7 +10072,7 @@
 
 
     // $ANTLR start "entryRuleIIterate"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3498:1: entryRuleIIterate returns [EObject current=null] : iv_ruleIIterate= ruleIIterate EOF ;
+    // InternalEntityMockDSL.g:3551:1: entryRuleIIterate returns [EObject current=null] : iv_ruleIIterate= ruleIIterate EOF ;
     public final EObject entryRuleIIterate() throws RecognitionException {
         EObject current = null;
 
@@ -9890,13 +10080,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3499:2: (iv_ruleIIterate= ruleIIterate EOF )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3500:2: iv_ruleIIterate= ruleIIterate EOF
+            // InternalEntityMockDSL.g:3551:49: (iv_ruleIIterate= ruleIIterate EOF )
+            // InternalEntityMockDSL.g:3552:2: iv_ruleIIterate= ruleIIterate EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIIterateRule()); 
             }
-            pushFollow(FOLLOW_ruleIIterate_in_entryRuleIIterate7653);
+            pushFollow(FOLLOW_1);
             iv_ruleIIterate=ruleIIterate();
 
             state._fsp--;
@@ -9904,16 +10094,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleIIterate; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleIIterate7663); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -9922,7 +10112,7 @@
 
 
     // $ANTLR start "ruleIIterate"
-    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3507:1: ruleIIterate returns [EObject current=null] : (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate ) ;
+    // InternalEntityMockDSL.g:3558:1: ruleIIterate returns [EObject current=null] : (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate ) ;
     public final EObject ruleIIterate() throws RecognitionException {
         EObject current = null;
 
@@ -9931,70 +10121,71 @@
         EObject this_DateIterate_1 = null;
 
 
-         enterRule(); 
-            
-        try {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3510:28: ( (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate ) )
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3511:1: (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate )
-            {
-            // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3511:1: (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate )
-            int alt67=2;
-            int LA67_0 = input.LA(1);
 
-            if ( (LA67_0==72) ) {
-                alt67=1;
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3564:2: ( (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate ) )
+            // InternalEntityMockDSL.g:3565:2: (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate )
+            {
+            // InternalEntityMockDSL.g:3565:2: (this_IntegerIterate_0= ruleIntegerIterate | this_DateIterate_1= ruleDateIterate )
+            int alt65=2;
+            int LA65_0 = input.LA(1);
+
+            if ( (LA65_0==70) ) {
+                alt65=1;
             }
-            else if ( (LA67_0==75) ) {
-                alt67=2;
+            else if ( (LA65_0==72) ) {
+                alt65=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 67, 0, input);
+                    new NoViableAltException("", 65, 0, input);
 
                 throw nvae;
             }
-            switch (alt67) {
+            switch (alt65) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3512:5: this_IntegerIterate_0= ruleIntegerIterate
+                    // InternalEntityMockDSL.g:3566:3: this_IntegerIterate_0= ruleIntegerIterate
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIIterateAccess().getIntegerIterateParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleIntegerIterate_in_ruleIIterate7710);
+                    pushFollow(FOLLOW_2);
                     this_IntegerIterate_0=ruleIntegerIterate();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_IntegerIterate_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_IntegerIterate_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/parser/antlr/internal/InternalEntityMockDSL.g:3522:5: this_DateIterate_1= ruleDateIterate
+                    // InternalEntityMockDSL.g:3575:3: this_DateIterate_1= ruleDateIterate
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getIIterateAccess().getDateIterateParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleDateIterate_in_ruleIIterate7737);
+                    pushFollow(FOLLOW_2);
                     this_DateIterate_1=ruleDateIterate();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_DateIterate_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_DateIterate_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -10006,10 +10197,27540 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIIterate"
+
+
+    // $ANTLR start "entryRuleIntegerIterate"
+    // InternalEntityMockDSL.g:3587:1: entryRuleIntegerIterate returns [EObject current=null] : iv_ruleIntegerIterate= ruleIntegerIterate EOF ;
+    public final EObject entryRuleIntegerIterate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIntegerIterate = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:3587:55: (iv_ruleIntegerIterate= ruleIntegerIterate EOF )
+            // InternalEntityMockDSL.g:3588:2: iv_ruleIntegerIterate= ruleIntegerIterate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIntegerIterateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleIntegerIterate=ruleIntegerIterate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIntegerIterate; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIntegerIterate"
+
+
+    // $ANTLR start "ruleIntegerIterate"
+    // InternalEntityMockDSL.g:3594:1: ruleIntegerIterate returns [EObject current=null] : (otherlv_0= 'integerFrom' ( (lv_from_1_0= ruleSINT ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleSINT ) ) otherlv_4= 'step' ( (lv_step_5_0= RULE_INT ) ) ) ;
+    public final EObject ruleIntegerIterate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_step_5_0=null;
+        AntlrDatatypeRuleToken lv_from_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_until_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3600:2: ( (otherlv_0= 'integerFrom' ( (lv_from_1_0= ruleSINT ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleSINT ) ) otherlv_4= 'step' ( (lv_step_5_0= RULE_INT ) ) ) )
+            // InternalEntityMockDSL.g:3601:2: (otherlv_0= 'integerFrom' ( (lv_from_1_0= ruleSINT ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleSINT ) ) otherlv_4= 'step' ( (lv_step_5_0= RULE_INT ) ) )
+            {
+            // InternalEntityMockDSL.g:3601:2: (otherlv_0= 'integerFrom' ( (lv_from_1_0= ruleSINT ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleSINT ) ) otherlv_4= 'step' ( (lv_step_5_0= RULE_INT ) ) )
+            // InternalEntityMockDSL.g:3602:3: otherlv_0= 'integerFrom' ( (lv_from_1_0= ruleSINT ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleSINT ) ) otherlv_4= 'step' ( (lv_step_5_0= RULE_INT ) )
+            {
+            otherlv_0=(Token)match(input,70,FOLLOW_44); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getIntegerIterateAccess().getIntegerFromKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:3606:3: ( (lv_from_1_0= ruleSINT ) )
+            // InternalEntityMockDSL.g:3607:4: (lv_from_1_0= ruleSINT )
+            {
+            // InternalEntityMockDSL.g:3607:4: (lv_from_1_0= ruleSINT )
+            // InternalEntityMockDSL.g:3608:5: lv_from_1_0= ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_45);
+            lv_from_1_0=ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
+              					}
+              					set(
+              						current,
+              						"from",
+              						lv_from_1_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,48,FOLLOW_44); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getIntegerIterateAccess().getUntilKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:3629:3: ( (lv_until_3_0= ruleSINT ) )
+            // InternalEntityMockDSL.g:3630:4: (lv_until_3_0= ruleSINT )
+            {
+            // InternalEntityMockDSL.g:3630:4: (lv_until_3_0= ruleSINT )
+            // InternalEntityMockDSL.g:3631:5: lv_until_3_0= ruleSINT
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_64);
+            lv_until_3_0=ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntegerIterateRule());
+              					}
+              					set(
+              						current,
+              						"until",
+              						lv_until_3_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,71,FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getIntegerIterateAccess().getStepKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:3652:3: ( (lv_step_5_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:3653:4: (lv_step_5_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:3653:4: (lv_step_5_0= RULE_INT )
+            // InternalEntityMockDSL.g:3654:5: lv_step_5_0= RULE_INT
+            {
+            lv_step_5_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_step_5_0, grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getIntegerIterateRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"step",
+              						lv_step_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIntegerIterate"
+
+
+    // $ANTLR start "entryRuleDateIterate"
+    // InternalEntityMockDSL.g:3674:1: entryRuleDateIterate returns [EObject current=null] : iv_ruleDateIterate= ruleDateIterate EOF ;
+    public final EObject entryRuleDateIterate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDateIterate = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:3674:52: (iv_ruleDateIterate= ruleDateIterate EOF )
+            // InternalEntityMockDSL.g:3675:2: iv_ruleDateIterate= ruleDateIterate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDateIterateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDateIterate=ruleDateIterate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDateIterate; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDateIterate"
+
+
+    // $ANTLR start "ruleDateIterate"
+    // InternalEntityMockDSL.g:3681:1: ruleDateIterate returns [EObject current=null] : (otherlv_0= 'dateFrom' ( (lv_from_1_0= ruleDate ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleDate ) ) otherlv_4= 'every' ( (lv_stepCount_5_0= RULE_INT ) ) ( (lv_stepType_6_0= ruleEDateStepType ) ) ) ;
+    public final EObject ruleDateIterate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_stepCount_5_0=null;
+        EObject lv_from_1_0 = null;
+
+        EObject lv_until_3_0 = null;
+
+        Enumerator lv_stepType_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3687:2: ( (otherlv_0= 'dateFrom' ( (lv_from_1_0= ruleDate ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleDate ) ) otherlv_4= 'every' ( (lv_stepCount_5_0= RULE_INT ) ) ( (lv_stepType_6_0= ruleEDateStepType ) ) ) )
+            // InternalEntityMockDSL.g:3688:2: (otherlv_0= 'dateFrom' ( (lv_from_1_0= ruleDate ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleDate ) ) otherlv_4= 'every' ( (lv_stepCount_5_0= RULE_INT ) ) ( (lv_stepType_6_0= ruleEDateStepType ) ) )
+            {
+            // InternalEntityMockDSL.g:3688:2: (otherlv_0= 'dateFrom' ( (lv_from_1_0= ruleDate ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleDate ) ) otherlv_4= 'every' ( (lv_stepCount_5_0= RULE_INT ) ) ( (lv_stepType_6_0= ruleEDateStepType ) ) )
+            // InternalEntityMockDSL.g:3689:3: otherlv_0= 'dateFrom' ( (lv_from_1_0= ruleDate ) ) otherlv_2= 'until' ( (lv_until_3_0= ruleDate ) ) otherlv_4= 'every' ( (lv_stepCount_5_0= RULE_INT ) ) ( (lv_stepType_6_0= ruleEDateStepType ) )
+            {
+            otherlv_0=(Token)match(input,72,FOLLOW_65); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getDateIterateAccess().getDateFromKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:3693:3: ( (lv_from_1_0= ruleDate ) )
+            // InternalEntityMockDSL.g:3694:4: (lv_from_1_0= ruleDate )
+            {
+            // InternalEntityMockDSL.g:3694:4: (lv_from_1_0= ruleDate )
+            // InternalEntityMockDSL.g:3695:5: lv_from_1_0= ruleDate
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_45);
+            lv_from_1_0=ruleDate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDateIterateRule());
+              					}
+              					set(
+              						current,
+              						"from",
+              						lv_from_1_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Date");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,48,FOLLOW_65); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getDateIterateAccess().getUntilKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:3716:3: ( (lv_until_3_0= ruleDate ) )
+            // InternalEntityMockDSL.g:3717:4: (lv_until_3_0= ruleDate )
+            {
+            // InternalEntityMockDSL.g:3717:4: (lv_until_3_0= ruleDate )
+            // InternalEntityMockDSL.g:3718:5: lv_until_3_0= ruleDate
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_66);
+            lv_until_3_0=ruleDate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDateIterateRule());
+              					}
+              					set(
+              						current,
+              						"until",
+              						lv_until_3_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Date");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,73,FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getDateIterateAccess().getEveryKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:3739:3: ( (lv_stepCount_5_0= RULE_INT ) )
+            // InternalEntityMockDSL.g:3740:4: (lv_stepCount_5_0= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:3740:4: (lv_stepCount_5_0= RULE_INT )
+            // InternalEntityMockDSL.g:3741:5: lv_stepCount_5_0= RULE_INT
+            {
+            lv_stepCount_5_0=(Token)match(input,RULE_INT,FOLLOW_67); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_stepCount_5_0, grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDateIterateRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"stepCount",
+              						lv_stepCount_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:3757:3: ( (lv_stepType_6_0= ruleEDateStepType ) )
+            // InternalEntityMockDSL.g:3758:4: (lv_stepType_6_0= ruleEDateStepType )
+            {
+            // InternalEntityMockDSL.g:3758:4: (lv_stepType_6_0= ruleEDateStepType )
+            // InternalEntityMockDSL.g:3759:5: lv_stepType_6_0= ruleEDateStepType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDateIterateAccess().getStepTypeEDateStepTypeEnumRuleCall_6_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_stepType_6_0=ruleEDateStepType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDateIterateRule());
+              					}
+              					set(
+              						current,
+              						"stepType",
+              						lv_stepType_6_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EDateStepType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDateIterate"
+
+
+    // $ANTLR start "entryRuleDate"
+    // InternalEntityMockDSL.g:3780:1: entryRuleDate returns [EObject current=null] : iv_ruleDate= ruleDate EOF ;
+    public final EObject entryRuleDate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDate = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:3780:45: (iv_ruleDate= ruleDate EOF )
+            // InternalEntityMockDSL.g:3781:2: iv_ruleDate= ruleDate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDate=ruleDate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDate; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDate"
+
+
+    // $ANTLR start "ruleDate"
+    // InternalEntityMockDSL.g:3787:1: ruleDate returns [EObject current=null] : ( ( (lv_yesterday_0_0= 'yesterday' ) ) | ( (lv_today_1_0= 'today' ) ) | ( (lv_tomorrow_2_0= 'tomorrow' ) ) | ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) ) ) ;
+    public final EObject ruleDate() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_yesterday_0_0=null;
+        Token lv_today_1_0=null;
+        Token lv_tomorrow_2_0=null;
+        Token lv_year_3_0=null;
+        Token otherlv_4=null;
+        Token lv_month_5_0=null;
+        Token otherlv_6=null;
+        Token lv_day_7_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3793:2: ( ( ( (lv_yesterday_0_0= 'yesterday' ) ) | ( (lv_today_1_0= 'today' ) ) | ( (lv_tomorrow_2_0= 'tomorrow' ) ) | ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) ) ) )
+            // InternalEntityMockDSL.g:3794:2: ( ( (lv_yesterday_0_0= 'yesterday' ) ) | ( (lv_today_1_0= 'today' ) ) | ( (lv_tomorrow_2_0= 'tomorrow' ) ) | ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) ) )
+            {
+            // InternalEntityMockDSL.g:3794:2: ( ( (lv_yesterday_0_0= 'yesterday' ) ) | ( (lv_today_1_0= 'today' ) ) | ( (lv_tomorrow_2_0= 'tomorrow' ) ) | ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) ) )
+            int alt66=4;
+            switch ( input.LA(1) ) {
+            case 74:
+                {
+                alt66=1;
+                }
+                break;
+            case 75:
+                {
+                alt66=2;
+                }
+                break;
+            case 76:
+                {
+                alt66=3;
+                }
+                break;
+            case RULE_INT:
+                {
+                alt66=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 66, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt66) {
+                case 1 :
+                    // InternalEntityMockDSL.g:3795:3: ( (lv_yesterday_0_0= 'yesterday' ) )
+                    {
+                    // InternalEntityMockDSL.g:3795:3: ( (lv_yesterday_0_0= 'yesterday' ) )
+                    // InternalEntityMockDSL.g:3796:4: (lv_yesterday_0_0= 'yesterday' )
+                    {
+                    // InternalEntityMockDSL.g:3796:4: (lv_yesterday_0_0= 'yesterday' )
+                    // InternalEntityMockDSL.g:3797:5: lv_yesterday_0_0= 'yesterday'
+                    {
+                    lv_yesterday_0_0=(Token)match(input,74,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_yesterday_0_0, grammarAccess.getDateAccess().getYesterdayYesterdayKeyword_0_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getDateRule());
+                      					}
+                      					setWithLastConsumed(current, "yesterday", true, "yesterday");
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:3810:3: ( (lv_today_1_0= 'today' ) )
+                    {
+                    // InternalEntityMockDSL.g:3810:3: ( (lv_today_1_0= 'today' ) )
+                    // InternalEntityMockDSL.g:3811:4: (lv_today_1_0= 'today' )
+                    {
+                    // InternalEntityMockDSL.g:3811:4: (lv_today_1_0= 'today' )
+                    // InternalEntityMockDSL.g:3812:5: lv_today_1_0= 'today'
+                    {
+                    lv_today_1_0=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_today_1_0, grammarAccess.getDateAccess().getTodayTodayKeyword_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getDateRule());
+                      					}
+                      					setWithLastConsumed(current, "today", true, "today");
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:3825:3: ( (lv_tomorrow_2_0= 'tomorrow' ) )
+                    {
+                    // InternalEntityMockDSL.g:3825:3: ( (lv_tomorrow_2_0= 'tomorrow' ) )
+                    // InternalEntityMockDSL.g:3826:4: (lv_tomorrow_2_0= 'tomorrow' )
+                    {
+                    // InternalEntityMockDSL.g:3826:4: (lv_tomorrow_2_0= 'tomorrow' )
+                    // InternalEntityMockDSL.g:3827:5: lv_tomorrow_2_0= 'tomorrow'
+                    {
+                    lv_tomorrow_2_0=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_tomorrow_2_0, grammarAccess.getDateAccess().getTomorrowTomorrowKeyword_2_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getDateRule());
+                      					}
+                      					setWithLastConsumed(current, "tomorrow", true, "tomorrow");
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:3840:3: ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) )
+                    {
+                    // InternalEntityMockDSL.g:3840:3: ( ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) ) )
+                    // InternalEntityMockDSL.g:3841:4: ( (lv_year_3_0= RULE_INT ) ) otherlv_4= '-' ( (lv_month_5_0= RULE_INT ) ) otherlv_6= '-' ( (lv_day_7_0= RULE_INT ) )
+                    {
+                    // InternalEntityMockDSL.g:3841:4: ( (lv_year_3_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3842:5: (lv_year_3_0= RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:3842:5: (lv_year_3_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3843:6: lv_year_3_0= RULE_INT
+                    {
+                    lv_year_3_0=(Token)match(input,RULE_INT,FOLLOW_68); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_year_3_0, grammarAccess.getDateAccess().getYearINTTerminalRuleCall_3_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDateRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"year",
+                      							lv_year_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,77,FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_1());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:3863:4: ( (lv_month_5_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3864:5: (lv_month_5_0= RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:3864:5: (lv_month_5_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3865:6: lv_month_5_0= RULE_INT
+                    {
+                    lv_month_5_0=(Token)match(input,RULE_INT,FOLLOW_68); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_month_5_0, grammarAccess.getDateAccess().getMonthINTTerminalRuleCall_3_2_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDateRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"month",
+                      							lv_month_5_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_6=(Token)match(input,77,FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getDateAccess().getHyphenMinusKeyword_3_3());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:3885:4: ( (lv_day_7_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:3886:5: (lv_day_7_0= RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:3886:5: (lv_day_7_0= RULE_INT )
+                    // InternalEntityMockDSL.g:3887:6: lv_day_7_0= RULE_INT
+                    {
+                    lv_day_7_0=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_day_7_0, grammarAccess.getDateAccess().getDayINTTerminalRuleCall_3_4_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDateRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"day",
+                      							lv_day_7_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDate"
+
+
+    // $ANTLR start "entryRuleEntityMockByResourceAttribute"
+    // InternalEntityMockDSL.g:3908:1: entryRuleEntityMockByResourceAttribute returns [EObject current=null] : iv_ruleEntityMockByResourceAttribute= ruleEntityMockByResourceAttribute EOF ;
+    public final EObject entryRuleEntityMockByResourceAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockByResourceAttribute = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:3908:70: (iv_ruleEntityMockByResourceAttribute= ruleEntityMockByResourceAttribute EOF )
+            // InternalEntityMockDSL.g:3909:2: iv_ruleEntityMockByResourceAttribute= ruleEntityMockByResourceAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockByResourceAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockByResourceAttribute=ruleEntityMockByResourceAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockByResourceAttribute; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockByResourceAttribute"
+
+
+    // $ANTLR start "ruleEntityMockByResourceAttribute"
+    // InternalEntityMockDSL.g:3915:1: ruleEntityMockByResourceAttribute returns [EObject current=null] : ( () otherlv_1= 'var' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'as' ( (otherlv_4= RULE_ID ) ) ) ;
+    public final EObject ruleEntityMockByResourceAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3921:2: ( ( () otherlv_1= 'var' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'as' ( (otherlv_4= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:3922:2: ( () otherlv_1= 'var' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'as' ( (otherlv_4= RULE_ID ) ) )
+            {
+            // InternalEntityMockDSL.g:3922:2: ( () otherlv_1= 'var' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'as' ( (otherlv_4= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:3923:3: () otherlv_1= 'var' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'as' ( (otherlv_4= RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:3923:3: ()
+            // InternalEntityMockDSL.g:3924:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockByResourceAttributeAccess().getEntityMockByResourceAttributeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockByResourceAttributeAccess().getVarKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:3934:3: ( (otherlv_2= RULE_ID ) )
+            // InternalEntityMockDSL.g:3935:4: (otherlv_2= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:3935:4: (otherlv_2= RULE_ID )
+            // InternalEntityMockDSL.g:3936:5: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
+              					}
+              				
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_69); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeCrossReference_2_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,78,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getEntityMockByResourceAttributeAccess().getAsKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:3951:3: ( (otherlv_4= RULE_ID ) )
+            // InternalEntityMockDSL.g:3952:4: (otherlv_4= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:3952:4: (otherlv_4= RULE_ID )
+            // InternalEntityMockDSL.g:3953:5: otherlv_4= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockByResourceAttributeRule());
+              					}
+              				
+            }
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_4, grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_4_0());
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockByResourceAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockTemplate"
+    // InternalEntityMockDSL.g:3968:1: entryRuleEntityMockTemplate returns [EObject current=null] : iv_ruleEntityMockTemplate= ruleEntityMockTemplate EOF ;
+    public final EObject entryRuleEntityMockTemplate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockTemplate = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:3968:59: (iv_ruleEntityMockTemplate= ruleEntityMockTemplate EOF )
+            // InternalEntityMockDSL.g:3969:2: iv_ruleEntityMockTemplate= ruleEntityMockTemplate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockTemplateRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockTemplate=ruleEntityMockTemplate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockTemplate; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockTemplate"
+
+
+    // $ANTLR start "ruleEntityMockTemplate"
+    // InternalEntityMockDSL.g:3975:1: ruleEntityMockTemplate returns [EObject current=null] : (otherlv_0= 'template' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byObject' ( (otherlv_3= RULE_ID ) ) ) ;
+    public final EObject ruleEntityMockTemplate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_name_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:3981:2: ( (otherlv_0= 'template' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byObject' ( (otherlv_3= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:3982:2: (otherlv_0= 'template' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byObject' ( (otherlv_3= RULE_ID ) ) )
+            {
+            // InternalEntityMockDSL.g:3982:2: (otherlv_0= 'template' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byObject' ( (otherlv_3= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:3983:3: otherlv_0= 'template' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= 'byObject' ( (otherlv_3= RULE_ID ) )
+            {
+            otherlv_0=(Token)match(input,79,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockTemplateAccess().getTemplateKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:3987:3: ( (lv_name_1_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:3988:4: (lv_name_1_0= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:3988:4: (lv_name_1_0= RULE_ID )
+            // InternalEntityMockDSL.g:3989:5: lv_name_1_0= RULE_ID
+            {
+            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_70); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_1_0, grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockTemplateRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,80,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockTemplateAccess().getByObjectKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:4009:3: ( (otherlv_3= RULE_ID ) )
+            // InternalEntityMockDSL.g:4010:4: (otherlv_3= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4010:4: (otherlv_3= RULE_ID )
+            // InternalEntityMockDSL.g:4011:5: otherlv_3= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockTemplateRule());
+              					}
+              				
+            }
+            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_3, grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectCrossReference_3_0());
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockTemplate"
+
+
+    // $ANTLR start "entryRuleIEntityMockAttribute"
+    // InternalEntityMockDSL.g:4026:1: entryRuleIEntityMockAttribute returns [EObject current=null] : iv_ruleIEntityMockAttribute= ruleIEntityMockAttribute EOF ;
+    public final EObject entryRuleIEntityMockAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIEntityMockAttribute = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4026:61: (iv_ruleIEntityMockAttribute= ruleIEntityMockAttribute EOF )
+            // InternalEntityMockDSL.g:4027:2: iv_ruleIEntityMockAttribute= ruleIEntityMockAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIEntityMockAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleIEntityMockAttribute=ruleIEntityMockAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIEntityMockAttribute; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIEntityMockAttribute"
+
+
+    // $ANTLR start "ruleIEntityMockAttribute"
+    // InternalEntityMockDSL.g:4033:1: ruleIEntityMockAttribute returns [EObject current=null] : (this_EntityMockAttributeByObject_0= ruleEntityMockAttributeByObject | this_EntityMockAttributeFiller_1= ruleEntityMockAttributeFiller | this_EntityMockAttributeByReference_2= ruleEntityMockAttributeByReference ) ;
+    public final EObject ruleIEntityMockAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_EntityMockAttributeByObject_0 = null;
+
+        EObject this_EntityMockAttributeFiller_1 = null;
+
+        EObject this_EntityMockAttributeByReference_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4039:2: ( (this_EntityMockAttributeByObject_0= ruleEntityMockAttributeByObject | this_EntityMockAttributeFiller_1= ruleEntityMockAttributeFiller | this_EntityMockAttributeByReference_2= ruleEntityMockAttributeByReference ) )
+            // InternalEntityMockDSL.g:4040:2: (this_EntityMockAttributeByObject_0= ruleEntityMockAttributeByObject | this_EntityMockAttributeFiller_1= ruleEntityMockAttributeFiller | this_EntityMockAttributeByReference_2= ruleEntityMockAttributeByReference )
+            {
+            // InternalEntityMockDSL.g:4040:2: (this_EntityMockAttributeByObject_0= ruleEntityMockAttributeByObject | this_EntityMockAttributeFiller_1= ruleEntityMockAttributeFiller | this_EntityMockAttributeByReference_2= ruleEntityMockAttributeByReference )
+            int alt67=3;
+            switch ( input.LA(1) ) {
+            case 31:
+                {
+                int LA67_1 = input.LA(2);
+
+                if ( (LA67_1==RULE_ID) ) {
+                    int LA67_4 = input.LA(3);
+
+                    if ( (LA67_4==41) ) {
+                        alt67=2;
+                    }
+                    else if ( (LA67_4==78) ) {
+                        alt67=1;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 67, 4, input);
+
+                        throw nvae;
+                    }
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 67, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 82:
+                {
+                alt67=1;
+                }
+                break;
+            case 83:
+                {
+                alt67=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 67, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt67) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4041:3: this_EntityMockAttributeByObject_0= ruleEntityMockAttributeByObject
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByObjectParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_EntityMockAttributeByObject_0=ruleEntityMockAttributeByObject();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EntityMockAttributeByObject_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4050:3: this_EntityMockAttributeFiller_1= ruleEntityMockAttributeFiller
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeFillerParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_EntityMockAttributeFiller_1=ruleEntityMockAttributeFiller();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EntityMockAttributeFiller_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4059:3: this_EntityMockAttributeByReference_2= ruleEntityMockAttributeByReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getIEntityMockAttributeAccess().getEntityMockAttributeByReferenceParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_EntityMockAttributeByReference_2=ruleEntityMockAttributeByReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EntityMockAttributeByReference_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIEntityMockAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityFunction"
+    // InternalEntityMockDSL.g:4071:1: entryRuleEntityMockEntityFunction returns [EObject current=null] : iv_ruleEntityMockEntityFunction= ruleEntityMockEntityFunction EOF ;
+    public final EObject entryRuleEntityMockEntityFunction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockEntityFunction = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4071:65: (iv_ruleEntityMockEntityFunction= ruleEntityMockEntityFunction EOF )
+            // InternalEntityMockDSL.g:4072:2: iv_ruleEntityMockEntityFunction= ruleEntityMockEntityFunction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockEntityFunctionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockEntityFunction=ruleEntityMockEntityFunction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockEntityFunction; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityFunction"
+
+
+    // $ANTLR start "ruleEntityMockEntityFunction"
+    // InternalEntityMockDSL.g:4078:1: ruleEntityMockEntityFunction returns [EObject current=null] : (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'calculateOn' otherlv_3= '(' ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )? otherlv_7= ')' ( (lv_body_8_0= ruleXBlockExpression ) ) ) ;
+    public final EObject ruleEntityMockEntityFunction() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_params_4_0 = null;
+
+        EObject lv_params_6_0 = null;
+
+        EObject lv_body_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4084:2: ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'calculateOn' otherlv_3= '(' ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )? otherlv_7= ')' ( (lv_body_8_0= ruleXBlockExpression ) ) ) )
+            // InternalEntityMockDSL.g:4085:2: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'calculateOn' otherlv_3= '(' ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )? otherlv_7= ')' ( (lv_body_8_0= ruleXBlockExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:4085:2: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'calculateOn' otherlv_3= '(' ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )? otherlv_7= ')' ( (lv_body_8_0= ruleXBlockExpression ) ) )
+            // InternalEntityMockDSL.g:4086:3: otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'calculateOn' otherlv_3= '(' ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )? otherlv_7= ')' ( (lv_body_8_0= ruleXBlockExpression ) )
+            {
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionAccess().getVarKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:4090:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:4091:4: (otherlv_1= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4091:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:4092:5: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockEntityFunctionRule());
+              					}
+              				
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_71); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityFunctionAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,81,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityFunctionAccess().getCalculateOnKeyword_2());
+              		
+            }
+            otherlv_3=(Token)match(input,25,FOLLOW_18); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getEntityMockEntityFunctionAccess().getLeftParenthesisKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:4111:3: ( ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )* )?
+            int alt69=2;
+            int LA69_0 = input.LA(1);
+
+            if ( (LA69_0==RULE_ID) ) {
+                alt69=1;
+            }
+            switch (alt69) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4112:4: ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) ) (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:4112:4: ( (lv_params_4_0= ruleEntityMockEntityFunctionParameter ) )
+                    // InternalEntityMockDSL.g:4113:5: (lv_params_4_0= ruleEntityMockEntityFunctionParameter )
+                    {
+                    // InternalEntityMockDSL.g:4113:5: (lv_params_4_0= ruleEntityMockEntityFunctionParameter )
+                    // InternalEntityMockDSL.g:4114:6: lv_params_4_0= ruleEntityMockEntityFunctionParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_38);
+                    lv_params_4_0=ruleEntityMockEntityFunctionParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"params",
+                      							lv_params_4_0,
+                      							"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunctionParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:4131:4: (otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) ) )*
+                    loop68:
+                    do {
+                        int alt68=2;
+                        int LA68_0 = input.LA(1);
+
+                        if ( (LA68_0==26) ) {
+                            alt68=1;
+                        }
+
+
+                        switch (alt68) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:4132:5: otherlv_5= ',' ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,26,FOLLOW_4); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_5, grammarAccess.getEntityMockEntityFunctionAccess().getCommaKeyword_4_1_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:4136:5: ( (lv_params_6_0= ruleEntityMockEntityFunctionParameter ) )
+                    	    // InternalEntityMockDSL.g:4137:6: (lv_params_6_0= ruleEntityMockEntityFunctionParameter )
+                    	    {
+                    	    // InternalEntityMockDSL.g:4137:6: (lv_params_6_0= ruleEntityMockEntityFunctionParameter )
+                    	    // InternalEntityMockDSL.g:4138:7: lv_params_6_0= ruleEntityMockEntityFunctionParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_38);
+                    	    lv_params_6_0=ruleEntityMockEntityFunctionParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"params",
+                    	      								lv_params_6_0,
+                    	      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunctionParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop68;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,27,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getEntityMockEntityFunctionAccess().getRightParenthesisKeyword_5());
+              		
+            }
+            // InternalEntityMockDSL.g:4161:3: ( (lv_body_8_0= ruleXBlockExpression ) )
+            // InternalEntityMockDSL.g:4162:4: (lv_body_8_0= ruleXBlockExpression )
+            {
+            // InternalEntityMockDSL.g:4162:4: (lv_body_8_0= ruleXBlockExpression )
+            // InternalEntityMockDSL.g:4163:5: lv_body_8_0= ruleXBlockExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEntityMockEntityFunctionAccess().getBodyXBlockExpressionParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_body_8_0=ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionRule());
+              					}
+              					set(
+              						current,
+              						"body",
+              						lv_body_8_0,
+              						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockEntityFunction"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityFunctionParameter"
+    // InternalEntityMockDSL.g:4184:1: entryRuleEntityMockEntityFunctionParameter returns [EObject current=null] : iv_ruleEntityMockEntityFunctionParameter= ruleEntityMockEntityFunctionParameter EOF ;
+    public final EObject entryRuleEntityMockEntityFunctionParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockEntityFunctionParameter = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4184:74: (iv_ruleEntityMockEntityFunctionParameter= ruleEntityMockEntityFunctionParameter EOF )
+            // InternalEntityMockDSL.g:4185:2: iv_ruleEntityMockEntityFunctionParameter= ruleEntityMockEntityFunctionParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockEntityFunctionParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockEntityFunctionParameter=ruleEntityMockEntityFunctionParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockEntityFunctionParameter; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityFunctionParameter"
+
+
+    // $ANTLR start "ruleEntityMockEntityFunctionParameter"
+    // InternalEntityMockDSL.g:4191:1: ruleEntityMockEntityFunctionParameter returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) | ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) ) ) ;
+    public final EObject ruleEntityMockEntityFunctionParameter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_nestedAttribute_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4197:2: ( ( ( (otherlv_0= RULE_ID ) ) | ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) ) ) )
+            // InternalEntityMockDSL.g:4198:2: ( ( (otherlv_0= RULE_ID ) ) | ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) ) )
+            {
+            // InternalEntityMockDSL.g:4198:2: ( ( (otherlv_0= RULE_ID ) ) | ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) ) )
+            int alt70=2;
+            int LA70_0 = input.LA(1);
+
+            if ( (LA70_0==RULE_ID) ) {
+                int LA70_1 = input.LA(2);
+
+                if ( (LA70_1==34) ) {
+                    alt70=2;
+                }
+                else if ( (LA70_1==EOF||(LA70_1>=26 && LA70_1<=27)) ) {
+                    alt70=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 70, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 70, 0, input);
+
+                throw nvae;
+            }
+            switch (alt70) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4199:3: ( (otherlv_0= RULE_ID ) )
+                    {
+                    // InternalEntityMockDSL.g:4199:3: ( (otherlv_0= RULE_ID ) )
+                    // InternalEntityMockDSL.g:4200:4: (otherlv_0= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:4200:4: (otherlv_0= RULE_ID )
+                    // InternalEntityMockDSL.g:4201:5: otherlv_0= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getEntityMockEntityFunctionParameterRule());
+                      					}
+                      				
+                    }
+                    otherlv_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityFunctionParameterAccess().getAttributeRefLEntityAttributeCrossReference_0_0());
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4213:3: ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) )
+                    {
+                    // InternalEntityMockDSL.g:4213:3: ( (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute ) )
+                    // InternalEntityMockDSL.g:4214:4: (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute )
+                    {
+                    // InternalEntityMockDSL.g:4214:4: (lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute )
+                    // InternalEntityMockDSL.g:4215:5: lv_nestedAttribute_1_0= ruleEntityMockEntityNestedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEntityMockEntityFunctionParameterAccess().getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_nestedAttribute_1_0=ruleEntityMockEntityNestedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEntityMockEntityFunctionParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"nestedAttribute",
+                      						lv_nestedAttribute_1_0,
+                      						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityNestedAttribute");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockEntityFunctionParameter"
+
+
+    // $ANTLR start "entryRuleEntityMockEntityNestedAttribute"
+    // InternalEntityMockDSL.g:4236:1: entryRuleEntityMockEntityNestedAttribute returns [EObject current=null] : iv_ruleEntityMockEntityNestedAttribute= ruleEntityMockEntityNestedAttribute EOF ;
+    public final EObject entryRuleEntityMockEntityNestedAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockEntityNestedAttribute = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4236:72: (iv_ruleEntityMockEntityNestedAttribute= ruleEntityMockEntityNestedAttribute EOF )
+            // InternalEntityMockDSL.g:4237:2: iv_ruleEntityMockEntityNestedAttribute= ruleEntityMockEntityNestedAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockEntityNestedAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockEntityNestedAttribute=ruleEntityMockEntityNestedAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockEntityNestedAttribute; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockEntityNestedAttribute"
+
+
+    // $ANTLR start "ruleEntityMockEntityNestedAttribute"
+    // InternalEntityMockDSL.g:4243:1: ruleEntityMockEntityNestedAttribute returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ) ;
+    public final EObject ruleEntityMockEntityNestedAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4249:2: ( ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:4250:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) )
+            {
+            // InternalEntityMockDSL.g:4250:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:4251:3: ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' ( (otherlv_2= RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:4251:3: ( (otherlv_0= RULE_ID ) )
+            // InternalEntityMockDSL.g:4252:4: (otherlv_0= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4252:4: (otherlv_0= RULE_ID )
+            // InternalEntityMockDSL.g:4253:5: otherlv_0= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockEntityNestedAttributeRule());
+              					}
+              				
+            }
+            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_0, grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceCrossReference_0_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getEntityMockEntityNestedAttributeAccess().getFullStopKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:4268:3: ( (otherlv_2= RULE_ID ) )
+            // InternalEntityMockDSL.g:4269:4: (otherlv_2= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4269:4: (otherlv_2= RULE_ID )
+            // InternalEntityMockDSL.g:4270:5: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockEntityNestedAttributeRule());
+              					}
+              				
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeCrossReference_2_0());
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockEntityNestedAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockReferencedObjectAttribute"
+    // InternalEntityMockDSL.g:4285:1: entryRuleEntityMockReferencedObjectAttribute returns [EObject current=null] : iv_ruleEntityMockReferencedObjectAttribute= ruleEntityMockReferencedObjectAttribute EOF ;
+    public final EObject entryRuleEntityMockReferencedObjectAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockReferencedObjectAttribute = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4285:76: (iv_ruleEntityMockReferencedObjectAttribute= ruleEntityMockReferencedObjectAttribute EOF )
+            // InternalEntityMockDSL.g:4286:2: iv_ruleEntityMockReferencedObjectAttribute= ruleEntityMockReferencedObjectAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockReferencedObjectAttributeRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockReferencedObjectAttribute=ruleEntityMockReferencedObjectAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockReferencedObjectAttribute; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockReferencedObjectAttribute"
+
+
+    // $ANTLR start "ruleEntityMockReferencedObjectAttribute"
+    // InternalEntityMockDSL.g:4292:1: ruleEntityMockReferencedObjectAttribute returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )* otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) ) ;
+    public final EObject ruleEntityMockReferencedObjectAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4298:2: ( ( () ( (otherlv_1= RULE_ID ) ) ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )* otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) ) )
+            // InternalEntityMockDSL.g:4299:2: ( () ( (otherlv_1= RULE_ID ) ) ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )* otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )
+            {
+            // InternalEntityMockDSL.g:4299:2: ( () ( (otherlv_1= RULE_ID ) ) ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )* otherlv_4= '.' ( (otherlv_5= RULE_ID ) ) )
+            // InternalEntityMockDSL.g:4300:3: () ( (otherlv_1= RULE_ID ) ) ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )* otherlv_4= '.' ( (otherlv_5= RULE_ID ) )
+            {
+            // InternalEntityMockDSL.g:4300:3: ()
+            // InternalEntityMockDSL.g:4301:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEntityMockReferencedObjectAttributeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:4307:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:4308:4: (otherlv_1= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4308:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:4309:5: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+              					}
+              				
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_73); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getTemplateEntityMockTemplateCrossReference_1_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:4320:3: ( (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) ) )*
+            loop72:
+            do {
+                int alt72=2;
+                int LA72_0 = input.LA(1);
+
+                if ( (LA72_0==34) ) {
+                    int LA72_1 = input.LA(2);
+
+                    if ( (LA72_1==RULE_ID) ) {
+                        int LA72_3 = input.LA(3);
+
+                        if ( (LA72_3==RULE_ID||LA72_3==34) ) {
+                            alt72=1;
+                        }
+
+
+                    }
+
+
+                }
+                else if ( (LA72_0==RULE_ID) ) {
+                    alt72=1;
+                }
+
+
+                switch (alt72) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:4321:4: (otherlv_2= '.' )? ( (otherlv_3= RULE_ID ) )
+            	    {
+            	    // InternalEntityMockDSL.g:4321:4: (otherlv_2= '.' )?
+            	    int alt71=2;
+            	    int LA71_0 = input.LA(1);
+
+            	    if ( (LA71_0==34) ) {
+            	        alt71=1;
+            	    }
+            	    switch (alt71) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:4322:5: otherlv_2= '.'
+            	            {
+            	            otherlv_2=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_2, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:4327:4: ( (otherlv_3= RULE_ID ) )
+            	    // InternalEntityMockDSL.g:4328:5: (otherlv_3= RULE_ID )
+            	    {
+            	    // InternalEntityMockDSL.g:4328:5: (otherlv_3= RULE_ID )
+            	    // InternalEntityMockDSL.g:4329:6: otherlv_3= RULE_ID
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+            	      						}
+            	      					
+            	    }
+            	    otherlv_3=(Token)match(input,RULE_ID,FOLLOW_73); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						newLeafNode(otherlv_3, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0());
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop72;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:4345:3: ( (otherlv_5= RULE_ID ) )
+            // InternalEntityMockDSL.g:4346:4: (otherlv_5= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4346:4: (otherlv_5= RULE_ID )
+            // InternalEntityMockDSL.g:4347:5: otherlv_5= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockReferencedObjectAttributeRule());
+              					}
+              				
+            }
+            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_5, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getAttributeIEntityMockObjectUsableCrossReference_4_0());
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockReferencedObjectAttribute"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeByObject"
+    // InternalEntityMockDSL.g:4362:1: entryRuleEntityMockAttributeByObject returns [EObject current=null] : iv_ruleEntityMockAttributeByObject= ruleEntityMockAttributeByObject EOF ;
+    public final EObject entryRuleEntityMockAttributeByObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockAttributeByObject = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4362:68: (iv_ruleEntityMockAttributeByObject= ruleEntityMockAttributeByObject EOF )
+            // InternalEntityMockDSL.g:4363:2: iv_ruleEntityMockAttributeByObject= ruleEntityMockAttributeByObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockAttributeByObjectRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockAttributeByObject=ruleEntityMockAttributeByObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockAttributeByObject; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeByObject"
+
+
+    // $ANTLR start "ruleEntityMockAttributeByObject"
+    // InternalEntityMockDSL.g:4369:1: ruleEntityMockAttributeByObject returns [EObject current=null] : ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) ) | (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) ) ) ;
+    public final EObject ruleEntityMockAttributeByObject() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        EObject lv_reference_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4375:2: ( ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) ) | (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) ) ) )
+            // InternalEntityMockDSL.g:4376:2: ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) ) | (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) ) )
+            {
+            // InternalEntityMockDSL.g:4376:2: ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) ) | (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) ) )
+            int alt73=2;
+            int LA73_0 = input.LA(1);
+
+            if ( (LA73_0==31) ) {
+                alt73=1;
+            }
+            else if ( (LA73_0==82) ) {
+                alt73=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 73, 0, input);
+
+                throw nvae;
+            }
+            switch (alt73) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4377:3: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:4377:3: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) ) )
+                    // InternalEntityMockDSL.g:4378:4: otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) )
+                    {
+                    otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByObjectAccess().getVarKeyword_0_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:4382:4: ( (otherlv_1= RULE_ID ) )
+                    // InternalEntityMockDSL.g:4383:5: (otherlv_1= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:4383:5: (otherlv_1= RULE_ID )
+                    // InternalEntityMockDSL.g:4384:6: otherlv_1= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+                      						}
+                      					
+                    }
+                    otherlv_1=(Token)match(input,RULE_ID,FOLLOW_69); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByObjectAccess().getAttributeRefLEntityAttributeCrossReference_0_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:4395:4: (otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) ) )
+                    // InternalEntityMockDSL.g:4396:5: otherlv_2= 'as' ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) )
+                    {
+                    otherlv_2=(Token)match(input,78,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByObjectAccess().getAsKeyword_0_2_0());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:4400:5: ( (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute ) )
+                    // InternalEntityMockDSL.g:4401:6: (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute )
+                    {
+                    // InternalEntityMockDSL.g:4401:6: (lv_reference_3_0= ruleEntityMockReferencedObjectAttribute )
+                    // InternalEntityMockDSL.g:4402:7: lv_reference_3_0= ruleEntityMockReferencedObjectAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getEntityMockAttributeByObjectAccess().getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_reference_3_0=ruleEntityMockReferencedObjectAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getEntityMockAttributeByObjectRule());
+                      							}
+                      							set(
+                      								current,
+                      								"reference",
+                      								lv_reference_3_0,
+                      								"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockReferencedObjectAttribute");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4422:3: (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) )
+                    {
+                    // InternalEntityMockDSL.g:4422:3: (otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) ) )
+                    // InternalEntityMockDSL.g:4423:4: otherlv_4= 'using' ( (otherlv_5= RULE_ID ) ) otherlv_6= '.' ( (otherlv_7= RULE_ID ) )
+                    {
+                    otherlv_4=(Token)match(input,82,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByObjectAccess().getUsingKeyword_1_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:4427:4: ( (otherlv_5= RULE_ID ) )
+                    // InternalEntityMockDSL.g:4428:5: (otherlv_5= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:4428:5: (otherlv_5= RULE_ID )
+                    // InternalEntityMockDSL.g:4429:6: otherlv_5= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+                      						}
+                      					
+                    }
+                    otherlv_5=(Token)match(input,RULE_ID,FOLLOW_72); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceEnumEntityMockObjectEnumCrossReference_1_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_6=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getEntityMockAttributeByObjectAccess().getFullStopKeyword_1_2());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:4444:4: ( (otherlv_7= RULE_ID ) )
+                    // InternalEntityMockDSL.g:4445:5: (otherlv_7= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:4445:5: (otherlv_7= RULE_ID )
+                    // InternalEntityMockDSL.g:4446:6: otherlv_7= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockAttributeByObjectRule());
+                      						}
+                      					
+                    }
+                    otherlv_7=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByObjectAccess().getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockAttributeByObject"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeFiller"
+    // InternalEntityMockDSL.g:4462:1: entryRuleEntityMockAttributeFiller returns [EObject current=null] : iv_ruleEntityMockAttributeFiller= ruleEntityMockAttributeFiller EOF ;
+    public final EObject entryRuleEntityMockAttributeFiller() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockAttributeFiller = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4462:66: (iv_ruleEntityMockAttributeFiller= ruleEntityMockAttributeFiller EOF )
+            // InternalEntityMockDSL.g:4463:2: iv_ruleEntityMockAttributeFiller= ruleEntityMockAttributeFiller EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockAttributeFillerRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockAttributeFiller=ruleEntityMockAttributeFiller();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockAttributeFiller; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeFiller"
+
+
+    // $ANTLR start "ruleEntityMockAttributeFiller"
+    // InternalEntityMockDSL.g:4469:1: ruleEntityMockAttributeFiller returns [EObject current=null] : (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) ;
+    public final EObject ruleEntityMockAttributeFiller() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        EObject lv_fillerType_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4475:2: ( (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) ) )
+            // InternalEntityMockDSL.g:4476:2: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
+            {
+            // InternalEntityMockDSL.g:4476:2: (otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) ) )
+            // InternalEntityMockDSL.g:4477:3: otherlv_0= 'var' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'randomize' ( (lv_fillerType_3_0= rulePropertyFillerType ) )
+            {
+            otherlv_0=(Token)match(input,31,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeFillerAccess().getVarKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:4481:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:4482:4: (otherlv_1= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4482:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:4483:5: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockAttributeFillerRule());
+              					}
+              				
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_40); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeCrossReference_1_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,41,FOLLOW_41); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeFillerAccess().getRandomizeKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:4498:3: ( (lv_fillerType_3_0= rulePropertyFillerType ) )
+            // InternalEntityMockDSL.g:4499:4: (lv_fillerType_3_0= rulePropertyFillerType )
+            {
+            // InternalEntityMockDSL.g:4499:4: (lv_fillerType_3_0= rulePropertyFillerType )
+            // InternalEntityMockDSL.g:4500:5: lv_fillerType_3_0= rulePropertyFillerType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_fillerType_3_0=rulePropertyFillerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEntityMockAttributeFillerRule());
+              					}
+              					set(
+              						current,
+              						"fillerType",
+              						lv_fillerType_3_0,
+              						"org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockAttributeFiller"
+
+
+    // $ANTLR start "entryRuleEntityMockAttributeByReference"
+    // InternalEntityMockDSL.g:4521:1: entryRuleEntityMockAttributeByReference returns [EObject current=null] : iv_ruleEntityMockAttributeByReference= ruleEntityMockAttributeByReference EOF ;
+    public final EObject entryRuleEntityMockAttributeByReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEntityMockAttributeByReference = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4521:71: (iv_ruleEntityMockAttributeByReference= ruleEntityMockAttributeByReference EOF )
+            // InternalEntityMockDSL.g:4522:2: iv_ruleEntityMockAttributeByReference= ruleEntityMockAttributeByReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEntityMockAttributeByReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleEntityMockAttributeByReference=ruleEntityMockAttributeByReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEntityMockAttributeByReference; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEntityMockAttributeByReference"
+
+
+    // $ANTLR start "ruleEntityMockAttributeByReference"
+    // InternalEntityMockDSL.g:4528:1: ruleEntityMockAttributeByReference returns [EObject current=null] : (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'to' (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) ) (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )? ) ;
+    public final EObject ruleEntityMockAttributeByReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token lv_optionalFor_6_0=null;
+        Token otherlv_7=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4534:2: ( (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'to' (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) ) (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )? ) )
+            // InternalEntityMockDSL.g:4535:2: (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'to' (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) ) (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )? )
+            {
+            // InternalEntityMockDSL.g:4535:2: (otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'to' (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) ) (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )? )
+            // InternalEntityMockDSL.g:4536:3: otherlv_0= 'ref' ( (otherlv_1= RULE_ID ) ) otherlv_2= 'to' (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) ) (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )?
+            {
+            otherlv_0=(Token)match(input,83,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getRefKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:4540:3: ( (otherlv_1= RULE_ID ) )
+            // InternalEntityMockDSL.g:4541:4: (otherlv_1= RULE_ID )
+            {
+            // InternalEntityMockDSL.g:4541:4: (otherlv_1= RULE_ID )
+            // InternalEntityMockDSL.g:4542:5: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+              					}
+              				
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_59); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getEntityMockAttributeByReferenceAccess().getAttributeRefLEntityReferenceCrossReference_1_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,67,FOLLOW_74); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEntityMockAttributeByReferenceAccess().getToKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:4557:3: (otherlv_3= 'existingEntities' | ( (otherlv_4= RULE_ID ) ) )
+            int alt74=2;
+            int LA74_0 = input.LA(1);
+
+            if ( (LA74_0==84) ) {
+                alt74=1;
+            }
+            else if ( (LA74_0==RULE_ID) ) {
+                alt74=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 74, 0, input);
+
+                throw nvae;
+            }
+            switch (alt74) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4558:4: otherlv_3= 'existingEntities'
+                    {
+                    otherlv_3=(Token)match(input,84,FOLLOW_75); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getEntityMockAttributeByReferenceAccess().getExistingEntitiesKeyword_3_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4563:4: ( (otherlv_4= RULE_ID ) )
+                    {
+                    // InternalEntityMockDSL.g:4563:4: ( (otherlv_4= RULE_ID ) )
+                    // InternalEntityMockDSL.g:4564:5: (otherlv_4= RULE_ID )
+                    {
+                    // InternalEntityMockDSL.g:4564:5: (otherlv_4= RULE_ID )
+                    // InternalEntityMockDSL.g:4565:6: otherlv_4= RULE_ID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+                      						}
+                      					
+                    }
+                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_75); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_4, grammarAccess.getEntityMockAttributeByReferenceAccess().getMockedEntityEntityMockEntityCrossReference_3_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:4577:3: (otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent' )?
+            int alt75=2;
+            int LA75_0 = input.LA(1);
+
+            if ( (LA75_0==85) ) {
+                alt75=1;
+            }
+            switch (alt75) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4578:4: otherlv_5= 'optionalFor' ( (lv_optionalFor_6_0= RULE_INT ) ) otherlv_7= 'percent'
+                    {
+                    otherlv_5=(Token)match(input,85,FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForKeyword_4_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:4582:4: ( (lv_optionalFor_6_0= RULE_INT ) )
+                    // InternalEntityMockDSL.g:4583:5: (lv_optionalFor_6_0= RULE_INT )
+                    {
+                    // InternalEntityMockDSL.g:4583:5: (lv_optionalFor_6_0= RULE_INT )
+                    // InternalEntityMockDSL.g:4584:6: lv_optionalFor_6_0= RULE_INT
+                    {
+                    lv_optionalFor_6_0=(Token)match(input,RULE_INT,FOLLOW_76); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_optionalFor_6_0, grammarAccess.getEntityMockAttributeByReferenceAccess().getOptionalForINTTerminalRuleCall_4_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getEntityMockAttributeByReferenceRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"optionalFor",
+                      							lv_optionalFor_6_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,86,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getEntityMockAttributeByReferenceAccess().getPercentKeyword_4_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEntityMockAttributeByReference"
+
+
+    // $ANTLR start "entryRuleSignedNumber"
+    // InternalEntityMockDSL.g:4609:1: entryRuleSignedNumber returns [String current=null] : iv_ruleSignedNumber= ruleSignedNumber EOF ;
+    public final String entryRuleSignedNumber() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleSignedNumber = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4609:52: (iv_ruleSignedNumber= ruleSignedNumber EOF )
+            // InternalEntityMockDSL.g:4610:2: iv_ruleSignedNumber= ruleSignedNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignedNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleSignedNumber=ruleSignedNumber();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignedNumber.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignedNumber"
+
+
+    // $ANTLR start "ruleSignedNumber"
+    // InternalEntityMockDSL.g:4616:1: ruleSignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber ) ;
+    public final AntlrDatatypeRuleToken ruleSignedNumber() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_UnsignedNumber_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4622:2: ( ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber ) )
+            // InternalEntityMockDSL.g:4623:2: ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber )
+            {
+            // InternalEntityMockDSL.g:4623:2: ( (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber )
+            // InternalEntityMockDSL.g:4624:3: (kw= '-' )? this_UnsignedNumber_1= ruleUnsignedNumber
+            {
+            // InternalEntityMockDSL.g:4624:3: (kw= '-' )?
+            int alt76=2;
+            int LA76_0 = input.LA(1);
+
+            if ( (LA76_0==77) ) {
+                alt76=1;
+            }
+            switch (alt76) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4625:4: kw= '-'
+                    {
+                    kw=(Token)match(input,77,FOLLOW_44); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getSignedNumberAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getSignedNumberAccess().getUnsignedNumberParserRuleCall_1());
+              		
+            }
+            pushFollow(FOLLOW_2);
+            this_UnsignedNumber_1=ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_UnsignedNumber_1);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			afterParserOrEnumRuleCall();
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignedNumber"
+
+
+    // $ANTLR start "entryRuleUnsignedNumber"
+    // InternalEntityMockDSL.g:4645:1: entryRuleUnsignedNumber returns [String current=null] : iv_ruleUnsignedNumber= ruleUnsignedNumber EOF ;
+    public final String entryRuleUnsignedNumber() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleUnsignedNumber = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4645:54: (iv_ruleUnsignedNumber= ruleUnsignedNumber EOF )
+            // InternalEntityMockDSL.g:4646:2: iv_ruleUnsignedNumber= ruleUnsignedNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnsignedNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleUnsignedNumber=ruleUnsignedNumber();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnsignedNumber.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnsignedNumber"
+
+
+    // $ANTLR start "ruleUnsignedNumber"
+    // InternalEntityMockDSL.g:4652:1: ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? ) ;
+    public final AntlrDatatypeRuleToken ruleUnsignedNumber() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_INT_0=null;
+        Token kw=null;
+        Token this_INT_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4658:2: ( (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? ) )
+            // InternalEntityMockDSL.g:4659:2: (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? )
+            {
+            // InternalEntityMockDSL.g:4659:2: (this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )? )
+            // InternalEntityMockDSL.g:4660:3: this_INT_0= RULE_INT (kw= '.' this_INT_2= RULE_INT )?
+            {
+            this_INT_0=(Token)match(input,RULE_INT,FOLLOW_31); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_0);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_0, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_0());
+              		
+            }
+            // InternalEntityMockDSL.g:4667:3: (kw= '.' this_INT_2= RULE_INT )?
+            int alt77=2;
+            int LA77_0 = input.LA(1);
+
+            if ( (LA77_0==34) ) {
+                alt77=1;
+            }
+            switch (alt77) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4668:4: kw= '.' this_INT_2= RULE_INT
+                    {
+                    kw=(Token)match(input,34,FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getUnsignedNumberAccess().getFullStopKeyword_1_0());
+                      			
+                    }
+                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_INT_2);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(this_INT_2, grammarAccess.getUnsignedNumberAccess().getINTTerminalRuleCall_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnsignedNumber"
+
+
+    // $ANTLR start "entryRuleSINT"
+    // InternalEntityMockDSL.g:4685:1: entryRuleSINT returns [String current=null] : iv_ruleSINT= ruleSINT EOF ;
+    public final String entryRuleSINT() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleSINT = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4685:44: (iv_ruleSINT= ruleSINT EOF )
+            // InternalEntityMockDSL.g:4686:2: iv_ruleSINT= ruleSINT EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSINTRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleSINT=ruleSINT();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSINT.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSINT"
+
+
+    // $ANTLR start "ruleSINT"
+    // InternalEntityMockDSL.g:4692:1: ruleSINT returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleSINT() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4698:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
+            // InternalEntityMockDSL.g:4699:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            {
+            // InternalEntityMockDSL.g:4699:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            // InternalEntityMockDSL.g:4700:3: (kw= '-' )? this_INT_1= RULE_INT
+            {
+            // InternalEntityMockDSL.g:4700:3: (kw= '-' )?
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==77) ) {
+                alt78=1;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4701:4: kw= '-'
+                    {
+                    kw=(Token)match(input,77,FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getSINTAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_1);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_1, grammarAccess.getSINTAccess().getINTTerminalRuleCall_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSINT"
+
+
+    // $ANTLR start "entryRuleXImportDeclaration"
+    // InternalEntityMockDSL.g:4718:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportDeclaration = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4718:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalEntityMockDSL.g:4719:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXImportDeclaration=ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXImportDeclaration; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXImportDeclaration"
+
+
+    // $ANTLR start "ruleXImportDeclaration"
+    // InternalEntityMockDSL.g:4725:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
+    public final EObject ruleXImportDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_static_2_0=null;
+        Token lv_extension_3_0=null;
+        Token lv_wildcard_5_0=null;
+        Token lv_fqnImport_9_0=null;
+        Token otherlv_11=null;
+        AntlrDatatypeRuleToken lv_memberName_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_importedNamespace_8_0 = null;
+
+        AntlrDatatypeRuleToken lv_importedFullyQualifiedName_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4731:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
+            // InternalEntityMockDSL.g:4732:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            {
+            // InternalEntityMockDSL.g:4732:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            // InternalEntityMockDSL.g:4733:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
+            {
+            // InternalEntityMockDSL.g:4733:3: ()
+            // InternalEntityMockDSL.g:4734:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,87,FOLLOW_77); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:4744:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
+            int alt81=4;
+            alt81 = dfa81.predict(input);
+            switch (alt81) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4745:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:4745:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalEntityMockDSL.g:4746:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    {
+                    // InternalEntityMockDSL.g:4746:5: ( (lv_static_2_0= 'static' ) )
+                    // InternalEntityMockDSL.g:4747:6: (lv_static_2_0= 'static' )
+                    {
+                    // InternalEntityMockDSL.g:4747:6: (lv_static_2_0= 'static' )
+                    // InternalEntityMockDSL.g:4748:7: lv_static_2_0= 'static'
+                    {
+                    lv_static_2_0=(Token)match(input,88,FOLLOW_78); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      							}
+                      							setWithLastConsumed(current, "static", true, "static");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:4760:5: ( (lv_extension_3_0= 'extension' ) )?
+                    int alt79=2;
+                    int LA79_0 = input.LA(1);
+
+                    if ( (LA79_0==89) ) {
+                        alt79=1;
+                    }
+                    switch (alt79) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:4761:6: (lv_extension_3_0= 'extension' )
+                            {
+                            // InternalEntityMockDSL.g:4761:6: (lv_extension_3_0= 'extension' )
+                            // InternalEntityMockDSL.g:4762:7: lv_extension_3_0= 'extension'
+                            {
+                            lv_extension_3_0=(Token)match(input,89,FOLLOW_78); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                              							}
+                              							setWithLastConsumed(current, "extension", true, "extension");
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalEntityMockDSL.g:4774:5: ( ( ruleQualifiedNameInStaticImport ) )
+                    // InternalEntityMockDSL.g:4775:6: ( ruleQualifiedNameInStaticImport )
+                    {
+                    // InternalEntityMockDSL.g:4775:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalEntityMockDSL.g:4776:7: ruleQualifiedNameInStaticImport
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_79);
+                    ruleQualifiedNameInStaticImport();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:4790:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    int alt80=2;
+                    int LA80_0 = input.LA(1);
+
+                    if ( (LA80_0==90) ) {
+                        alt80=1;
+                    }
+                    else if ( (LA80_0==RULE_ID) ) {
+                        alt80=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 80, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt80) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:4791:6: ( (lv_wildcard_5_0= '*' ) )
+                            {
+                            // InternalEntityMockDSL.g:4791:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalEntityMockDSL.g:4792:7: (lv_wildcard_5_0= '*' )
+                            {
+                            // InternalEntityMockDSL.g:4792:7: (lv_wildcard_5_0= '*' )
+                            // InternalEntityMockDSL.g:4793:8: lv_wildcard_5_0= '*'
+                            {
+                            lv_wildcard_5_0=(Token)match(input,90,FOLLOW_80); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                              								}
+                              								setWithLastConsumed(current, "wildcard", true, "*");
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:4806:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            {
+                            // InternalEntityMockDSL.g:4806:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalEntityMockDSL.g:4807:7: (lv_memberName_6_0= ruleValidID )
+                            {
+                            // InternalEntityMockDSL.g:4807:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalEntityMockDSL.g:4808:8: lv_memberName_6_0= ruleValidID
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_80);
+                            lv_memberName_6_0=ruleValidID();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                              								}
+                              								set(
+                              									current,
+                              									"memberName",
+                              									lv_memberName_6_0,
+                              									"org.eclipse.xtext.xbase.Xtype.ValidID");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:4828:4: ( ( ruleQualifiedName ) )
+                    {
+                    // InternalEntityMockDSL.g:4828:4: ( ( ruleQualifiedName ) )
+                    // InternalEntityMockDSL.g:4829:5: ( ruleQualifiedName )
+                    {
+                    // InternalEntityMockDSL.g:4829:5: ( ruleQualifiedName )
+                    // InternalEntityMockDSL.g:4830:6: ruleQualifiedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_80);
+                    ruleQualifiedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:4845:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    {
+                    // InternalEntityMockDSL.g:4845:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalEntityMockDSL.g:4846:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    {
+                    // InternalEntityMockDSL.g:4846:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalEntityMockDSL.g:4847:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_80);
+                    lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"importedNamespace",
+                      							lv_importedNamespace_8_0,
+                      							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:4865:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    {
+                    // InternalEntityMockDSL.g:4865:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalEntityMockDSL.g:4866:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    {
+                    // InternalEntityMockDSL.g:4866:5: ( (lv_fqnImport_9_0= 'ns' ) )
+                    // InternalEntityMockDSL.g:4867:6: (lv_fqnImport_9_0= 'ns' )
+                    {
+                    // InternalEntityMockDSL.g:4867:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalEntityMockDSL.g:4868:7: lv_fqnImport_9_0= 'ns'
+                    {
+                    lv_fqnImport_9_0=(Token)match(input,91,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      							}
+                      							setWithLastConsumed(current, "fqnImport", true, "ns");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:4880:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalEntityMockDSL.g:4881:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    {
+                    // InternalEntityMockDSL.g:4881:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalEntityMockDSL.g:4882:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_80);
+                    lv_importedFullyQualifiedName_10_0=ruleQualifiedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                      							}
+                      							set(
+                      								current,
+                      								"importedFullyQualifiedName",
+                      								lv_importedFullyQualifiedName_10_0,
+                      								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:4901:3: (otherlv_11= ';' )?
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==92) ) {
+                alt82=1;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4902:4: otherlv_11= ';'
+                    {
+                    otherlv_11=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXImportDeclaration"
+
+
+    // $ANTLR start "entryRuleXAnnotation"
+    // InternalEntityMockDSL.g:4911:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
+    public final EObject entryRuleXAnnotation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotation = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:4911:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
+            // InternalEntityMockDSL.g:4912:2: iv_ruleXAnnotation= ruleXAnnotation EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAnnotationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAnnotation=ruleXAnnotation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAnnotation; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAnnotation"
+
+
+    // $ANTLR start "ruleXAnnotation"
+    // InternalEntityMockDSL.g:4918:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
+    public final EObject ruleXAnnotation() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_8=null;
+        EObject lv_elementValuePairs_4_0 = null;
+
+        EObject lv_elementValuePairs_6_0 = null;
+
+        EObject lv_value_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:4924:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
+            // InternalEntityMockDSL.g:4925:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            {
+            // InternalEntityMockDSL.g:4925:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            // InternalEntityMockDSL.g:4926:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            {
+            // InternalEntityMockDSL.g:4926:3: ()
+            // InternalEntityMockDSL.g:4927:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,93,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:4937:3: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:4938:4: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:4938:4: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:4939:5: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXAnnotationRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
+              				
+            }
+            pushFollow(FOLLOW_23);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:4953:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            int alt85=2;
+            int LA85_0 = input.LA(1);
+
+            if ( (LA85_0==25) && (synpred1_InternalEntityMockDSL())) {
+                alt85=1;
+            }
+            switch (alt85) {
+                case 1 :
+                    // InternalEntityMockDSL.g:4954:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
+                    {
+                    // InternalEntityMockDSL.g:4954:4: ( ( '(' )=>otherlv_3= '(' )
+                    // InternalEntityMockDSL.g:4955:5: ( '(' )=>otherlv_3= '('
+                    {
+                    otherlv_3=(Token)match(input,25,FOLLOW_81); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:4961:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
+                    int alt84=3;
+                    alt84 = dfa84.predict(input);
+                    switch (alt84) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:4962:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            {
+                            // InternalEntityMockDSL.g:4962:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalEntityMockDSL.g:4963:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:4963:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
+                            // InternalEntityMockDSL.g:4964:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            {
+                            // InternalEntityMockDSL.g:4973:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalEntityMockDSL.g:4974:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_38);
+                            lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+                              								}
+                              								add(
+                              									current,
+                              									"elementValuePairs",
+                              									lv_elementValuePairs_4_0,
+                              									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:4991:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            loop83:
+                            do {
+                                int alt83=2;
+                                int LA83_0 = input.LA(1);
+
+                                if ( (LA83_0==26) ) {
+                                    alt83=1;
+                                }
+
+
+                                switch (alt83) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:4992:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    {
+                            	    otherlv_5=(Token)match(input,26,FOLLOW_4); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
+                            	      						
+                            	    }
+                            	    // InternalEntityMockDSL.g:4996:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalEntityMockDSL.g:4997:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    {
+                            	    // InternalEntityMockDSL.g:5006:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalEntityMockDSL.g:5007:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_38);
+                            	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"elementValuePairs",
+                            	      										lv_elementValuePairs_6_0,
+                            	      										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop83;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:5027:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            {
+                            // InternalEntityMockDSL.g:5027:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalEntityMockDSL.g:5028:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            {
+                            // InternalEntityMockDSL.g:5028:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalEntityMockDSL.g:5029:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_82);
+                            lv_value_7_0=ruleXAnnotationElementValueOrCommaList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXAnnotationRule());
+                              							}
+                              							set(
+                              								current,
+                              								"value",
+                              								lv_value_7_0,
+                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_8=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAnnotation"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValuePair"
+    // InternalEntityMockDSL.g:5056:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
+    public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValuePair = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5056:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
+            // InternalEntityMockDSL.g:5057:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAnnotationElementValuePair; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValuePair"
+
+
+    // $ANTLR start "ruleXAnnotationElementValuePair"
+    // InternalEntityMockDSL.g:5063:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
+    public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_value_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5069:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
+            // InternalEntityMockDSL.g:5070:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            {
+            // InternalEntityMockDSL.g:5070:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalEntityMockDSL.g:5071:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            {
+            // InternalEntityMockDSL.g:5071:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
+            // InternalEntityMockDSL.g:5072:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            {
+            // InternalEntityMockDSL.g:5081:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalEntityMockDSL.g:5082:5: ( ( ruleValidID ) ) otherlv_1= '='
+            {
+            // InternalEntityMockDSL.g:5082:5: ( ( ruleValidID ) )
+            // InternalEntityMockDSL.g:5083:6: ( ruleValidID )
+            {
+            // InternalEntityMockDSL.g:5083:6: ( ruleValidID )
+            // InternalEntityMockDSL.g:5084:7: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+
+              							if (current==null) {
+              								current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
+              							}
+              						
+            }
+            if ( state.backtracking==0 ) {
+
+              							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
+              						
+            }
+            pushFollow(FOLLOW_83);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              							afterParserOrEnumRuleCall();
+              						
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:5104:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalEntityMockDSL.g:5105:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            {
+            // InternalEntityMockDSL.g:5105:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalEntityMockDSL.g:5106:5: lv_value_2_0= ruleXAnnotationElementValue
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_value_2_0=ruleXAnnotationElementValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAnnotationElementValuePair"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
+    // InternalEntityMockDSL.g:5127:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
+    public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValueOrCommaList = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5127:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalEntityMockDSL.g:5128:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAnnotationElementValueOrCommaList; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValueOrCommaList"
+
+
+    // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
+    // InternalEntityMockDSL.g:5134:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
+    public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        EObject lv_elements_3_0 = null;
+
+        EObject lv_elements_5_0 = null;
+
+        EObject this_XAnnotationOrExpression_7 = null;
+
+        EObject lv_elements_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5140:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
+            // InternalEntityMockDSL.g:5141:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            {
+            // InternalEntityMockDSL.g:5141:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            int alt90=2;
+            alt90 = dfa90.predict(input);
+            switch (alt90) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5142:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    {
+                    // InternalEntityMockDSL.g:5142:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalEntityMockDSL.g:5143:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    {
+                    // InternalEntityMockDSL.g:5143:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalEntityMockDSL.g:5144:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    {
+                    // InternalEntityMockDSL.g:5151:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalEntityMockDSL.g:5152:6: () otherlv_1= '#' otherlv_2= '['
+                    {
+                    // InternalEntityMockDSL.g:5152:6: ()
+                    // InternalEntityMockDSL.g:5153:7: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							current = forceCreateModelElement(
+                      								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
+                      								current);
+                      						
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,95,FOLLOW_85); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
+                      					
+                    }
+                    otherlv_2=(Token)match(input,96,FOLLOW_86); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:5169:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt87=2;
+                    int LA87_0 = input.LA(1);
+
+                    if ( ((LA87_0>=RULE_ID && LA87_0<=RULE_DECIMAL)||LA87_0==14||LA87_0==25||LA87_0==77||(LA87_0>=87 && LA87_0<=89)||LA87_0==93||(LA87_0>=95 && LA87_0<=96)||LA87_0==103||LA87_0==119||LA87_0==123||LA87_0==129||LA87_0==131||(LA87_0>=135 && LA87_0<=137)||(LA87_0>=139 && LA87_0<=148)||LA87_0==150) ) {
+                        alt87=1;
+                    }
+                    switch (alt87) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:5170:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:5170:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalEntityMockDSL.g:5171:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            {
+                            // InternalEntityMockDSL.g:5171:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalEntityMockDSL.g:5172:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_87);
+                            lv_elements_3_0=ruleXAnnotationOrExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+                              							}
+                              							add(
+                              								current,
+                              								"elements",
+                              								lv_elements_3_0,
+                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:5189:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop86:
+                            do {
+                                int alt86=2;
+                                int LA86_0 = input.LA(1);
+
+                                if ( (LA86_0==26) ) {
+                                    alt86=1;
+                                }
+
+
+                                switch (alt86) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:5190:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_4=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalEntityMockDSL.g:5194:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalEntityMockDSL.g:5195:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalEntityMockDSL.g:5195:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalEntityMockDSL.g:5196:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_87);
+                            	    lv_elements_5_0=ruleXAnnotationOrExpression();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								if (current==null) {
+                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+                            	      								}
+                            	      								add(
+                            	      									current,
+                            	      									"elements",
+                            	      									lv_elements_5_0,
+                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+                            	      								afterParserOrEnumRuleCall();
+                            	      							
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop86;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_6=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5221:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    {
+                    // InternalEntityMockDSL.g:5221:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalEntityMockDSL.g:5222:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_88);
+                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XAnnotationOrExpression_7;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalEntityMockDSL.g:5230:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    int alt89=2;
+                    int LA89_0 = input.LA(1);
+
+                    if ( (LA89_0==26) ) {
+                        alt89=1;
+                    }
+                    switch (alt89) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:5231:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            {
+                            // InternalEntityMockDSL.g:5231:5: ()
+                            // InternalEntityMockDSL.g:5232:6: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						current = forceCreateModelElementAndAdd(
+                              							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
+                              							current);
+                              					
+                            }
+
+                            }
+
+                            // InternalEntityMockDSL.g:5238:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            int cnt88=0;
+                            loop88:
+                            do {
+                                int alt88=2;
+                                int LA88_0 = input.LA(1);
+
+                                if ( (LA88_0==26) ) {
+                                    alt88=1;
+                                }
+
+
+                                switch (alt88) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:5239:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_9=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalEntityMockDSL.g:5243:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalEntityMockDSL.g:5244:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalEntityMockDSL.g:5244:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalEntityMockDSL.g:5245:8: lv_elements_10_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_88);
+                            	    lv_elements_10_0=ruleXAnnotationOrExpression();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								if (current==null) {
+                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
+                            	      								}
+                            	      								add(
+                            	      									current,
+                            	      									"elements",
+                            	      									lv_elements_10_0,
+                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+                            	      								afterParserOrEnumRuleCall();
+                            	      							
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    if ( cnt88 >= 1 ) break loop88;
+                            	    if (state.backtracking>0) {state.failed=true; return current;}
+                                        EarlyExitException eee =
+                                            new EarlyExitException(88, input);
+                                        throw eee;
+                                }
+                                cnt88++;
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAnnotationElementValueOrCommaList"
+
+
+    // $ANTLR start "entryRuleXAnnotationElementValue"
+    // InternalEntityMockDSL.g:5269:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
+    public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationElementValue = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5269:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
+            // InternalEntityMockDSL.g:5270:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAnnotationElementValue; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAnnotationElementValue"
+
+
+    // $ANTLR start "ruleXAnnotationElementValue"
+    // InternalEntityMockDSL.g:5276:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
+    public final EObject ruleXAnnotationElementValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_elements_3_0 = null;
+
+        EObject lv_elements_5_0 = null;
+
+        EObject this_XAnnotationOrExpression_7 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5282:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
+            // InternalEntityMockDSL.g:5283:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            {
+            // InternalEntityMockDSL.g:5283:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            int alt93=2;
+            alt93 = dfa93.predict(input);
+            switch (alt93) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5284:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    {
+                    // InternalEntityMockDSL.g:5284:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalEntityMockDSL.g:5285:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    {
+                    // InternalEntityMockDSL.g:5285:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalEntityMockDSL.g:5286:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    {
+                    // InternalEntityMockDSL.g:5293:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalEntityMockDSL.g:5294:6: () otherlv_1= '#' otherlv_2= '['
+                    {
+                    // InternalEntityMockDSL.g:5294:6: ()
+                    // InternalEntityMockDSL.g:5295:7: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							current = forceCreateModelElement(
+                      								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
+                      								current);
+                      						
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,95,FOLLOW_85); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
+                      					
+                    }
+                    otherlv_2=(Token)match(input,96,FOLLOW_86); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:5311:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt92=2;
+                    int LA92_0 = input.LA(1);
+
+                    if ( ((LA92_0>=RULE_ID && LA92_0<=RULE_DECIMAL)||LA92_0==14||LA92_0==25||LA92_0==77||(LA92_0>=87 && LA92_0<=89)||LA92_0==93||(LA92_0>=95 && LA92_0<=96)||LA92_0==103||LA92_0==119||LA92_0==123||LA92_0==129||LA92_0==131||(LA92_0>=135 && LA92_0<=137)||(LA92_0>=139 && LA92_0<=148)||LA92_0==150) ) {
+                        alt92=1;
+                    }
+                    switch (alt92) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:5312:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:5312:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalEntityMockDSL.g:5313:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            {
+                            // InternalEntityMockDSL.g:5313:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalEntityMockDSL.g:5314:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_87);
+                            lv_elements_3_0=ruleXAnnotationOrExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+                              							}
+                              							add(
+                              								current,
+                              								"elements",
+                              								lv_elements_3_0,
+                              								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:5331:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop91:
+                            do {
+                                int alt91=2;
+                                int LA91_0 = input.LA(1);
+
+                                if ( (LA91_0==26) ) {
+                                    alt91=1;
+                                }
+
+
+                                switch (alt91) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:5332:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    {
+                            	    otherlv_4=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalEntityMockDSL.g:5336:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalEntityMockDSL.g:5337:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    {
+                            	    // InternalEntityMockDSL.g:5337:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalEntityMockDSL.g:5338:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_87);
+                            	    lv_elements_5_0=ruleXAnnotationOrExpression();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								if (current==null) {
+                            	      									current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
+                            	      								}
+                            	      								add(
+                            	      									current,
+                            	      									"elements",
+                            	      									lv_elements_5_0,
+                            	      									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
+                            	      								afterParserOrEnumRuleCall();
+                            	      							
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop91;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_6=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5363:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XAnnotationOrExpression_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAnnotationElementValue"
+
+
+    // $ANTLR start "entryRuleXAnnotationOrExpression"
+    // InternalEntityMockDSL.g:5375:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
+    public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAnnotationOrExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5375:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
+            // InternalEntityMockDSL.g:5376:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAnnotationOrExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAnnotationOrExpression"
+
+
+    // $ANTLR start "ruleXAnnotationOrExpression"
+    // InternalEntityMockDSL.g:5382:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
+    public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XAnnotation_0 = null;
+
+        EObject this_XExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5388:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
+            // InternalEntityMockDSL.g:5389:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:5389:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            int alt94=2;
+            int LA94_0 = input.LA(1);
+
+            if ( (LA94_0==93) ) {
+                alt94=1;
+            }
+            else if ( ((LA94_0>=RULE_ID && LA94_0<=RULE_DECIMAL)||LA94_0==14||LA94_0==25||LA94_0==77||(LA94_0>=87 && LA94_0<=89)||(LA94_0>=95 && LA94_0<=96)||LA94_0==103||LA94_0==119||LA94_0==123||LA94_0==129||LA94_0==131||(LA94_0>=135 && LA94_0<=137)||(LA94_0>=139 && LA94_0<=148)||LA94_0==150) ) {
+                alt94=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 94, 0, input);
+
+                throw nvae;
+            }
+            switch (alt94) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5390:3: this_XAnnotation_0= ruleXAnnotation
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XAnnotation_0=ruleXAnnotation();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XAnnotation_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5399:3: this_XExpression_1= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XExpression_1=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAnnotationOrExpression"
+
+
+    // $ANTLR start "entryRuleXExpression"
+    // InternalEntityMockDSL.g:5411:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
+    public final EObject entryRuleXExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5411:52: (iv_ruleXExpression= ruleXExpression EOF )
+            // InternalEntityMockDSL.g:5412:2: iv_ruleXExpression= ruleXExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXExpression=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXExpression"
+
+
+    // $ANTLR start "ruleXExpression"
+    // InternalEntityMockDSL.g:5418:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
+    public final EObject ruleXExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XAssignment_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5424:2: (this_XAssignment_0= ruleXAssignment )
+            // InternalEntityMockDSL.g:5425:2: this_XAssignment_0= ruleXAssignment
+            {
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
+              	
+            }
+            pushFollow(FOLLOW_2);
+            this_XAssignment_0=ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_XAssignment_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXExpression"
+
+
+    // $ANTLR start "entryRuleXAssignment"
+    // InternalEntityMockDSL.g:5436:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
+    public final EObject entryRuleXAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAssignment = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5436:52: (iv_ruleXAssignment= ruleXAssignment EOF )
+            // InternalEntityMockDSL.g:5437:2: iv_ruleXAssignment= ruleXAssignment EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAssignmentRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAssignment=ruleXAssignment();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAssignment; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAssignment"
+
+
+    // $ANTLR start "ruleXAssignment"
+    // InternalEntityMockDSL.g:5443:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
+    public final EObject ruleXAssignment() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_value_3_0 = null;
+
+        EObject this_XOrExpression_4 = null;
+
+        EObject lv_rightOperand_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5449:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
+            // InternalEntityMockDSL.g:5450:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            {
+            // InternalEntityMockDSL.g:5450:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            int alt96=2;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                int LA96_1 = input.LA(2);
+
+                if ( (LA96_1==94) ) {
+                    alt96=1;
+                }
+                else if ( (LA96_1==EOF||(LA96_1>=RULE_ID && LA96_1<=RULE_DECIMAL)||(LA96_1>=14 && LA96_1<=15)||(LA96_1>=25 && LA96_1<=27)||LA96_1==31||LA96_1==34||(LA96_1>=77 && LA96_1<=78)||(LA96_1>=87 && LA96_1<=90)||LA96_1==92||(LA96_1>=95 && LA96_1<=127)||(LA96_1>=129 && LA96_1<=151)) ) {
+                    alt96=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 96, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 139:
+                {
+                int LA96_2 = input.LA(2);
+
+                if ( (LA96_2==94) ) {
+                    alt96=1;
+                }
+                else if ( (LA96_2==EOF||(LA96_2>=RULE_ID && LA96_2<=RULE_DECIMAL)||(LA96_2>=14 && LA96_2<=15)||(LA96_2>=25 && LA96_2<=27)||LA96_2==31||LA96_2==34||(LA96_2>=77 && LA96_2<=78)||(LA96_2>=87 && LA96_2<=90)||LA96_2==92||(LA96_2>=95 && LA96_2<=127)||(LA96_2>=129 && LA96_2<=151)) ) {
+                    alt96=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 96, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 88:
+                {
+                int LA96_3 = input.LA(2);
+
+                if ( (LA96_3==94) ) {
+                    alt96=1;
+                }
+                else if ( (LA96_3==EOF||(LA96_3>=RULE_ID && LA96_3<=RULE_DECIMAL)||(LA96_3>=14 && LA96_3<=15)||(LA96_3>=25 && LA96_3<=27)||LA96_3==31||LA96_3==34||(LA96_3>=77 && LA96_3<=78)||(LA96_3>=87 && LA96_3<=90)||LA96_3==92||(LA96_3>=95 && LA96_3<=127)||(LA96_3>=129 && LA96_3<=151)) ) {
+                    alt96=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 96, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 87:
+                {
+                int LA96_4 = input.LA(2);
+
+                if ( (LA96_4==94) ) {
+                    alt96=1;
+                }
+                else if ( (LA96_4==EOF||(LA96_4>=RULE_ID && LA96_4<=RULE_DECIMAL)||(LA96_4>=14 && LA96_4<=15)||(LA96_4>=25 && LA96_4<=27)||LA96_4==31||LA96_4==34||(LA96_4>=77 && LA96_4<=78)||(LA96_4>=87 && LA96_4<=90)||LA96_4==92||(LA96_4>=95 && LA96_4<=127)||(LA96_4>=129 && LA96_4<=151)) ) {
+                    alt96=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 96, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 89:
+                {
+                int LA96_5 = input.LA(2);
+
+                if ( (LA96_5==EOF||(LA96_5>=RULE_ID && LA96_5<=RULE_DECIMAL)||(LA96_5>=14 && LA96_5<=15)||(LA96_5>=25 && LA96_5<=27)||LA96_5==31||LA96_5==34||(LA96_5>=77 && LA96_5<=78)||(LA96_5>=87 && LA96_5<=90)||LA96_5==92||(LA96_5>=95 && LA96_5<=127)||(LA96_5>=129 && LA96_5<=151)) ) {
+                    alt96=2;
+                }
+                else if ( (LA96_5==94) ) {
+                    alt96=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 96, 5, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case RULE_STRING:
+            case RULE_INT:
+            case RULE_HEX:
+            case RULE_DECIMAL:
+            case 14:
+            case 25:
+            case 77:
+            case 95:
+            case 96:
+            case 103:
+            case 119:
+            case 123:
+            case 129:
+            case 131:
+            case 135:
+            case 136:
+            case 137:
+            case 140:
+            case 141:
+            case 142:
+            case 143:
+            case 144:
+            case 145:
+            case 146:
+            case 147:
+            case 148:
+            case 150:
+                {
+                alt96=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 96, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt96) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5451:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    {
+                    // InternalEntityMockDSL.g:5451:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalEntityMockDSL.g:5452:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
+                    {
+                    // InternalEntityMockDSL.g:5452:4: ()
+                    // InternalEntityMockDSL.g:5453:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:5459:4: ( ( ruleFeatureCallID ) )
+                    // InternalEntityMockDSL.g:5460:5: ( ruleFeatureCallID )
+                    {
+                    // InternalEntityMockDSL.g:5460:5: ( ruleFeatureCallID )
+                    // InternalEntityMockDSL.g:5461:6: ruleFeatureCallID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXAssignmentRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_83);
+                    ruleFeatureCallID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
+                      			
+                    }
+                    pushFollow(FOLLOW_84);
+                    ruleOpSingleAssign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalEntityMockDSL.g:5482:4: ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalEntityMockDSL.g:5483:5: (lv_value_3_0= ruleXAssignment )
+                    {
+                    // InternalEntityMockDSL.g:5483:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalEntityMockDSL.g:5484:6: lv_value_3_0= ruleXAssignment
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_value_3_0=ruleXAssignment();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+                      						}
+                      						set(
+                      							current,
+                      							"value",
+                      							lv_value_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XAssignment");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5503:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    {
+                    // InternalEntityMockDSL.g:5503:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalEntityMockDSL.g:5504:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_89);
+                    this_XOrExpression_4=ruleXOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XOrExpression_4;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalEntityMockDSL.g:5512:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    int alt95=2;
+                    alt95 = dfa95.predict(input);
+                    switch (alt95) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:5513:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            {
+                            // InternalEntityMockDSL.g:5513:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
+                            // InternalEntityMockDSL.g:5514:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
+                            {
+                            // InternalEntityMockDSL.g:5524:6: ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalEntityMockDSL.g:5525:7: () ( ( ruleOpMultiAssign ) )
+                            {
+                            // InternalEntityMockDSL.g:5525:7: ()
+                            // InternalEntityMockDSL.g:5526:8: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								current = forceCreateModelElementAndSet(
+                              									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+                              									current);
+                              							
+                            }
+
+                            }
+
+                            // InternalEntityMockDSL.g:5532:7: ( ( ruleOpMultiAssign ) )
+                            // InternalEntityMockDSL.g:5533:8: ( ruleOpMultiAssign )
+                            {
+                            // InternalEntityMockDSL.g:5533:8: ( ruleOpMultiAssign )
+                            // InternalEntityMockDSL.g:5534:9: ruleOpMultiAssign
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									if (current==null) {
+                              										current = createModelElement(grammarAccess.getXAssignmentRule());
+                              									}
+                              								
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+                              								
+                            }
+                            pushFollow(FOLLOW_84);
+                            ruleOpMultiAssign();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              									afterParserOrEnumRuleCall();
+                              								
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:5550:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalEntityMockDSL.g:5551:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            {
+                            // InternalEntityMockDSL.g:5551:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalEntityMockDSL.g:5552:7: lv_rightOperand_7_0= ruleXAssignment
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_2);
+                            lv_rightOperand_7_0=ruleXAssignment();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXAssignmentRule());
+                              							}
+                              							set(
+                              								current,
+                              								"rightOperand",
+                              								lv_rightOperand_7_0,
+                              								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAssignment"
+
+
+    // $ANTLR start "entryRuleOpSingleAssign"
+    // InternalEntityMockDSL.g:5575:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
+    public final String entryRuleOpSingleAssign() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpSingleAssign = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5575:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
+            // InternalEntityMockDSL.g:5576:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpSingleAssign=ruleOpSingleAssign();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpSingleAssign.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpSingleAssign"
+
+
+    // $ANTLR start "ruleOpSingleAssign"
+    // InternalEntityMockDSL.g:5582:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
+    public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5588:2: (kw= '=' )
+            // InternalEntityMockDSL.g:5589:2: kw= '='
+            {
+            kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(kw);
+              		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpSingleAssign"
+
+
+    // $ANTLR start "entryRuleOpMultiAssign"
+    // InternalEntityMockDSL.g:5597:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
+    public final String entryRuleOpMultiAssign() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpMultiAssign = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5597:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
+            // InternalEntityMockDSL.g:5598:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpMultiAssign=ruleOpMultiAssign();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpMultiAssign.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpMultiAssign"
+
+
+    // $ANTLR start "ruleOpMultiAssign"
+    // InternalEntityMockDSL.g:5604:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
+    public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5610:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
+            // InternalEntityMockDSL.g:5611:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            {
+            // InternalEntityMockDSL.g:5611:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            int alt98=7;
+            switch ( input.LA(1) ) {
+            case 98:
+                {
+                alt98=1;
+                }
+                break;
+            case 99:
+                {
+                alt98=2;
+                }
+                break;
+            case 100:
+                {
+                alt98=3;
+                }
+                break;
+            case 101:
+                {
+                alt98=4;
+                }
+                break;
+            case 102:
+                {
+                alt98=5;
+                }
+                break;
+            case 103:
+                {
+                alt98=6;
+                }
+                break;
+            case 104:
+                {
+                alt98=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 98, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt98) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5612:3: kw= '+='
+                    {
+                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:5618:3: kw= '-='
+                    {
+                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:5624:3: kw= '*='
+                    {
+                    kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:5630:3: kw= '/='
+                    {
+                    kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:5636:3: kw= '%='
+                    {
+                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:5642:3: (kw= '<' kw= '<' kw= '=' )
+                    {
+                    // InternalEntityMockDSL.g:5642:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalEntityMockDSL.g:5643:4: kw= '<' kw= '<' kw= '='
+                    {
+                    kw=(Token)match(input,103,FOLLOW_90); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
+                      			
+                    }
+                    kw=(Token)match(input,103,FOLLOW_83); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
+                      			
+                    }
+                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:5660:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    {
+                    // InternalEntityMockDSL.g:5660:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalEntityMockDSL.g:5661:4: kw= '>' (kw= '>' )? kw= '>='
+                    {
+                    kw=(Token)match(input,104,FOLLOW_91); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:5666:4: (kw= '>' )?
+                    int alt97=2;
+                    int LA97_0 = input.LA(1);
+
+                    if ( (LA97_0==104) ) {
+                        alt97=1;
+                    }
+                    switch (alt97) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:5667:5: kw= '>'
+                            {
+                            kw=(Token)match(input,104,FOLLOW_92); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpMultiAssign"
+
+
+    // $ANTLR start "entryRuleXOrExpression"
+    // InternalEntityMockDSL.g:5683:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
+    public final EObject entryRuleXOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXOrExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5683:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
+            // InternalEntityMockDSL.g:5684:2: iv_ruleXOrExpression= ruleXOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXOrExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXOrExpression=ruleXOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXOrExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXOrExpression"
+
+
+    // $ANTLR start "ruleXOrExpression"
+    // InternalEntityMockDSL.g:5690:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
+    public final EObject ruleXOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XAndExpression_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5696:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
+            // InternalEntityMockDSL.g:5697:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            {
+            // InternalEntityMockDSL.g:5697:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalEntityMockDSL.g:5698:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_93);
+            this_XAndExpression_0=ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:5706:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            loop99:
+            do {
+                int alt99=2;
+                int LA99_0 = input.LA(1);
+
+                if ( (LA99_0==106) ) {
+                    int LA99_2 = input.LA(2);
+
+                    if ( (synpred8_InternalEntityMockDSL()) ) {
+                        alt99=1;
+                    }
+
+
+                }
+
+
+                switch (alt99) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5707:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5707:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
+            	    // InternalEntityMockDSL.g:5708:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5718:5: ( () ( ( ruleOpOr ) ) )
+            	    // InternalEntityMockDSL.g:5719:6: () ( ( ruleOpOr ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5719:6: ()
+            	    // InternalEntityMockDSL.g:5720:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5726:6: ( ( ruleOpOr ) )
+            	    // InternalEntityMockDSL.g:5727:7: ( ruleOpOr )
+            	    {
+            	    // InternalEntityMockDSL.g:5727:7: ( ruleOpOr )
+            	    // InternalEntityMockDSL.g:5728:8: ruleOpOr
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXOrExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpOr();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5744:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalEntityMockDSL.g:5745:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:5745:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalEntityMockDSL.g:5746:6: lv_rightOperand_3_0= ruleXAndExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_93);
+            	    lv_rightOperand_3_0=ruleXAndExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop99;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXOrExpression"
+
+
+    // $ANTLR start "entryRuleOpOr"
+    // InternalEntityMockDSL.g:5768:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
+    public final String entryRuleOpOr() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpOr = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5768:44: (iv_ruleOpOr= ruleOpOr EOF )
+            // InternalEntityMockDSL.g:5769:2: iv_ruleOpOr= ruleOpOr EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpOrRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpOr=ruleOpOr();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpOr.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpOr"
+
+
+    // $ANTLR start "ruleOpOr"
+    // InternalEntityMockDSL.g:5775:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
+    public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5781:2: (kw= '||' )
+            // InternalEntityMockDSL.g:5782:2: kw= '||'
+            {
+            kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(kw);
+              		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpOr"
+
+
+    // $ANTLR start "entryRuleXAndExpression"
+    // InternalEntityMockDSL.g:5790:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
+    public final EObject entryRuleXAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAndExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5790:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
+            // InternalEntityMockDSL.g:5791:2: iv_ruleXAndExpression= ruleXAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAndExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAndExpression=ruleXAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAndExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAndExpression"
+
+
+    // $ANTLR start "ruleXAndExpression"
+    // InternalEntityMockDSL.g:5797:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
+    public final EObject ruleXAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XEqualityExpression_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5803:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
+            // InternalEntityMockDSL.g:5804:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            {
+            // InternalEntityMockDSL.g:5804:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalEntityMockDSL.g:5805:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_94);
+            this_XEqualityExpression_0=ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XEqualityExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:5813:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            loop100:
+            do {
+                int alt100=2;
+                int LA100_0 = input.LA(1);
+
+                if ( (LA100_0==107) ) {
+                    int LA100_2 = input.LA(2);
+
+                    if ( (synpred9_InternalEntityMockDSL()) ) {
+                        alt100=1;
+                    }
+
+
+                }
+
+
+                switch (alt100) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5814:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5814:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
+            	    // InternalEntityMockDSL.g:5815:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5825:5: ( () ( ( ruleOpAnd ) ) )
+            	    // InternalEntityMockDSL.g:5826:6: () ( ( ruleOpAnd ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5826:6: ()
+            	    // InternalEntityMockDSL.g:5827:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5833:6: ( ( ruleOpAnd ) )
+            	    // InternalEntityMockDSL.g:5834:7: ( ruleOpAnd )
+            	    {
+            	    // InternalEntityMockDSL.g:5834:7: ( ruleOpAnd )
+            	    // InternalEntityMockDSL.g:5835:8: ruleOpAnd
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXAndExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpAnd();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5851:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalEntityMockDSL.g:5852:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:5852:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalEntityMockDSL.g:5853:6: lv_rightOperand_3_0= ruleXEqualityExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_94);
+            	    lv_rightOperand_3_0=ruleXEqualityExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop100;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAndExpression"
+
+
+    // $ANTLR start "entryRuleOpAnd"
+    // InternalEntityMockDSL.g:5875:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
+    public final String entryRuleOpAnd() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpAnd = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5875:45: (iv_ruleOpAnd= ruleOpAnd EOF )
+            // InternalEntityMockDSL.g:5876:2: iv_ruleOpAnd= ruleOpAnd EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpAndRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpAnd=ruleOpAnd();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpAnd.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpAnd"
+
+
+    // $ANTLR start "ruleOpAnd"
+    // InternalEntityMockDSL.g:5882:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
+    public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5888:2: (kw= '&&' )
+            // InternalEntityMockDSL.g:5889:2: kw= '&&'
+            {
+            kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(kw);
+              		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpAnd"
+
+
+    // $ANTLR start "entryRuleXEqualityExpression"
+    // InternalEntityMockDSL.g:5897:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
+    public final EObject entryRuleXEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXEqualityExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5897:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
+            // InternalEntityMockDSL.g:5898:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXEqualityExpression=ruleXEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXEqualityExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXEqualityExpression"
+
+
+    // $ANTLR start "ruleXEqualityExpression"
+    // InternalEntityMockDSL.g:5904:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
+    public final EObject ruleXEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XRelationalExpression_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5910:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
+            // InternalEntityMockDSL.g:5911:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            {
+            // InternalEntityMockDSL.g:5911:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalEntityMockDSL.g:5912:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_95);
+            this_XRelationalExpression_0=ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XRelationalExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:5920:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            loop101:
+            do {
+                int alt101=2;
+                switch ( input.LA(1) ) {
+                case 108:
+                    {
+                    int LA101_2 = input.LA(2);
+
+                    if ( (synpred10_InternalEntityMockDSL()) ) {
+                        alt101=1;
+                    }
+
+
+                    }
+                    break;
+                case 109:
+                    {
+                    int LA101_3 = input.LA(2);
+
+                    if ( (synpred10_InternalEntityMockDSL()) ) {
+                        alt101=1;
+                    }
+
+
+                    }
+                    break;
+                case 110:
+                    {
+                    int LA101_4 = input.LA(2);
+
+                    if ( (synpred10_InternalEntityMockDSL()) ) {
+                        alt101=1;
+                    }
+
+
+                    }
+                    break;
+                case 111:
+                    {
+                    int LA101_5 = input.LA(2);
+
+                    if ( (synpred10_InternalEntityMockDSL()) ) {
+                        alt101=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt101) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:5921:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5921:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
+            	    // InternalEntityMockDSL.g:5922:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5932:5: ( () ( ( ruleOpEquality ) ) )
+            	    // InternalEntityMockDSL.g:5933:6: () ( ( ruleOpEquality ) )
+            	    {
+            	    // InternalEntityMockDSL.g:5933:6: ()
+            	    // InternalEntityMockDSL.g:5934:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5940:6: ( ( ruleOpEquality ) )
+            	    // InternalEntityMockDSL.g:5941:7: ( ruleOpEquality )
+            	    {
+            	    // InternalEntityMockDSL.g:5941:7: ( ruleOpEquality )
+            	    // InternalEntityMockDSL.g:5942:8: ruleOpEquality
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXEqualityExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpEquality();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:5958:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalEntityMockDSL.g:5959:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:5959:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalEntityMockDSL.g:5960:6: lv_rightOperand_3_0= ruleXRelationalExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_95);
+            	    lv_rightOperand_3_0=ruleXRelationalExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop101;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXEqualityExpression"
+
+
+    // $ANTLR start "entryRuleOpEquality"
+    // InternalEntityMockDSL.g:5982:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
+    public final String entryRuleOpEquality() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpEquality = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:5982:50: (iv_ruleOpEquality= ruleOpEquality EOF )
+            // InternalEntityMockDSL.g:5983:2: iv_ruleOpEquality= ruleOpEquality EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpEqualityRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpEquality=ruleOpEquality();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpEquality.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpEquality"
+
+
+    // $ANTLR start "ruleOpEquality"
+    // InternalEntityMockDSL.g:5989:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
+    public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:5995:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
+            // InternalEntityMockDSL.g:5996:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            {
+            // InternalEntityMockDSL.g:5996:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            int alt102=4;
+            switch ( input.LA(1) ) {
+            case 108:
+                {
+                alt102=1;
+                }
+                break;
+            case 109:
+                {
+                alt102=2;
+                }
+                break;
+            case 110:
+                {
+                alt102=3;
+                }
+                break;
+            case 111:
+                {
+                alt102=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 102, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt102) {
+                case 1 :
+                    // InternalEntityMockDSL.g:5997:3: kw= '=='
+                    {
+                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6003:3: kw= '!='
+                    {
+                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:6009:3: kw= '==='
+                    {
+                    kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:6015:3: kw= '!=='
+                    {
+                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpEquality"
+
+
+    // $ANTLR start "entryRuleXRelationalExpression"
+    // InternalEntityMockDSL.g:6024:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
+    public final EObject entryRuleXRelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXRelationalExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6024:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
+            // InternalEntityMockDSL.g:6025:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXRelationalExpression=ruleXRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXRelationalExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXRelationalExpression"
+
+
+    // $ANTLR start "ruleXRelationalExpression"
+    // InternalEntityMockDSL.g:6031:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
+    public final EObject ruleXRelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject this_XOtherOperatorExpression_0 = null;
+
+        EObject lv_type_3_0 = null;
+
+        EObject lv_rightOperand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6037:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
+            // InternalEntityMockDSL.g:6038:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            {
+            // InternalEntityMockDSL.g:6038:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalEntityMockDSL.g:6039:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_96);
+            this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XOtherOperatorExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6047:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            loop103:
+            do {
+                int alt103=3;
+                switch ( input.LA(1) ) {
+                case 103:
+                    {
+                    int LA103_2 = input.LA(2);
+
+                    if ( (synpred12_InternalEntityMockDSL()) ) {
+                        alt103=2;
+                    }
+
+
+                    }
+                    break;
+                case 104:
+                    {
+                    int LA103_3 = input.LA(2);
+
+                    if ( (synpred12_InternalEntityMockDSL()) ) {
+                        alt103=2;
+                    }
+
+
+                    }
+                    break;
+                case 112:
+                    {
+                    int LA103_4 = input.LA(2);
+
+                    if ( (synpred11_InternalEntityMockDSL()) ) {
+                        alt103=1;
+                    }
+
+
+                    }
+                    break;
+                case 105:
+                    {
+                    int LA103_5 = input.LA(2);
+
+                    if ( (synpred12_InternalEntityMockDSL()) ) {
+                        alt103=2;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt103) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6048:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6048:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalEntityMockDSL.g:6049:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6049:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
+            	    // InternalEntityMockDSL.g:6050:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
+            	    {
+            	    // InternalEntityMockDSL.g:6056:6: ( () otherlv_2= 'instanceof' )
+            	    // InternalEntityMockDSL.g:6057:7: () otherlv_2= 'instanceof'
+            	    {
+            	    // InternalEntityMockDSL.g:6057:7: ()
+            	    // InternalEntityMockDSL.g:6058:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,112,FOLLOW_39); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6070:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalEntityMockDSL.g:6071:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    {
+            	    // InternalEntityMockDSL.g:6071:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalEntityMockDSL.g:6072:7: lv_type_3_0= ruleJvmTypeReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_96);
+            	    lv_type_3_0=ruleJvmTypeReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"type",
+            	      								lv_type_3_0,
+            	      								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalEntityMockDSL.g:6091:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6091:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalEntityMockDSL.g:6092:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6092:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
+            	    // InternalEntityMockDSL.g:6093:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6103:6: ( () ( ( ruleOpCompare ) ) )
+            	    // InternalEntityMockDSL.g:6104:7: () ( ( ruleOpCompare ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6104:7: ()
+            	    // InternalEntityMockDSL.g:6105:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6111:7: ( ( ruleOpCompare ) )
+            	    // InternalEntityMockDSL.g:6112:8: ( ruleOpCompare )
+            	    {
+            	    // InternalEntityMockDSL.g:6112:8: ( ruleOpCompare )
+            	    // InternalEntityMockDSL.g:6113:9: ruleOpCompare
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      									if (current==null) {
+            	      										current = createModelElement(grammarAccess.getXRelationalExpressionRule());
+            	      									}
+            	      								
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
+            	      								
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpCompare();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									afterParserOrEnumRuleCall();
+            	      								
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6129:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalEntityMockDSL.g:6130:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:6130:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalEntityMockDSL.g:6131:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_96);
+            	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"rightOperand",
+            	      								lv_rightOperand_6_0,
+            	      								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop103;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXRelationalExpression"
+
+
+    // $ANTLR start "entryRuleOpCompare"
+    // InternalEntityMockDSL.g:6154:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
+    public final String entryRuleOpCompare() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpCompare = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6154:49: (iv_ruleOpCompare= ruleOpCompare EOF )
+            // InternalEntityMockDSL.g:6155:2: iv_ruleOpCompare= ruleOpCompare EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpCompareRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpCompare=ruleOpCompare();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpCompare.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpCompare"
+
+
+    // $ANTLR start "ruleOpCompare"
+    // InternalEntityMockDSL.g:6161:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
+    public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6167:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
+            // InternalEntityMockDSL.g:6168:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            {
+            // InternalEntityMockDSL.g:6168:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            int alt104=4;
+            switch ( input.LA(1) ) {
+            case 105:
+                {
+                alt104=1;
+                }
+                break;
+            case 103:
+                {
+                int LA104_2 = input.LA(2);
+
+                if ( (LA104_2==EOF||(LA104_2>=RULE_ID && LA104_2<=RULE_DECIMAL)||LA104_2==14||LA104_2==25||LA104_2==77||(LA104_2>=87 && LA104_2<=89)||(LA104_2>=95 && LA104_2<=96)||LA104_2==103||LA104_2==119||LA104_2==123||LA104_2==129||LA104_2==131||(LA104_2>=135 && LA104_2<=137)||(LA104_2>=139 && LA104_2<=148)||LA104_2==150) ) {
+                    alt104=4;
+                }
+                else if ( (LA104_2==94) ) {
+                    alt104=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 104, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 104:
+                {
+                alt104=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 104, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt104) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6169:3: kw= '>='
+                    {
+                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6175:3: (kw= '<' kw= '=' )
+                    {
+                    // InternalEntityMockDSL.g:6175:3: (kw= '<' kw= '=' )
+                    // InternalEntityMockDSL.g:6176:4: kw= '<' kw= '='
+                    {
+                    kw=(Token)match(input,103,FOLLOW_83); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:6188:3: kw= '>'
+                    {
+                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:6194:3: kw= '<'
+                    {
+                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpCompare"
+
+
+    // $ANTLR start "entryRuleXOtherOperatorExpression"
+    // InternalEntityMockDSL.g:6203:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
+    public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXOtherOperatorExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6203:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
+            // InternalEntityMockDSL.g:6204:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXOtherOperatorExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXOtherOperatorExpression"
+
+
+    // $ANTLR start "ruleXOtherOperatorExpression"
+    // InternalEntityMockDSL.g:6210:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
+    public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XAdditiveExpression_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6216:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
+            // InternalEntityMockDSL.g:6217:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            {
+            // InternalEntityMockDSL.g:6217:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalEntityMockDSL.g:6218:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_97);
+            this_XAdditiveExpression_0=ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XAdditiveExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6226:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            loop105:
+            do {
+                int alt105=2;
+                alt105 = dfa105.predict(input);
+                switch (alt105) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6227:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6227:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
+            	    // InternalEntityMockDSL.g:6228:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6238:5: ( () ( ( ruleOpOther ) ) )
+            	    // InternalEntityMockDSL.g:6239:6: () ( ( ruleOpOther ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6239:6: ()
+            	    // InternalEntityMockDSL.g:6240:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6246:6: ( ( ruleOpOther ) )
+            	    // InternalEntityMockDSL.g:6247:7: ( ruleOpOther )
+            	    {
+            	    // InternalEntityMockDSL.g:6247:7: ( ruleOpOther )
+            	    // InternalEntityMockDSL.g:6248:8: ruleOpOther
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpOther();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6264:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalEntityMockDSL.g:6265:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:6265:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalEntityMockDSL.g:6266:6: lv_rightOperand_3_0= ruleXAdditiveExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_97);
+            	    lv_rightOperand_3_0=ruleXAdditiveExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop105;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXOtherOperatorExpression"
+
+
+    // $ANTLR start "entryRuleOpOther"
+    // InternalEntityMockDSL.g:6288:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
+    public final String entryRuleOpOther() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpOther = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6288:47: (iv_ruleOpOther= ruleOpOther EOF )
+            // InternalEntityMockDSL.g:6289:2: iv_ruleOpOther= ruleOpOther EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpOtherRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpOther=ruleOpOther();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpOther.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpOther"
+
+
+    // $ANTLR start "ruleOpOther"
+    // InternalEntityMockDSL.g:6295:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
+    public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6301:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
+            // InternalEntityMockDSL.g:6302:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            {
+            // InternalEntityMockDSL.g:6302:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            int alt108=9;
+            alt108 = dfa108.predict(input);
+            switch (alt108) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6303:3: kw= '->'
+                    {
+                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6309:3: kw= '..<'
+                    {
+                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:6315:3: (kw= '>' kw= '..' )
+                    {
+                    // InternalEntityMockDSL.g:6315:3: (kw= '>' kw= '..' )
+                    // InternalEntityMockDSL.g:6316:4: kw= '>' kw= '..'
+                    {
+                    kw=(Token)match(input,104,FOLLOW_98); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
+                      			
+                    }
+                    kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:6328:3: kw= '..'
+                    {
+                    kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:6334:3: kw= '=>'
+                    {
+                    kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:6340:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    {
+                    // InternalEntityMockDSL.g:6340:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalEntityMockDSL.g:6341:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    {
+                    kw=(Token)match(input,104,FOLLOW_99); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:6346:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    int alt106=2;
+                    int LA106_0 = input.LA(1);
+
+                    if ( (LA106_0==104) ) {
+                        int LA106_1 = input.LA(2);
+
+                        if ( (LA106_1==EOF||(LA106_1>=RULE_ID && LA106_1<=RULE_DECIMAL)||LA106_1==14||LA106_1==25||LA106_1==77||(LA106_1>=87 && LA106_1<=89)||(LA106_1>=95 && LA106_1<=96)||LA106_1==103||LA106_1==119||LA106_1==123||LA106_1==129||LA106_1==131||(LA106_1>=135 && LA106_1<=137)||(LA106_1>=139 && LA106_1<=148)||LA106_1==150) ) {
+                            alt106=2;
+                        }
+                        else if ( (LA106_1==104) && (synpred14_InternalEntityMockDSL())) {
+                            alt106=1;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 106, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 106, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt106) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:6347:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            {
+                            // InternalEntityMockDSL.g:6347:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalEntityMockDSL.g:6348:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
+                            {
+                            // InternalEntityMockDSL.g:6353:6: (kw= '>' kw= '>' )
+                            // InternalEntityMockDSL.g:6354:7: kw= '>' kw= '>'
+                            {
+                            kw=(Token)match(input,104,FOLLOW_99); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
+                              						
+                            }
+                            kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:6367:5: kw= '>'
+                            {
+                            kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:6375:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    {
+                    // InternalEntityMockDSL.g:6375:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalEntityMockDSL.g:6376:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    {
+                    kw=(Token)match(input,103,FOLLOW_100); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:6381:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    int alt107=3;
+                    int LA107_0 = input.LA(1);
+
+                    if ( (LA107_0==103) ) {
+                        int LA107_1 = input.LA(2);
+
+                        if ( (synpred15_InternalEntityMockDSL()) ) {
+                            alt107=1;
+                        }
+                        else if ( (true) ) {
+                            alt107=2;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 107, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else if ( (LA107_0==116) ) {
+                        alt107=3;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 107, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt107) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:6382:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            {
+                            // InternalEntityMockDSL.g:6382:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalEntityMockDSL.g:6383:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
+                            {
+                            // InternalEntityMockDSL.g:6388:6: (kw= '<' kw= '<' )
+                            // InternalEntityMockDSL.g:6389:7: kw= '<' kw= '<'
+                            {
+                            kw=(Token)match(input,103,FOLLOW_90); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
+                              						
+                            }
+                            kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							current.merge(kw);
+                              							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:6402:5: kw= '<'
+                            {
+                            kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 3 :
+                            // InternalEntityMockDSL.g:6408:5: kw= '=>'
+                            {
+                            kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalEntityMockDSL.g:6416:3: kw= '<>'
+                    {
+                    kw=(Token)match(input,117,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalEntityMockDSL.g:6422:3: kw= '?:'
+                    {
+                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpOther"
+
+
+    // $ANTLR start "entryRuleXAdditiveExpression"
+    // InternalEntityMockDSL.g:6431:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
+    public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXAdditiveExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6431:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
+            // InternalEntityMockDSL.g:6432:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXAdditiveExpression=ruleXAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXAdditiveExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXAdditiveExpression"
+
+
+    // $ANTLR start "ruleXAdditiveExpression"
+    // InternalEntityMockDSL.g:6438:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
+    public final EObject ruleXAdditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XMultiplicativeExpression_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6444:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
+            // InternalEntityMockDSL.g:6445:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            {
+            // InternalEntityMockDSL.g:6445:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalEntityMockDSL.g:6446:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_101);
+            this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XMultiplicativeExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6454:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            loop109:
+            do {
+                int alt109=2;
+                int LA109_0 = input.LA(1);
+
+                if ( (LA109_0==119) ) {
+                    int LA109_2 = input.LA(2);
+
+                    if ( (synpred16_InternalEntityMockDSL()) ) {
+                        alt109=1;
+                    }
+
+
+                }
+                else if ( (LA109_0==77) ) {
+                    int LA109_3 = input.LA(2);
+
+                    if ( (synpred16_InternalEntityMockDSL()) ) {
+                        alt109=1;
+                    }
+
+
+                }
+
+
+                switch (alt109) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6455:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6455:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
+            	    // InternalEntityMockDSL.g:6456:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6466:5: ( () ( ( ruleOpAdd ) ) )
+            	    // InternalEntityMockDSL.g:6467:6: () ( ( ruleOpAdd ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6467:6: ()
+            	    // InternalEntityMockDSL.g:6468:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6474:6: ( ( ruleOpAdd ) )
+            	    // InternalEntityMockDSL.g:6475:7: ( ruleOpAdd )
+            	    {
+            	    // InternalEntityMockDSL.g:6475:7: ( ruleOpAdd )
+            	    // InternalEntityMockDSL.g:6476:8: ruleOpAdd
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpAdd();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6492:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalEntityMockDSL.g:6493:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    {
+            	    // InternalEntityMockDSL.g:6493:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalEntityMockDSL.g:6494:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_101);
+            	    lv_rightOperand_3_0=ruleXMultiplicativeExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop109;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXAdditiveExpression"
+
+
+    // $ANTLR start "entryRuleOpAdd"
+    // InternalEntityMockDSL.g:6516:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
+    public final String entryRuleOpAdd() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpAdd = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6516:45: (iv_ruleOpAdd= ruleOpAdd EOF )
+            // InternalEntityMockDSL.g:6517:2: iv_ruleOpAdd= ruleOpAdd EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpAddRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpAdd=ruleOpAdd();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpAdd.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpAdd"
+
+
+    // $ANTLR start "ruleOpAdd"
+    // InternalEntityMockDSL.g:6523:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6529:2: ( (kw= '+' | kw= '-' ) )
+            // InternalEntityMockDSL.g:6530:2: (kw= '+' | kw= '-' )
+            {
+            // InternalEntityMockDSL.g:6530:2: (kw= '+' | kw= '-' )
+            int alt110=2;
+            int LA110_0 = input.LA(1);
+
+            if ( (LA110_0==119) ) {
+                alt110=1;
+            }
+            else if ( (LA110_0==77) ) {
+                alt110=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 110, 0, input);
+
+                throw nvae;
+            }
+            switch (alt110) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6531:3: kw= '+'
+                    {
+                    kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6537:3: kw= '-'
+                    {
+                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpAdd"
+
+
+    // $ANTLR start "entryRuleXMultiplicativeExpression"
+    // InternalEntityMockDSL.g:6546:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
+    public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXMultiplicativeExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6546:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
+            // InternalEntityMockDSL.g:6547:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXMultiplicativeExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXMultiplicativeExpression"
+
+
+    // $ANTLR start "ruleXMultiplicativeExpression"
+    // InternalEntityMockDSL.g:6553:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
+    public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XUnaryOperation_0 = null;
+
+        EObject lv_rightOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6559:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
+            // InternalEntityMockDSL.g:6560:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            {
+            // InternalEntityMockDSL.g:6560:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalEntityMockDSL.g:6561:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_102);
+            this_XUnaryOperation_0=ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XUnaryOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6569:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            loop111:
+            do {
+                int alt111=2;
+                switch ( input.LA(1) ) {
+                case 90:
+                    {
+                    int LA111_2 = input.LA(2);
+
+                    if ( (synpred17_InternalEntityMockDSL()) ) {
+                        alt111=1;
+                    }
+
+
+                    }
+                    break;
+                case 120:
+                    {
+                    int LA111_3 = input.LA(2);
+
+                    if ( (synpred17_InternalEntityMockDSL()) ) {
+                        alt111=1;
+                    }
+
+
+                    }
+                    break;
+                case 121:
+                    {
+                    int LA111_4 = input.LA(2);
+
+                    if ( (synpred17_InternalEntityMockDSL()) ) {
+                        alt111=1;
+                    }
+
+
+                    }
+                    break;
+                case 122:
+                    {
+                    int LA111_5 = input.LA(2);
+
+                    if ( (synpred17_InternalEntityMockDSL()) ) {
+                        alt111=1;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt111) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6570:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6570:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
+            	    // InternalEntityMockDSL.g:6571:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6581:5: ( () ( ( ruleOpMulti ) ) )
+            	    // InternalEntityMockDSL.g:6582:6: () ( ( ruleOpMulti ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6582:6: ()
+            	    // InternalEntityMockDSL.g:6583:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6589:6: ( ( ruleOpMulti ) )
+            	    // InternalEntityMockDSL.g:6590:7: ( ruleOpMulti )
+            	    {
+            	    // InternalEntityMockDSL.g:6590:7: ( ruleOpMulti )
+            	    // InternalEntityMockDSL.g:6591:8: ruleOpMulti
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								if (current==null) {
+            	      									current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
+            	      								}
+            	      							
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
+            	      							
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpMulti();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      								afterParserOrEnumRuleCall();
+            	      							
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6607:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalEntityMockDSL.g:6608:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    {
+            	    // InternalEntityMockDSL.g:6608:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalEntityMockDSL.g:6609:6: lv_rightOperand_3_0= ruleXUnaryOperation
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_102);
+            	    lv_rightOperand_3_0=ruleXUnaryOperation();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"rightOperand",
+            	      							lv_rightOperand_3_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop111;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXMultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleOpMulti"
+    // InternalEntityMockDSL.g:6631:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
+    public final String entryRuleOpMulti() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpMulti = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6631:47: (iv_ruleOpMulti= ruleOpMulti EOF )
+            // InternalEntityMockDSL.g:6632:2: iv_ruleOpMulti= ruleOpMulti EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpMultiRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpMulti=ruleOpMulti();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpMulti.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpMulti"
+
+
+    // $ANTLR start "ruleOpMulti"
+    // InternalEntityMockDSL.g:6638:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
+    public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6644:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
+            // InternalEntityMockDSL.g:6645:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            {
+            // InternalEntityMockDSL.g:6645:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            int alt112=4;
+            switch ( input.LA(1) ) {
+            case 90:
+                {
+                alt112=1;
+                }
+                break;
+            case 120:
+                {
+                alt112=2;
+                }
+                break;
+            case 121:
+                {
+                alt112=3;
+                }
+                break;
+            case 122:
+                {
+                alt112=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 112, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt112) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6646:3: kw= '*'
+                    {
+                    kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6652:3: kw= '**'
+                    {
+                    kw=(Token)match(input,120,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:6658:3: kw= '/'
+                    {
+                    kw=(Token)match(input,121,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:6664:3: kw= '%'
+                    {
+                    kw=(Token)match(input,122,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpMulti"
+
+
+    // $ANTLR start "entryRuleXUnaryOperation"
+    // InternalEntityMockDSL.g:6673:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
+    public final EObject entryRuleXUnaryOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXUnaryOperation = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6673:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
+            // InternalEntityMockDSL.g:6674:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXUnaryOperation=ruleXUnaryOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXUnaryOperation; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXUnaryOperation"
+
+
+    // $ANTLR start "ruleXUnaryOperation"
+    // InternalEntityMockDSL.g:6680:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
+    public final EObject ruleXUnaryOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_operand_2_0 = null;
+
+        EObject this_XCastedExpression_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6686:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
+            // InternalEntityMockDSL.g:6687:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            {
+            // InternalEntityMockDSL.g:6687:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            int alt113=2;
+            int LA113_0 = input.LA(1);
+
+            if ( (LA113_0==77||LA113_0==119||LA113_0==123) ) {
+                alt113=1;
+            }
+            else if ( ((LA113_0>=RULE_ID && LA113_0<=RULE_DECIMAL)||LA113_0==14||LA113_0==25||(LA113_0>=87 && LA113_0<=89)||(LA113_0>=95 && LA113_0<=96)||LA113_0==103||LA113_0==129||LA113_0==131||(LA113_0>=135 && LA113_0<=137)||(LA113_0>=139 && LA113_0<=148)||LA113_0==150) ) {
+                alt113=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 113, 0, input);
+
+                throw nvae;
+            }
+            switch (alt113) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6688:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    {
+                    // InternalEntityMockDSL.g:6688:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalEntityMockDSL.g:6689:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    {
+                    // InternalEntityMockDSL.g:6689:4: ()
+                    // InternalEntityMockDSL.g:6690:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:6696:4: ( ( ruleOpUnary ) )
+                    // InternalEntityMockDSL.g:6697:5: ( ruleOpUnary )
+                    {
+                    // InternalEntityMockDSL.g:6697:5: ( ruleOpUnary )
+                    // InternalEntityMockDSL.g:6698:6: ruleOpUnary
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXUnaryOperationRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_84);
+                    ruleOpUnary();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:6712:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalEntityMockDSL.g:6713:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    {
+                    // InternalEntityMockDSL.g:6713:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalEntityMockDSL.g:6714:6: lv_operand_2_0= ruleXUnaryOperation
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_operand_2_0=ruleXUnaryOperation();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"operand",
+                      							lv_operand_2_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6733:3: this_XCastedExpression_3= ruleXCastedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XCastedExpression_3=ruleXCastedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XCastedExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXUnaryOperation"
+
+
+    // $ANTLR start "entryRuleOpUnary"
+    // InternalEntityMockDSL.g:6745:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
+    public final String entryRuleOpUnary() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpUnary = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6745:47: (iv_ruleOpUnary= ruleOpUnary EOF )
+            // InternalEntityMockDSL.g:6746:2: iv_ruleOpUnary= ruleOpUnary EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpUnaryRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpUnary=ruleOpUnary();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpUnary.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpUnary"
+
+
+    // $ANTLR start "ruleOpUnary"
+    // InternalEntityMockDSL.g:6752:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
+    public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6758:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
+            // InternalEntityMockDSL.g:6759:2: (kw= '!' | kw= '-' | kw= '+' )
+            {
+            // InternalEntityMockDSL.g:6759:2: (kw= '!' | kw= '-' | kw= '+' )
+            int alt114=3;
+            switch ( input.LA(1) ) {
+            case 123:
+                {
+                alt114=1;
+                }
+                break;
+            case 77:
+                {
+                alt114=2;
+                }
+                break;
+            case 119:
+                {
+                alt114=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 114, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt114) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6760:3: kw= '!'
+                    {
+                    kw=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6766:3: kw= '-'
+                    {
+                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:6772:3: kw= '+'
+                    {
+                    kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpUnary"
+
+
+    // $ANTLR start "entryRuleXCastedExpression"
+    // InternalEntityMockDSL.g:6781:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
+    public final EObject entryRuleXCastedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCastedExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6781:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
+            // InternalEntityMockDSL.g:6782:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXCastedExpression=ruleXCastedExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXCastedExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXCastedExpression"
+
+
+    // $ANTLR start "ruleXCastedExpression"
+    // InternalEntityMockDSL.g:6788:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
+    public final EObject ruleXCastedExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject this_XPostfixOperation_0 = null;
+
+        EObject lv_type_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6794:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
+            // InternalEntityMockDSL.g:6795:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            {
+            // InternalEntityMockDSL.g:6795:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalEntityMockDSL.g:6796:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_103);
+            this_XPostfixOperation_0=ruleXPostfixOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XPostfixOperation_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6804:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            loop115:
+            do {
+                int alt115=2;
+                int LA115_0 = input.LA(1);
+
+                if ( (LA115_0==78) ) {
+                    int LA115_2 = input.LA(2);
+
+                    if ( (synpred18_InternalEntityMockDSL()) ) {
+                        alt115=1;
+                    }
+
+
+                }
+
+
+                switch (alt115) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6805:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6805:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
+            	    // InternalEntityMockDSL.g:6806:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
+            	    {
+            	    // InternalEntityMockDSL.g:6812:5: ( () otherlv_2= 'as' )
+            	    // InternalEntityMockDSL.g:6813:6: () otherlv_2= 'as'
+            	    {
+            	    // InternalEntityMockDSL.g:6813:6: ()
+            	    // InternalEntityMockDSL.g:6814:7: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							current = forceCreateModelElementAndSet(
+            	      								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
+            	      								current);
+            	      						
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,78,FOLLOW_39); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6826:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalEntityMockDSL.g:6827:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    {
+            	    // InternalEntityMockDSL.g:6827:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalEntityMockDSL.g:6828:6: lv_type_3_0= ruleJvmTypeReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_103);
+            	    lv_type_3_0=ruleJvmTypeReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"type",
+            	      							lv_type_3_0,
+            	      							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop115;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXCastedExpression"
+
+
+    // $ANTLR start "entryRuleXPostfixOperation"
+    // InternalEntityMockDSL.g:6850:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
+    public final EObject entryRuleXPostfixOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXPostfixOperation = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6850:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
+            // InternalEntityMockDSL.g:6851:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXPostfixOperation=ruleXPostfixOperation();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXPostfixOperation; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXPostfixOperation"
+
+
+    // $ANTLR start "ruleXPostfixOperation"
+    // InternalEntityMockDSL.g:6857:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
+    public final EObject ruleXPostfixOperation() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XMemberFeatureCall_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6863:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
+            // InternalEntityMockDSL.g:6864:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            {
+            // InternalEntityMockDSL.g:6864:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalEntityMockDSL.g:6865:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_104);
+            this_XMemberFeatureCall_0=ruleXMemberFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XMemberFeatureCall_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6873:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            int alt116=2;
+            int LA116_0 = input.LA(1);
+
+            if ( (LA116_0==124) ) {
+                int LA116_1 = input.LA(2);
+
+                if ( (synpred19_InternalEntityMockDSL()) ) {
+                    alt116=1;
+                }
+            }
+            else if ( (LA116_0==125) ) {
+                int LA116_2 = input.LA(2);
+
+                if ( (synpred19_InternalEntityMockDSL()) ) {
+                    alt116=1;
+                }
+            }
+            switch (alt116) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6874:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
+                    {
+                    // InternalEntityMockDSL.g:6884:4: ( () ( ( ruleOpPostfix ) ) )
+                    // InternalEntityMockDSL.g:6885:5: () ( ( ruleOpPostfix ) )
+                    {
+                    // InternalEntityMockDSL.g:6885:5: ()
+                    // InternalEntityMockDSL.g:6886:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndSet(
+                      							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:6892:5: ( ( ruleOpPostfix ) )
+                    // InternalEntityMockDSL.g:6893:6: ( ruleOpPostfix )
+                    {
+                    // InternalEntityMockDSL.g:6893:6: ( ruleOpPostfix )
+                    // InternalEntityMockDSL.g:6894:7: ruleOpPostfix
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXPostfixOperationRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleOpPostfix();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXPostfixOperation"
+
+
+    // $ANTLR start "entryRuleOpPostfix"
+    // InternalEntityMockDSL.g:6914:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
+    public final String entryRuleOpPostfix() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleOpPostfix = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6914:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
+            // InternalEntityMockDSL.g:6915:2: iv_ruleOpPostfix= ruleOpPostfix EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOpPostfixRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleOpPostfix=ruleOpPostfix();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOpPostfix.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOpPostfix"
+
+
+    // $ANTLR start "ruleOpPostfix"
+    // InternalEntityMockDSL.g:6921:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6927:2: ( (kw= '++' | kw= '--' ) )
+            // InternalEntityMockDSL.g:6928:2: (kw= '++' | kw= '--' )
+            {
+            // InternalEntityMockDSL.g:6928:2: (kw= '++' | kw= '--' )
+            int alt117=2;
+            int LA117_0 = input.LA(1);
+
+            if ( (LA117_0==124) ) {
+                alt117=1;
+            }
+            else if ( (LA117_0==125) ) {
+                alt117=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 117, 0, input);
+
+                throw nvae;
+            }
+            switch (alt117) {
+                case 1 :
+                    // InternalEntityMockDSL.g:6929:3: kw= '++'
+                    {
+                    kw=(Token)match(input,124,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:6935:3: kw= '--'
+                    {
+                    kw=(Token)match(input,125,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOpPostfix"
+
+
+    // $ANTLR start "entryRuleXMemberFeatureCall"
+    // InternalEntityMockDSL.g:6944:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
+    public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXMemberFeatureCall = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:6944:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
+            // InternalEntityMockDSL.g:6945:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXMemberFeatureCall; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXMemberFeatureCall"
+
+
+    // $ANTLR start "ruleXMemberFeatureCall"
+    // InternalEntityMockDSL.g:6951:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
+    public final EObject ruleXMemberFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_explicitStatic_3_0=null;
+        Token otherlv_8=null;
+        Token lv_nullSafe_9_0=null;
+        Token lv_explicitStatic_10_0=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        Token lv_explicitOperationCall_17_0=null;
+        Token otherlv_20=null;
+        Token otherlv_22=null;
+        EObject this_XPrimaryExpression_0 = null;
+
+        EObject lv_value_6_0 = null;
+
+        EObject lv_typeArguments_12_0 = null;
+
+        EObject lv_typeArguments_14_0 = null;
+
+        EObject lv_memberCallArguments_18_0 = null;
+
+        EObject lv_memberCallArguments_19_0 = null;
+
+        EObject lv_memberCallArguments_21_0 = null;
+
+        EObject lv_memberCallArguments_23_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:6957:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
+            // InternalEntityMockDSL.g:6958:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            {
+            // InternalEntityMockDSL.g:6958:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            // InternalEntityMockDSL.g:6959:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_105);
+            this_XPrimaryExpression_0=ruleXPrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XPrimaryExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:6967:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            loop126:
+            do {
+                int alt126=3;
+                switch ( input.LA(1) ) {
+                case 34:
+                    {
+                    int LA126_2 = input.LA(2);
+
+                    if ( (synpred20_InternalEntityMockDSL()) ) {
+                        alt126=1;
+                    }
+                    else if ( (synpred21_InternalEntityMockDSL()) ) {
+                        alt126=2;
+                    }
+
+
+                    }
+                    break;
+                case 126:
+                    {
+                    int LA126_3 = input.LA(2);
+
+                    if ( (synpred20_InternalEntityMockDSL()) ) {
+                        alt126=1;
+                    }
+                    else if ( (synpred21_InternalEntityMockDSL()) ) {
+                        alt126=2;
+                    }
+
+
+                    }
+                    break;
+                case 127:
+                    {
+                    int LA126_4 = input.LA(2);
+
+                    if ( (synpred21_InternalEntityMockDSL()) ) {
+                        alt126=2;
+                    }
+
+
+                    }
+                    break;
+
+                }
+
+                switch (alt126) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:6968:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6968:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalEntityMockDSL.g:6969:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
+            	    {
+            	    // InternalEntityMockDSL.g:6969:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+            	    // InternalEntityMockDSL.g:6970:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    {
+            	    // InternalEntityMockDSL.g:6990:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalEntityMockDSL.g:6991:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+            	    {
+            	    // InternalEntityMockDSL.g:6991:7: ()
+            	    // InternalEntityMockDSL.g:6992:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:6998:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
+            	    int alt118=2;
+            	    int LA118_0 = input.LA(1);
+
+            	    if ( (LA118_0==34) ) {
+            	        alt118=1;
+            	    }
+            	    else if ( (LA118_0==126) ) {
+            	        alt118=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 118, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt118) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:6999:8: otherlv_2= '.'
+            	            {
+            	            otherlv_2=(Token)match(input,34,FOLLOW_106); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
+            	              							
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalEntityMockDSL.g:7004:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            {
+            	            // InternalEntityMockDSL.g:7004:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalEntityMockDSL.g:7005:9: (lv_explicitStatic_3_0= '::' )
+            	            {
+            	            // InternalEntityMockDSL.g:7005:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalEntityMockDSL.g:7006:10: lv_explicitStatic_3_0= '::'
+            	            {
+            	            lv_explicitStatic_3_0=(Token)match(input,126,FOLLOW_106); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
+            	              									
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
+            	              									
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7019:7: ( ( ruleFeatureCallID ) )
+            	    // InternalEntityMockDSL.g:7020:8: ( ruleFeatureCallID )
+            	    {
+            	    // InternalEntityMockDSL.g:7020:8: ( ruleFeatureCallID )
+            	    // InternalEntityMockDSL.g:7021:9: ruleFeatureCallID
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      									if (current==null) {
+            	      										current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	      									}
+            	      								
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
+            	      								
+            	    }
+            	    pushFollow(FOLLOW_83);
+            	    ruleFeatureCallID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									afterParserOrEnumRuleCall();
+            	      								
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_84);
+            	    ruleOpSingleAssign();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7044:5: ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalEntityMockDSL.g:7045:6: (lv_value_6_0= ruleXAssignment )
+            	    {
+            	    // InternalEntityMockDSL.g:7045:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalEntityMockDSL.g:7046:7: lv_value_6_0= ruleXAssignment
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_105);
+            	    lv_value_6_0=ruleXAssignment();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	      							}
+            	      							set(
+            	      								current,
+            	      								"value",
+            	      								lv_value_6_0,
+            	      								"org.eclipse.xtext.xbase.Xbase.XAssignment");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalEntityMockDSL.g:7065:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    {
+            	    // InternalEntityMockDSL.g:7065:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    // InternalEntityMockDSL.g:7066:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    {
+            	    // InternalEntityMockDSL.g:7066:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
+            	    // InternalEntityMockDSL.g:7067:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:7087:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalEntityMockDSL.g:7088:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    {
+            	    // InternalEntityMockDSL.g:7088:7: ()
+            	    // InternalEntityMockDSL.g:7089:8: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      								current = forceCreateModelElementAndSet(
+            	      									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
+            	      									current);
+            	      							
+            	    }
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7095:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    int alt119=3;
+            	    switch ( input.LA(1) ) {
+            	    case 34:
+            	        {
+            	        alt119=1;
+            	        }
+            	        break;
+            	    case 127:
+            	        {
+            	        alt119=2;
+            	        }
+            	        break;
+            	    case 126:
+            	        {
+            	        alt119=3;
+            	        }
+            	        break;
+            	    default:
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 119, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt119) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:7096:8: otherlv_8= '.'
+            	            {
+            	            otherlv_8=(Token)match(input,34,FOLLOW_107); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
+            	              							
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalEntityMockDSL.g:7101:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            {
+            	            // InternalEntityMockDSL.g:7101:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalEntityMockDSL.g:7102:9: (lv_nullSafe_9_0= '?.' )
+            	            {
+            	            // InternalEntityMockDSL.g:7102:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalEntityMockDSL.g:7103:10: lv_nullSafe_9_0= '?.'
+            	            {
+            	            lv_nullSafe_9_0=(Token)match(input,127,FOLLOW_107); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
+            	              									
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "nullSafe", true, "?.");
+            	              									
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 3 :
+            	            // InternalEntityMockDSL.g:7116:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            {
+            	            // InternalEntityMockDSL.g:7116:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalEntityMockDSL.g:7117:9: (lv_explicitStatic_10_0= '::' )
+            	            {
+            	            // InternalEntityMockDSL.g:7117:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalEntityMockDSL.g:7118:10: lv_explicitStatic_10_0= '::'
+            	            {
+            	            lv_explicitStatic_10_0=(Token)match(input,126,FOLLOW_107); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
+            	              									
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              										if (current==null) {
+            	              											current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              										}
+            	              										setWithLastConsumed(current, "explicitStatic", true, "::");
+            	              									
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7133:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
+            	    int alt121=2;
+            	    int LA121_0 = input.LA(1);
+
+            	    if ( (LA121_0==103) ) {
+            	        alt121=1;
+            	    }
+            	    switch (alt121) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:7134:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
+            	            {
+            	            otherlv_11=(Token)match(input,103,FOLLOW_108); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
+            	              					
+            	            }
+            	            // InternalEntityMockDSL.g:7138:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
+            	            // InternalEntityMockDSL.g:7139:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            {
+            	            // InternalEntityMockDSL.g:7139:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalEntityMockDSL.g:7140:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
+            	              							
+            	            }
+            	            pushFollow(FOLLOW_109);
+            	            lv_typeArguments_12_0=ruleJvmArgumentTypeReference();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	              								}
+            	              								add(
+            	              									current,
+            	              									"typeArguments",
+            	              									lv_typeArguments_12_0,
+            	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+            	              								afterParserOrEnumRuleCall();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalEntityMockDSL.g:7157:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
+            	            loop120:
+            	            do {
+            	                int alt120=2;
+            	                int LA120_0 = input.LA(1);
+
+            	                if ( (LA120_0==26) ) {
+            	                    alt120=1;
+            	                }
+
+
+            	                switch (alt120) {
+            	            	case 1 :
+            	            	    // InternalEntityMockDSL.g:7158:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    {
+            	            	    otherlv_13=(Token)match(input,26,FOLLOW_108); if (state.failed) return current;
+            	            	    if ( state.backtracking==0 ) {
+
+            	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
+            	            	      						
+            	            	    }
+            	            	    // InternalEntityMockDSL.g:7162:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalEntityMockDSL.g:7163:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    {
+            	            	    // InternalEntityMockDSL.g:7163:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalEntityMockDSL.g:7164:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
+            	            	    {
+            	            	    if ( state.backtracking==0 ) {
+
+            	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
+            	            	      								
+            	            	    }
+            	            	    pushFollow(FOLLOW_109);
+            	            	    lv_typeArguments_14_0=ruleJvmArgumentTypeReference();
+
+            	            	    state._fsp--;
+            	            	    if (state.failed) return current;
+            	            	    if ( state.backtracking==0 ) {
+
+            	            	      									if (current==null) {
+            	            	      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	            	      									}
+            	            	      									add(
+            	            	      										current,
+            	            	      										"typeArguments",
+            	            	      										lv_typeArguments_14_0,
+            	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+            	            	      									afterParserOrEnumRuleCall();
+            	            	      								
+            	            	    }
+
+            	            	    }
+
+
+            	            	    }
+
+
+            	            	    }
+            	            	    break;
+
+            	            	default :
+            	            	    break loop120;
+            	                }
+            	            } while (true);
+
+            	            otherlv_15=(Token)match(input,104,FOLLOW_107); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7187:5: ( ( ruleIdOrSuper ) )
+            	    // InternalEntityMockDSL.g:7188:6: ( ruleIdOrSuper )
+            	    {
+            	    // InternalEntityMockDSL.g:7188:6: ( ruleIdOrSuper )
+            	    // InternalEntityMockDSL.g:7189:7: ruleIdOrSuper
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	      							}
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
+            	      						
+            	    }
+            	    pushFollow(FOLLOW_110);
+            	    ruleIdOrSuper();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7203:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
+            	    int alt124=2;
+            	    alt124 = dfa124.predict(input);
+            	    switch (alt124) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:7204:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
+            	            {
+            	            // InternalEntityMockDSL.g:7204:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
+            	            // InternalEntityMockDSL.g:7205:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
+            	            {
+            	            // InternalEntityMockDSL.g:7209:7: (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalEntityMockDSL.g:7210:8: lv_explicitOperationCall_17_0= '('
+            	            {
+            	            lv_explicitOperationCall_17_0=(Token)match(input,25,FOLLOW_111); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
+            	              							
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
+            	              								}
+            	              								setWithLastConsumed(current, "explicitOperationCall", true, "(");
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalEntityMockDSL.g:7222:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
+            	            int alt123=3;
+            	            alt123 = dfa123.predict(input);
+            	            switch (alt123) {
+            	                case 1 :
+            	                    // InternalEntityMockDSL.g:7223:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    {
+            	                    // InternalEntityMockDSL.g:7223:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalEntityMockDSL.g:7224:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    {
+            	                    // InternalEntityMockDSL.g:7249:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalEntityMockDSL.g:7250:9: lv_memberCallArguments_18_0= ruleXShortClosure
+            	                    {
+            	                    if ( state.backtracking==0 ) {
+
+            	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
+            	                      								
+            	                    }
+            	                    pushFollow(FOLLOW_82);
+            	                    lv_memberCallArguments_18_0=ruleXShortClosure();
+
+            	                    state._fsp--;
+            	                    if (state.failed) return current;
+            	                    if ( state.backtracking==0 ) {
+
+            	                      									if (current==null) {
+            	                      										current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                      									}
+            	                      									add(
+            	                      										current,
+            	                      										"memberCallArguments",
+            	                      										lv_memberCallArguments_18_0,
+            	                      										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+            	                      									afterParserOrEnumRuleCall();
+            	                      								
+            	                    }
+
+            	                    }
+
+
+            	                    }
+
+
+            	                    }
+            	                    break;
+            	                case 2 :
+            	                    // InternalEntityMockDSL.g:7268:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    {
+            	                    // InternalEntityMockDSL.g:7268:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalEntityMockDSL.g:7269:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    {
+            	                    // InternalEntityMockDSL.g:7269:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
+            	                    // InternalEntityMockDSL.g:7270:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    {
+            	                    // InternalEntityMockDSL.g:7270:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalEntityMockDSL.g:7271:10: lv_memberCallArguments_19_0= ruleXExpression
+            	                    {
+            	                    if ( state.backtracking==0 ) {
+
+            	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
+            	                      									
+            	                    }
+            	                    pushFollow(FOLLOW_38);
+            	                    lv_memberCallArguments_19_0=ruleXExpression();
+
+            	                    state._fsp--;
+            	                    if (state.failed) return current;
+            	                    if ( state.backtracking==0 ) {
+
+            	                      										if (current==null) {
+            	                      											current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                      										}
+            	                      										add(
+            	                      											current,
+            	                      											"memberCallArguments",
+            	                      											lv_memberCallArguments_19_0,
+            	                      											"org.eclipse.xtext.xbase.Xbase.XExpression");
+            	                      										afterParserOrEnumRuleCall();
+            	                      									
+            	                    }
+
+            	                    }
+
+
+            	                    }
+
+            	                    // InternalEntityMockDSL.g:7288:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    loop122:
+            	                    do {
+            	                        int alt122=2;
+            	                        int LA122_0 = input.LA(1);
+
+            	                        if ( (LA122_0==26) ) {
+            	                            alt122=1;
+            	                        }
+
+
+            	                        switch (alt122) {
+            	                    	case 1 :
+            	                    	    // InternalEntityMockDSL.g:7289:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    {
+            	                    	    otherlv_20=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+            	                    	    if ( state.backtracking==0 ) {
+
+            	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
+            	                    	      								
+            	                    	    }
+            	                    	    // InternalEntityMockDSL.g:7293:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalEntityMockDSL.g:7294:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    {
+            	                    	    // InternalEntityMockDSL.g:7294:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalEntityMockDSL.g:7295:11: lv_memberCallArguments_21_0= ruleXExpression
+            	                    	    {
+            	                    	    if ( state.backtracking==0 ) {
+
+            	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
+            	                    	      										
+            	                    	    }
+            	                    	    pushFollow(FOLLOW_38);
+            	                    	    lv_memberCallArguments_21_0=ruleXExpression();
+
+            	                    	    state._fsp--;
+            	                    	    if (state.failed) return current;
+            	                    	    if ( state.backtracking==0 ) {
+
+            	                    	      											if (current==null) {
+            	                    	      												current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	                    	      											}
+            	                    	      											add(
+            	                    	      												current,
+            	                    	      												"memberCallArguments",
+            	                    	      												lv_memberCallArguments_21_0,
+            	                    	      												"org.eclipse.xtext.xbase.Xbase.XExpression");
+            	                    	      											afterParserOrEnumRuleCall();
+            	                    	      										
+            	                    	    }
+
+            	                    	    }
+
+
+            	                    	    }
+
+
+            	                    	    }
+            	                    	    break;
+
+            	                    	default :
+            	                    	    break loop122;
+            	                        }
+            	                    } while (true);
+
+
+            	                    }
+
+
+            	                    }
+            	                    break;
+
+            	            }
+
+            	            otherlv_22=(Token)match(input,27,FOLLOW_112); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:7320:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    int alt125=2;
+            	    alt125 = dfa125.predict(input);
+            	    switch (alt125) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:7321:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
+            	            {
+            	            // InternalEntityMockDSL.g:7327:6: (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalEntityMockDSL.g:7328:7: lv_memberCallArguments_23_0= ruleXClosure
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
+            	              						
+            	            }
+            	            pushFollow(FOLLOW_105);
+            	            lv_memberCallArguments_23_0=ruleXClosure();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
+            	              							}
+            	              							add(
+            	              								current,
+            	              								"memberCallArguments",
+            	              								lv_memberCallArguments_23_0,
+            	              								"org.eclipse.xtext.xbase.Xbase.XClosure");
+            	              							afterParserOrEnumRuleCall();
+            	              						
+            	            }
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop126;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXMemberFeatureCall"
+
+
+    // $ANTLR start "entryRuleXPrimaryExpression"
+    // InternalEntityMockDSL.g:7351:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
+    public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXPrimaryExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7351:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
+            // InternalEntityMockDSL.g:7352:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXPrimaryExpression=ruleXPrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXPrimaryExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXPrimaryExpression"
+
+
+    // $ANTLR start "ruleXPrimaryExpression"
+    // InternalEntityMockDSL.g:7358:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
+    public final EObject ruleXPrimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XConstructorCall_0 = null;
+
+        EObject this_XBlockExpression_1 = null;
+
+        EObject this_XSwitchExpression_2 = null;
+
+        EObject this_XSynchronizedExpression_3 = null;
+
+        EObject this_XFeatureCall_4 = null;
+
+        EObject this_XLiteral_5 = null;
+
+        EObject this_XIfExpression_6 = null;
+
+        EObject this_XForLoopExpression_7 = null;
+
+        EObject this_XBasicForLoopExpression_8 = null;
+
+        EObject this_XWhileExpression_9 = null;
+
+        EObject this_XDoWhileExpression_10 = null;
+
+        EObject this_XThrowExpression_11 = null;
+
+        EObject this_XReturnExpression_12 = null;
+
+        EObject this_XTryCatchFinallyExpression_13 = null;
+
+        EObject this_XParenthesizedExpression_14 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7364:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
+            // InternalEntityMockDSL.g:7365:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            {
+            // InternalEntityMockDSL.g:7365:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            int alt127=15;
+            alt127 = dfa127.predict(input);
+            switch (alt127) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7366:3: this_XConstructorCall_0= ruleXConstructorCall
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XConstructorCall_0=ruleXConstructorCall();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XConstructorCall_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:7375:3: this_XBlockExpression_1= ruleXBlockExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XBlockExpression_1=ruleXBlockExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XBlockExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:7384:3: this_XSwitchExpression_2= ruleXSwitchExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XSwitchExpression_2=ruleXSwitchExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XSwitchExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:7393:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    {
+                    // InternalEntityMockDSL.g:7393:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalEntityMockDSL.g:7394:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
+                      			
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XSynchronizedExpression_3=ruleXSynchronizedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XSynchronizedExpression_3;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:7411:3: this_XFeatureCall_4= ruleXFeatureCall
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XFeatureCall_4=ruleXFeatureCall();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XFeatureCall_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:7420:3: this_XLiteral_5= ruleXLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XLiteral_5=ruleXLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XLiteral_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:7429:3: this_XIfExpression_6= ruleXIfExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XIfExpression_6=ruleXIfExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XIfExpression_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalEntityMockDSL.g:7438:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    {
+                    // InternalEntityMockDSL.g:7438:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalEntityMockDSL.g:7439:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
+                      			
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XForLoopExpression_7=ruleXForLoopExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XForLoopExpression_7;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalEntityMockDSL.g:7462:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XBasicForLoopExpression_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalEntityMockDSL.g:7471:3: this_XWhileExpression_9= ruleXWhileExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XWhileExpression_9=ruleXWhileExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XWhileExpression_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalEntityMockDSL.g:7480:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XDoWhileExpression_10=ruleXDoWhileExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XDoWhileExpression_10;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalEntityMockDSL.g:7489:3: this_XThrowExpression_11= ruleXThrowExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XThrowExpression_11=ruleXThrowExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XThrowExpression_11;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalEntityMockDSL.g:7498:3: this_XReturnExpression_12= ruleXReturnExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XReturnExpression_12=ruleXReturnExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XReturnExpression_12;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalEntityMockDSL.g:7507:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XTryCatchFinallyExpression_13;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalEntityMockDSL.g:7516:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XParenthesizedExpression_14=ruleXParenthesizedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XParenthesizedExpression_14;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXPrimaryExpression"
+
+
+    // $ANTLR start "entryRuleXLiteral"
+    // InternalEntityMockDSL.g:7528:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
+    public final EObject entryRuleXLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7528:49: (iv_ruleXLiteral= ruleXLiteral EOF )
+            // InternalEntityMockDSL.g:7529:2: iv_ruleXLiteral= ruleXLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXLiteral=ruleXLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXLiteral"
+
+
+    // $ANTLR start "ruleXLiteral"
+    // InternalEntityMockDSL.g:7535:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
+    public final EObject ruleXLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XCollectionLiteral_0 = null;
+
+        EObject this_XClosure_1 = null;
+
+        EObject this_XBooleanLiteral_2 = null;
+
+        EObject this_XNumberLiteral_3 = null;
+
+        EObject this_XNullLiteral_4 = null;
+
+        EObject this_XStringLiteral_5 = null;
+
+        EObject this_XTypeLiteral_6 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7541:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
+            // InternalEntityMockDSL.g:7542:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            {
+            // InternalEntityMockDSL.g:7542:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            int alt128=7;
+            int LA128_0 = input.LA(1);
+
+            if ( (LA128_0==95) ) {
+                alt128=1;
+            }
+            else if ( (LA128_0==96) && (synpred27_InternalEntityMockDSL())) {
+                alt128=2;
+            }
+            else if ( ((LA128_0>=142 && LA128_0<=143)) ) {
+                alt128=3;
+            }
+            else if ( ((LA128_0>=RULE_INT && LA128_0<=RULE_DECIMAL)) ) {
+                alt128=4;
+            }
+            else if ( (LA128_0==144) ) {
+                alt128=5;
+            }
+            else if ( (LA128_0==RULE_STRING) ) {
+                alt128=6;
+            }
+            else if ( (LA128_0==145) ) {
+                alt128=7;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 128, 0, input);
+
+                throw nvae;
+            }
+            switch (alt128) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7543:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XCollectionLiteral_0=ruleXCollectionLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XCollectionLiteral_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:7552:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    {
+                    // InternalEntityMockDSL.g:7552:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalEntityMockDSL.g:7553:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
+                      			
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XClosure_1=ruleXClosure();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_XClosure_1;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:7569:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XBooleanLiteral_2=ruleXBooleanLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XBooleanLiteral_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:7578:3: this_XNumberLiteral_3= ruleXNumberLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XNumberLiteral_3=ruleXNumberLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XNumberLiteral_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:7587:3: this_XNullLiteral_4= ruleXNullLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XNullLiteral_4=ruleXNullLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XNullLiteral_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalEntityMockDSL.g:7596:3: this_XStringLiteral_5= ruleXStringLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XStringLiteral_5=ruleXStringLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XStringLiteral_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalEntityMockDSL.g:7605:3: this_XTypeLiteral_6= ruleXTypeLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XTypeLiteral_6=ruleXTypeLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XTypeLiteral_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXLiteral"
+
+
+    // $ANTLR start "entryRuleXCollectionLiteral"
+    // InternalEntityMockDSL.g:7617:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
+    public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCollectionLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7617:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
+            // InternalEntityMockDSL.g:7618:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXCollectionLiteral=ruleXCollectionLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXCollectionLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXCollectionLiteral"
+
+
+    // $ANTLR start "ruleXCollectionLiteral"
+    // InternalEntityMockDSL.g:7624:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
+    public final EObject ruleXCollectionLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XSetLiteral_0 = null;
+
+        EObject this_XListLiteral_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7630:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
+            // InternalEntityMockDSL.g:7631:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            {
+            // InternalEntityMockDSL.g:7631:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            int alt129=2;
+            int LA129_0 = input.LA(1);
+
+            if ( (LA129_0==95) ) {
+                int LA129_1 = input.LA(2);
+
+                if ( (LA129_1==96) ) {
+                    alt129=2;
+                }
+                else if ( (LA129_1==14) ) {
+                    alt129=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 129, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 129, 0, input);
+
+                throw nvae;
+            }
+            switch (alt129) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7632:3: this_XSetLiteral_0= ruleXSetLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XSetLiteral_0=ruleXSetLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XSetLiteral_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:7641:3: this_XListLiteral_1= ruleXListLiteral
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XListLiteral_1=ruleXListLiteral();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XListLiteral_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXCollectionLiteral"
+
+
+    // $ANTLR start "entryRuleXSetLiteral"
+    // InternalEntityMockDSL.g:7653:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
+    public final EObject entryRuleXSetLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSetLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7653:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
+            // InternalEntityMockDSL.g:7654:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXSetLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXSetLiteral=ruleXSetLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXSetLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXSetLiteral"
+
+
+    // $ANTLR start "ruleXSetLiteral"
+    // InternalEntityMockDSL.g:7660:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
+    public final EObject ruleXSetLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_elements_3_0 = null;
+
+        EObject lv_elements_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7666:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
+            // InternalEntityMockDSL.g:7667:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            {
+            // InternalEntityMockDSL.g:7667:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalEntityMockDSL.g:7668:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
+            {
+            // InternalEntityMockDSL.g:7668:3: ()
+            // InternalEntityMockDSL.g:7669:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,95,FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,14,FOLLOW_113); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:7683:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt131=2;
+            int LA131_0 = input.LA(1);
+
+            if ( ((LA131_0>=RULE_ID && LA131_0<=RULE_DECIMAL)||LA131_0==14||LA131_0==25||LA131_0==77||(LA131_0>=87 && LA131_0<=89)||(LA131_0>=95 && LA131_0<=96)||LA131_0==103||LA131_0==119||LA131_0==123||LA131_0==129||LA131_0==131||(LA131_0>=135 && LA131_0<=137)||(LA131_0>=139 && LA131_0<=148)||LA131_0==150) ) {
+                alt131=1;
+            }
+            switch (alt131) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7684:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:7684:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:7685:5: (lv_elements_3_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:7685:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:7686:6: lv_elements_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_114);
+                    lv_elements_3_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+                      						}
+                      						add(
+                      							current,
+                      							"elements",
+                      							lv_elements_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:7703:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop130:
+                    do {
+                        int alt130=2;
+                        int LA130_0 = input.LA(1);
+
+                        if ( (LA130_0==26) ) {
+                            alt130=1;
+                        }
+
+
+                        switch (alt130) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:7704:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:7708:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalEntityMockDSL.g:7709:6: (lv_elements_5_0= ruleXExpression )
+                    	    {
+                    	    // InternalEntityMockDSL.g:7709:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalEntityMockDSL.g:7710:7: lv_elements_5_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_114);
+                    	    lv_elements_5_0=ruleXExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"elements",
+                    	      								lv_elements_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop130;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXSetLiteral"
+
+
+    // $ANTLR start "entryRuleXListLiteral"
+    // InternalEntityMockDSL.g:7737:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
+    public final EObject entryRuleXListLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXListLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7737:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
+            // InternalEntityMockDSL.g:7738:2: iv_ruleXListLiteral= ruleXListLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXListLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXListLiteral=ruleXListLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXListLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXListLiteral"
+
+
+    // $ANTLR start "ruleXListLiteral"
+    // InternalEntityMockDSL.g:7744:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
+    public final EObject ruleXListLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_elements_3_0 = null;
+
+        EObject lv_elements_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7750:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
+            // InternalEntityMockDSL.g:7751:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            {
+            // InternalEntityMockDSL.g:7751:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalEntityMockDSL.g:7752:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
+            {
+            // InternalEntityMockDSL.g:7752:3: ()
+            // InternalEntityMockDSL.g:7753:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,95,FOLLOW_85); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,96,FOLLOW_86); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:7767:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt133=2;
+            int LA133_0 = input.LA(1);
+
+            if ( ((LA133_0>=RULE_ID && LA133_0<=RULE_DECIMAL)||LA133_0==14||LA133_0==25||LA133_0==77||(LA133_0>=87 && LA133_0<=89)||(LA133_0>=95 && LA133_0<=96)||LA133_0==103||LA133_0==119||LA133_0==123||LA133_0==129||LA133_0==131||(LA133_0>=135 && LA133_0<=137)||(LA133_0>=139 && LA133_0<=148)||LA133_0==150) ) {
+                alt133=1;
+            }
+            switch (alt133) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7768:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:7768:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:7769:5: (lv_elements_3_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:7769:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:7770:6: lv_elements_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_87);
+                    lv_elements_3_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+                      						}
+                      						add(
+                      							current,
+                      							"elements",
+                      							lv_elements_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:7787:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop132:
+                    do {
+                        int alt132=2;
+                        int LA132_0 = input.LA(1);
+
+                        if ( (LA132_0==26) ) {
+                            alt132=1;
+                        }
+
+
+                        switch (alt132) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:7788:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:7792:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalEntityMockDSL.g:7793:6: (lv_elements_5_0= ruleXExpression )
+                    	    {
+                    	    // InternalEntityMockDSL.g:7793:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalEntityMockDSL.g:7794:7: lv_elements_5_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_87);
+                    	    lv_elements_5_0=ruleXExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXListLiteralRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"elements",
+                    	      								lv_elements_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop132;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXListLiteral"
+
+
+    // $ANTLR start "entryRuleXClosure"
+    // InternalEntityMockDSL.g:7821:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
+    public final EObject entryRuleXClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXClosure = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7821:49: (iv_ruleXClosure= ruleXClosure EOF )
+            // InternalEntityMockDSL.g:7822:2: iv_ruleXClosure= ruleXClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXClosure=ruleXClosure();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXClosure; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXClosure"
+
+
+    // $ANTLR start "ruleXClosure"
+    // InternalEntityMockDSL.g:7828:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
+    public final EObject ruleXClosure() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_explicitSyntax_5_0=null;
+        Token otherlv_7=null;
+        EObject lv_declaredFormalParameters_2_0 = null;
+
+        EObject lv_declaredFormalParameters_4_0 = null;
+
+        EObject lv_expression_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7834:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
+            // InternalEntityMockDSL.g:7835:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            {
+            // InternalEntityMockDSL.g:7835:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            // InternalEntityMockDSL.g:7836:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
+            {
+            // InternalEntityMockDSL.g:7836:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
+            // InternalEntityMockDSL.g:7837:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
+            {
+            // InternalEntityMockDSL.g:7843:4: ( () otherlv_1= '[' )
+            // InternalEntityMockDSL.g:7844:5: () otherlv_1= '['
+            {
+            // InternalEntityMockDSL.g:7844:5: ()
+            // InternalEntityMockDSL.g:7845:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,96,FOLLOW_115); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:7857:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
+            int alt136=2;
+            alt136 = dfa136.predict(input);
+            switch (alt136) {
+                case 1 :
+                    // InternalEntityMockDSL.g:7858:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    {
+                    // InternalEntityMockDSL.g:7881:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalEntityMockDSL.g:7882:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
+                    {
+                    // InternalEntityMockDSL.g:7882:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
+                    int alt135=2;
+                    int LA135_0 = input.LA(1);
+
+                    if ( (LA135_0==RULE_ID||LA135_0==25||LA135_0==116) ) {
+                        alt135=1;
+                    }
+                    switch (alt135) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:7883:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:7883:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
+                            // InternalEntityMockDSL.g:7884:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            {
+                            // InternalEntityMockDSL.g:7884:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalEntityMockDSL.g:7885:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_116);
+                            lv_declaredFormalParameters_2_0=ruleJvmFormalParameter();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXClosureRule());
+                              								}
+                              								add(
+                              									current,
+                              									"declaredFormalParameters",
+                              									lv_declaredFormalParameters_2_0,
+                              									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:7902:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            loop134:
+                            do {
+                                int alt134=2;
+                                int LA134_0 = input.LA(1);
+
+                                if ( (LA134_0==26) ) {
+                                    alt134=1;
+                                }
+
+
+                                switch (alt134) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:7903:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    {
+                            	    otherlv_3=(Token)match(input,26,FOLLOW_39); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
+                            	      						
+                            	    }
+                            	    // InternalEntityMockDSL.g:7907:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalEntityMockDSL.g:7908:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    {
+                            	    // InternalEntityMockDSL.g:7908:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalEntityMockDSL.g:7909:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_116);
+                            	    lv_declaredFormalParameters_4_0=ruleJvmFormalParameter();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getXClosureRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"declaredFormalParameters",
+                            	      										lv_declaredFormalParameters_4_0,
+                            	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop134;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalEntityMockDSL.g:7928:5: ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalEntityMockDSL.g:7929:6: (lv_explicitSyntax_5_0= '|' )
+                    {
+                    // InternalEntityMockDSL.g:7929:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalEntityMockDSL.g:7930:7: lv_explicitSyntax_5_0= '|'
+                    {
+                    lv_explicitSyntax_5_0=(Token)match(input,128,FOLLOW_117); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getXClosureRule());
+                      							}
+                      							setWithLastConsumed(current, "explicitSyntax", true, "|");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:7944:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
+            // InternalEntityMockDSL.g:7945:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            {
+            // InternalEntityMockDSL.g:7945:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalEntityMockDSL.g:7946:5: lv_expression_6_0= ruleXExpressionInClosure
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_118);
+            lv_expression_6_0=ruleXExpressionInClosure();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXClosureRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_6_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_7=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXClosure"
+
+
+    // $ANTLR start "entryRuleXExpressionInClosure"
+    // InternalEntityMockDSL.g:7971:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
+    public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionInClosure = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:7971:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
+            // InternalEntityMockDSL.g:7972:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXExpressionInClosure=ruleXExpressionInClosure();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXExpressionInClosure; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXExpressionInClosure"
+
+
+    // $ANTLR start "ruleXExpressionInClosure"
+    // InternalEntityMockDSL.g:7978:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
+    public final EObject ruleXExpressionInClosure() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_expressions_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:7984:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
+            // InternalEntityMockDSL.g:7985:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            {
+            // InternalEntityMockDSL.g:7985:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalEntityMockDSL.g:7986:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            {
+            // InternalEntityMockDSL.g:7986:3: ()
+            // InternalEntityMockDSL.g:7987:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:7993:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            loop138:
+            do {
+                int alt138=2;
+                int LA138_0 = input.LA(1);
+
+                if ( ((LA138_0>=RULE_ID && LA138_0<=RULE_DECIMAL)||LA138_0==14||LA138_0==25||LA138_0==31||LA138_0==77||(LA138_0>=87 && LA138_0<=89)||(LA138_0>=95 && LA138_0<=96)||LA138_0==103||LA138_0==119||LA138_0==123||LA138_0==129||LA138_0==131||(LA138_0>=135 && LA138_0<=148)||LA138_0==150) ) {
+                    alt138=1;
+                }
+
+
+                switch (alt138) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:7994:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
+            	    {
+            	    // InternalEntityMockDSL.g:7994:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalEntityMockDSL.g:7995:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalEntityMockDSL.g:7995:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalEntityMockDSL.g:7996:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_119);
+            	    lv_expressions_1_0=ruleXExpressionOrVarDeclaration();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"expressions",
+            	      							lv_expressions_1_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:8013:4: (otherlv_2= ';' )?
+            	    int alt137=2;
+            	    int LA137_0 = input.LA(1);
+
+            	    if ( (LA137_0==92) ) {
+            	        alt137=1;
+            	    }
+            	    switch (alt137) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:8014:5: otherlv_2= ';'
+            	            {
+            	            otherlv_2=(Token)match(input,92,FOLLOW_120); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop138;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXExpressionInClosure"
+
+
+    // $ANTLR start "entryRuleXShortClosure"
+    // InternalEntityMockDSL.g:8024:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
+    public final EObject entryRuleXShortClosure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXShortClosure = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8024:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
+            // InternalEntityMockDSL.g:8025:2: iv_ruleXShortClosure= ruleXShortClosure EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXShortClosureRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXShortClosure=ruleXShortClosure();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXShortClosure; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXShortClosure"
+
+
+    // $ANTLR start "ruleXShortClosure"
+    // InternalEntityMockDSL.g:8031:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXShortClosure() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_explicitSyntax_4_0=null;
+        EObject lv_declaredFormalParameters_1_0 = null;
+
+        EObject lv_declaredFormalParameters_3_0 = null;
+
+        EObject lv_expression_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8037:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:8038:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:8038:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:8039:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:8039:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
+            // InternalEntityMockDSL.g:8040:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            {
+            // InternalEntityMockDSL.g:8065:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalEntityMockDSL.g:8066:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
+            {
+            // InternalEntityMockDSL.g:8066:5: ()
+            // InternalEntityMockDSL.g:8067:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:8073:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
+            int alt140=2;
+            int LA140_0 = input.LA(1);
+
+            if ( (LA140_0==RULE_ID||LA140_0==25||LA140_0==116) ) {
+                alt140=1;
+            }
+            switch (alt140) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8074:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:8074:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
+                    // InternalEntityMockDSL.g:8075:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    {
+                    // InternalEntityMockDSL.g:8075:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalEntityMockDSL.g:8076:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_116);
+                    lv_declaredFormalParameters_1_0=ruleJvmFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      								if (current==null) {
+                      									current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+                      								}
+                      								add(
+                      									current,
+                      									"declaredFormalParameters",
+                      									lv_declaredFormalParameters_1_0,
+                      									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                      								afterParserOrEnumRuleCall();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:8093:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    loop139:
+                    do {
+                        int alt139=2;
+                        int LA139_0 = input.LA(1);
+
+                        if ( (LA139_0==26) ) {
+                            alt139=1;
+                        }
+
+
+                        switch (alt139) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:8094:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    {
+                    	    otherlv_2=(Token)match(input,26,FOLLOW_39); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
+                    	      						
+                    	    }
+                    	    // InternalEntityMockDSL.g:8098:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalEntityMockDSL.g:8099:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    {
+                    	    // InternalEntityMockDSL.g:8099:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalEntityMockDSL.g:8100:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
+                    	      								
+                    	    }
+                    	    pushFollow(FOLLOW_116);
+                    	    lv_declaredFormalParameters_3_0=ruleJvmFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      									if (current==null) {
+                    	      										current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+                    	      									}
+                    	      									add(
+                    	      										current,
+                    	      										"declaredFormalParameters",
+                    	      										lv_declaredFormalParameters_3_0,
+                    	      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                    	      									afterParserOrEnumRuleCall();
+                    	      								
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop139;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:8119:5: ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalEntityMockDSL.g:8120:6: (lv_explicitSyntax_4_0= '|' )
+            {
+            // InternalEntityMockDSL.g:8120:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalEntityMockDSL.g:8121:7: lv_explicitSyntax_4_0= '|'
+            {
+            lv_explicitSyntax_4_0=(Token)match(input,128,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
+              						
+            }
+            if ( state.backtracking==0 ) {
+
+              							if (current==null) {
+              								current = createModelElement(grammarAccess.getXShortClosureRule());
+              							}
+              							setWithLastConsumed(current, "explicitSyntax", true, "|");
+              						
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:8135:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8136:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8136:4: (lv_expression_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8137:5: lv_expression_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_expression_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXShortClosureRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXShortClosure"
+
+
+    // $ANTLR start "entryRuleXParenthesizedExpression"
+    // InternalEntityMockDSL.g:8158:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
+    public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXParenthesizedExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8158:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
+            // InternalEntityMockDSL.g:8159:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXParenthesizedExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXParenthesizedExpression"
+
+
+    // $ANTLR start "ruleXParenthesizedExpression"
+    // InternalEntityMockDSL.g:8165:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
+    public final EObject ruleXParenthesizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject this_XExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8171:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
+            // InternalEntityMockDSL.g:8172:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            {
+            // InternalEntityMockDSL.g:8172:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalEntityMockDSL.g:8173:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
+            {
+            otherlv_0=(Token)match(input,25,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
+              		
+            }
+            pushFollow(FOLLOW_82);
+            this_XExpression_1=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_XExpression_1;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            otherlv_2=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXParenthesizedExpression"
+
+
+    // $ANTLR start "entryRuleXIfExpression"
+    // InternalEntityMockDSL.g:8193:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
+    public final EObject entryRuleXIfExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXIfExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8193:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
+            // InternalEntityMockDSL.g:8194:2: iv_ruleXIfExpression= ruleXIfExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXIfExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXIfExpression=ruleXIfExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXIfExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXIfExpression"
+
+
+    // $ANTLR start "ruleXIfExpression"
+    // InternalEntityMockDSL.g:8200:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
+    public final EObject ruleXIfExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_if_3_0 = null;
+
+        EObject lv_then_5_0 = null;
+
+        EObject lv_else_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8206:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
+            // InternalEntityMockDSL.g:8207:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            {
+            // InternalEntityMockDSL.g:8207:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            // InternalEntityMockDSL.g:8208:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            {
+            // InternalEntityMockDSL.g:8208:3: ()
+            // InternalEntityMockDSL.g:8209:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,129,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:8223:3: ( (lv_if_3_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8224:4: (lv_if_3_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8224:4: (lv_if_3_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8225:5: lv_if_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_if_3_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+              					}
+              					set(
+              						current,
+              						"if",
+              						lv_if_3_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:8246:3: ( (lv_then_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8247:4: (lv_then_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8247:4: (lv_then_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8248:5: lv_then_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_121);
+            lv_then_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+              					}
+              					set(
+              						current,
+              						"then",
+              						lv_then_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:8265:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            int alt141=2;
+            int LA141_0 = input.LA(1);
+
+            if ( (LA141_0==130) ) {
+                int LA141_1 = input.LA(2);
+
+                if ( (synpred31_InternalEntityMockDSL()) ) {
+                    alt141=1;
+                }
+            }
+            switch (alt141) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8266:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
+                    {
+                    // InternalEntityMockDSL.g:8266:4: ( ( 'else' )=>otherlv_6= 'else' )
+                    // InternalEntityMockDSL.g:8267:5: ( 'else' )=>otherlv_6= 'else'
+                    {
+                    otherlv_6=(Token)match(input,130,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:8273:4: ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8274:5: (lv_else_7_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8274:5: (lv_else_7_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8275:6: lv_else_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_else_7_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"else",
+                      							lv_else_7_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXIfExpression"
+
+
+    // $ANTLR start "entryRuleXSwitchExpression"
+    // InternalEntityMockDSL.g:8297:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
+    public final EObject entryRuleXSwitchExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSwitchExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8297:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
+            // InternalEntityMockDSL.g:8298:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXSwitchExpression=ruleXSwitchExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXSwitchExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXSwitchExpression"
+
+
+    // $ANTLR start "ruleXSwitchExpression"
+    // InternalEntityMockDSL.g:8304:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
+    public final EObject ruleXSwitchExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        EObject lv_declaredParam_3_0 = null;
+
+        EObject lv_switch_5_0 = null;
+
+        EObject lv_declaredParam_7_0 = null;
+
+        EObject lv_switch_9_0 = null;
+
+        EObject lv_cases_11_0 = null;
+
+        EObject lv_default_14_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8310:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
+            // InternalEntityMockDSL.g:8311:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            {
+            // InternalEntityMockDSL.g:8311:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            // InternalEntityMockDSL.g:8312:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
+            {
+            // InternalEntityMockDSL.g:8312:3: ()
+            // InternalEntityMockDSL.g:8313:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,131,FOLLOW_122); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:8323:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
+            int alt143=2;
+            alt143 = dfa143.predict(input);
+            switch (alt143) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8324:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    {
+                    // InternalEntityMockDSL.g:8324:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalEntityMockDSL.g:8325:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
+                    {
+                    // InternalEntityMockDSL.g:8325:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+                    // InternalEntityMockDSL.g:8326:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    {
+                    // InternalEntityMockDSL.g:8336:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalEntityMockDSL.g:8337:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+                    {
+                    otherlv_2=(Token)match(input,25,FOLLOW_39); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
+                      						
+                    }
+                    // InternalEntityMockDSL.g:8341:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+                    // InternalEntityMockDSL.g:8342:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    {
+                    // InternalEntityMockDSL.g:8342:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalEntityMockDSL.g:8343:9: lv_declaredParam_3_0= ruleJvmFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
+                      								
+                    }
+                    pushFollow(FOLLOW_123);
+                    lv_declaredParam_3_0=ruleJvmFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      									if (current==null) {
+                      										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+                      									}
+                      									set(
+                      										current,
+                      										"declaredParam",
+                      										lv_declaredParam_3_0,
+                      										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                      									afterParserOrEnumRuleCall();
+                      								
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:8366:5: ( (lv_switch_5_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8367:6: (lv_switch_5_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8367:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8368:7: lv_switch_5_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_82);
+                    lv_switch_5_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"switch",
+                      								lv_switch_5_0,
+                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_6=(Token)match(input,27,FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:8391:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    {
+                    // InternalEntityMockDSL.g:8391:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalEntityMockDSL.g:8392:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
+                    {
+                    // InternalEntityMockDSL.g:8392:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
+                    int alt142=2;
+                    alt142 = dfa142.predict(input);
+                    switch (alt142) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:8393:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            {
+                            // InternalEntityMockDSL.g:8402:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalEntityMockDSL.g:8403:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
+                            {
+                            // InternalEntityMockDSL.g:8403:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
+                            // InternalEntityMockDSL.g:8404:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            {
+                            // InternalEntityMockDSL.g:8404:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalEntityMockDSL.g:8405:9: lv_declaredParam_7_0= ruleJvmFormalParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
+                              								
+                            }
+                            pushFollow(FOLLOW_123);
+                            lv_declaredParam_7_0=ruleJvmFormalParameter();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              									if (current==null) {
+                              										current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+                              									}
+                              									set(
+                              										current,
+                              										"declaredParam",
+                              										lv_declaredParam_7_0,
+                              										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+                              									afterParserOrEnumRuleCall();
+                              								
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_8=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalEntityMockDSL.g:8428:5: ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8429:6: (lv_switch_9_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8429:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8430:7: lv_switch_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_12);
+                    lv_switch_9_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"switch",
+                      								lv_switch_9_0,
+                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,14,FOLLOW_124); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:8453:3: ( (lv_cases_11_0= ruleXCasePart ) )*
+            loop144:
+            do {
+                int alt144=2;
+                int LA144_0 = input.LA(1);
+
+                if ( (LA144_0==RULE_ID||(LA144_0>=25 && LA144_0<=26)||LA144_0==116||LA144_0==132||LA144_0==134) ) {
+                    alt144=1;
+                }
+
+
+                switch (alt144) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:8454:4: (lv_cases_11_0= ruleXCasePart )
+            	    {
+            	    // InternalEntityMockDSL.g:8454:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalEntityMockDSL.g:8455:5: lv_cases_11_0= ruleXCasePart
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_124);
+            	    lv_cases_11_0=ruleXCasePart();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"cases",
+            	      						lv_cases_11_0,
+            	      						"org.eclipse.xtext.xbase.Xbase.XCasePart");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop144;
+                }
+            } while (true);
+
+            // InternalEntityMockDSL.g:8472:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
+            int alt145=2;
+            int LA145_0 = input.LA(1);
+
+            if ( (LA145_0==133) ) {
+                alt145=1;
+            }
+            switch (alt145) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8473:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
+                    {
+                    otherlv_12=(Token)match(input,133,FOLLOW_123); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
+                      			
+                    }
+                    otherlv_13=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:8481:4: ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8482:5: (lv_default_14_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8482:5: (lv_default_14_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8483:6: lv_default_14_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_22);
+                    lv_default_14_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"default",
+                      							lv_default_14_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_15=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXSwitchExpression"
+
+
+    // $ANTLR start "entryRuleXCasePart"
+    // InternalEntityMockDSL.g:8509:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
+    public final EObject entryRuleXCasePart() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCasePart = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8509:50: (iv_ruleXCasePart= ruleXCasePart EOF )
+            // InternalEntityMockDSL.g:8510:2: iv_ruleXCasePart= ruleXCasePart EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXCasePartRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXCasePart=ruleXCasePart();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXCasePart; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXCasePart"
+
+
+    // $ANTLR start "ruleXCasePart"
+    // InternalEntityMockDSL.g:8516:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
+    public final EObject ruleXCasePart() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_fallThrough_6_0=null;
+        EObject lv_typeGuard_1_0 = null;
+
+        EObject lv_case_3_0 = null;
+
+        EObject lv_then_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8522:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
+            // InternalEntityMockDSL.g:8523:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            {
+            // InternalEntityMockDSL.g:8523:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            // InternalEntityMockDSL.g:8524:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            {
+            // InternalEntityMockDSL.g:8524:3: ()
+            // InternalEntityMockDSL.g:8525:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:8531:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
+            int alt146=2;
+            int LA146_0 = input.LA(1);
+
+            if ( (LA146_0==RULE_ID||LA146_0==25||LA146_0==116) ) {
+                alt146=1;
+            }
+            switch (alt146) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8532:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:8532:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalEntityMockDSL.g:8533:5: lv_typeGuard_1_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_125);
+                    lv_typeGuard_1_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXCasePartRule());
+                      					}
+                      					set(
+                      						current,
+                      						"typeGuard",
+                      						lv_typeGuard_1_0,
+                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:8550:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
+            int alt147=2;
+            int LA147_0 = input.LA(1);
+
+            if ( (LA147_0==134) ) {
+                alt147=1;
+            }
+            switch (alt147) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8551:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
+                    {
+                    otherlv_2=(Token)match(input,134,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:8555:4: ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8556:5: (lv_case_3_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8556:5: (lv_case_3_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8557:6: lv_case_3_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_126);
+                    lv_case_3_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXCasePartRule());
+                      						}
+                      						set(
+                      							current,
+                      							"case",
+                      							lv_case_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:8575:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            int alt148=2;
+            int LA148_0 = input.LA(1);
+
+            if ( (LA148_0==132) ) {
+                alt148=1;
+            }
+            else if ( (LA148_0==26) ) {
+                alt148=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 148, 0, input);
+
+                throw nvae;
+            }
+            switch (alt148) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8576:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    {
+                    // InternalEntityMockDSL.g:8576:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalEntityMockDSL.g:8577:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:8581:5: ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8582:6: (lv_then_5_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8582:6: (lv_then_5_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8583:7: lv_then_5_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_then_5_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXCasePartRule());
+                      							}
+                      							set(
+                      								current,
+                      								"then",
+                      								lv_then_5_0,
+                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:8602:4: ( (lv_fallThrough_6_0= ',' ) )
+                    {
+                    // InternalEntityMockDSL.g:8602:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalEntityMockDSL.g:8603:5: (lv_fallThrough_6_0= ',' )
+                    {
+                    // InternalEntityMockDSL.g:8603:5: (lv_fallThrough_6_0= ',' )
+                    // InternalEntityMockDSL.g:8604:6: lv_fallThrough_6_0= ','
+                    {
+                    lv_fallThrough_6_0=(Token)match(input,26,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXCasePartRule());
+                      						}
+                      						setWithLastConsumed(current, "fallThrough", true, ",");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXCasePart"
+
+
+    // $ANTLR start "entryRuleXForLoopExpression"
+    // InternalEntityMockDSL.g:8621:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
+    public final EObject entryRuleXForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXForLoopExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8621:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
+            // InternalEntityMockDSL.g:8622:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXForLoopExpression=ruleXForLoopExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXForLoopExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXForLoopExpression"
+
+
+    // $ANTLR start "ruleXForLoopExpression"
+    // InternalEntityMockDSL.g:8628:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_declaredParam_3_0 = null;
+
+        EObject lv_forExpression_5_0 = null;
+
+        EObject lv_eachExpression_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8634:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:8635:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:8635:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:8636:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:8636:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+            // InternalEntityMockDSL.g:8637:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            {
+            // InternalEntityMockDSL.g:8650:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalEntityMockDSL.g:8651:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+            {
+            // InternalEntityMockDSL.g:8651:5: ()
+            // InternalEntityMockDSL.g:8652:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,135,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+            // InternalEntityMockDSL.g:8666:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:8667:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:8667:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalEntityMockDSL.g:8668:7: lv_declaredParam_3_0= ruleJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
+              						
+            }
+            pushFollow(FOLLOW_123);
+            lv_declaredParam_3_0=ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              							if (current==null) {
+              								current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+              							}
+              							set(
+              								current,
+              								"declaredParam",
+              								lv_declaredParam_3_0,
+              								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
+              							afterParserOrEnumRuleCall();
+              						
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:8691:3: ( (lv_forExpression_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8692:4: (lv_forExpression_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8692:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8693:5: lv_forExpression_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_forExpression_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+              					}
+              					set(
+              						current,
+              						"forExpression",
+              						lv_forExpression_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:8714:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8715:4: (lv_eachExpression_7_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8715:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8716:5: lv_eachExpression_7_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_eachExpression_7_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
+              					}
+              					set(
+              						current,
+              						"eachExpression",
+              						lv_eachExpression_7_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXForLoopExpression"
+
+
+    // $ANTLR start "entryRuleXBasicForLoopExpression"
+    // InternalEntityMockDSL.g:8737:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
+    public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBasicForLoopExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8737:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
+            // InternalEntityMockDSL.g:8738:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXBasicForLoopExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXBasicForLoopExpression"
+
+
+    // $ANTLR start "ruleXBasicForLoopExpression"
+    // InternalEntityMockDSL.g:8744:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        EObject lv_initExpressions_3_0 = null;
+
+        EObject lv_initExpressions_5_0 = null;
+
+        EObject lv_expression_7_0 = null;
+
+        EObject lv_updateExpressions_9_0 = null;
+
+        EObject lv_updateExpressions_11_0 = null;
+
+        EObject lv_eachExpression_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8750:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:8751:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:8751:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:8752:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:8752:3: ()
+            // InternalEntityMockDSL.g:8753:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,135,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_127); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:8767:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
+            int alt150=2;
+            int LA150_0 = input.LA(1);
+
+            if ( ((LA150_0>=RULE_ID && LA150_0<=RULE_DECIMAL)||LA150_0==14||LA150_0==25||LA150_0==31||LA150_0==77||(LA150_0>=87 && LA150_0<=89)||(LA150_0>=95 && LA150_0<=96)||LA150_0==103||LA150_0==119||LA150_0==123||LA150_0==129||LA150_0==131||(LA150_0>=135 && LA150_0<=148)||LA150_0==150) ) {
+                alt150=1;
+            }
+            switch (alt150) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8768:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:8768:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
+                    // InternalEntityMockDSL.g:8769:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    {
+                    // InternalEntityMockDSL.g:8769:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalEntityMockDSL.g:8770:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_128);
+                    lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"initExpressions",
+                      							lv_initExpressions_3_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:8787:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    loop149:
+                    do {
+                        int alt149=2;
+                        int LA149_0 = input.LA(1);
+
+                        if ( (LA149_0==26) ) {
+                            alt149=1;
+                        }
+
+
+                        switch (alt149) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:8788:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,26,FOLLOW_129); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:8792:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalEntityMockDSL.g:8793:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    {
+                    	    // InternalEntityMockDSL.g:8793:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalEntityMockDSL.g:8794:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_128);
+                    	    lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"initExpressions",
+                    	      								lv_initExpressions_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop149;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,92,FOLLOW_130); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:8817:3: ( (lv_expression_7_0= ruleXExpression ) )?
+            int alt151=2;
+            int LA151_0 = input.LA(1);
+
+            if ( ((LA151_0>=RULE_ID && LA151_0<=RULE_DECIMAL)||LA151_0==14||LA151_0==25||LA151_0==77||(LA151_0>=87 && LA151_0<=89)||(LA151_0>=95 && LA151_0<=96)||LA151_0==103||LA151_0==119||LA151_0==123||LA151_0==129||LA151_0==131||(LA151_0>=135 && LA151_0<=137)||(LA151_0>=139 && LA151_0<=148)||LA151_0==150) ) {
+                alt151=1;
+            }
+            switch (alt151) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8818:4: (lv_expression_7_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8818:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8819:5: lv_expression_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_131);
+                    lv_expression_7_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"expression",
+                      						lv_expression_7_0,
+                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_8=(Token)match(input,92,FOLLOW_81); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
+              		
+            }
+            // InternalEntityMockDSL.g:8840:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
+            int alt153=2;
+            int LA153_0 = input.LA(1);
+
+            if ( ((LA153_0>=RULE_ID && LA153_0<=RULE_DECIMAL)||LA153_0==14||LA153_0==25||LA153_0==77||(LA153_0>=87 && LA153_0<=89)||(LA153_0>=95 && LA153_0<=96)||LA153_0==103||LA153_0==119||LA153_0==123||LA153_0==129||LA153_0==131||(LA153_0>=135 && LA153_0<=137)||(LA153_0>=139 && LA153_0<=148)||LA153_0==150) ) {
+                alt153=1;
+            }
+            switch (alt153) {
+                case 1 :
+                    // InternalEntityMockDSL.g:8841:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    {
+                    // InternalEntityMockDSL.g:8841:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:8842:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:8842:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:8843:6: lv_updateExpressions_9_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_38);
+                    lv_updateExpressions_9_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"updateExpressions",
+                      							lv_updateExpressions_9_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:8860:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    loop152:
+                    do {
+                        int alt152=2;
+                        int LA152_0 = input.LA(1);
+
+                        if ( (LA152_0==26) ) {
+                            alt152=1;
+                        }
+
+
+                        switch (alt152) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:8861:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    {
+                    	    otherlv_10=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:8865:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalEntityMockDSL.g:8866:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    {
+                    	    // InternalEntityMockDSL.g:8866:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalEntityMockDSL.g:8867:7: lv_updateExpressions_11_0= ruleXExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_38);
+                    	    lv_updateExpressions_11_0=ruleXExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"updateExpressions",
+                    	      								lv_updateExpressions_11_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop152;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_12=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
+              		
+            }
+            // InternalEntityMockDSL.g:8890:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8891:4: (lv_eachExpression_13_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8891:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8892:5: lv_eachExpression_13_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_eachExpression_13_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
+              					}
+              					set(
+              						current,
+              						"eachExpression",
+              						lv_eachExpression_13_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXBasicForLoopExpression"
+
+
+    // $ANTLR start "entryRuleXWhileExpression"
+    // InternalEntityMockDSL.g:8913:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
+    public final EObject entryRuleXWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXWhileExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8913:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
+            // InternalEntityMockDSL.g:8914:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXWhileExpression=ruleXWhileExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXWhileExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXWhileExpression"
+
+
+    // $ANTLR start "ruleXWhileExpression"
+    // InternalEntityMockDSL.g:8920:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_predicate_3_0 = null;
+
+        EObject lv_body_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:8926:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:8927:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:8927:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:8928:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:8928:3: ()
+            // InternalEntityMockDSL.g:8929:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,136,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:8943:3: ( (lv_predicate_3_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8944:4: (lv_predicate_3_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8944:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8945:5: lv_predicate_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_predicate_3_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
+              					}
+              					set(
+              						current,
+              						"predicate",
+              						lv_predicate_3_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:8966:3: ( (lv_body_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:8967:4: (lv_body_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:8967:4: (lv_body_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:8968:5: lv_body_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_body_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
+              					}
+              					set(
+              						current,
+              						"body",
+              						lv_body_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXWhileExpression"
+
+
+    // $ANTLR start "entryRuleXDoWhileExpression"
+    // InternalEntityMockDSL.g:8989:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
+    public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXDoWhileExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:8989:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
+            // InternalEntityMockDSL.g:8990:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXDoWhileExpression=ruleXDoWhileExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXDoWhileExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXDoWhileExpression"
+
+
+    // $ANTLR start "ruleXDoWhileExpression"
+    // InternalEntityMockDSL.g:8996:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
+    public final EObject ruleXDoWhileExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_body_2_0 = null;
+
+        EObject lv_predicate_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9002:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
+            // InternalEntityMockDSL.g:9003:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            {
+            // InternalEntityMockDSL.g:9003:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalEntityMockDSL.g:9004:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
+            {
+            // InternalEntityMockDSL.g:9004:3: ()
+            // InternalEntityMockDSL.g:9005:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,137,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:9015:3: ( (lv_body_2_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:9016:4: (lv_body_2_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:9016:4: (lv_body_2_0= ruleXExpression )
+            // InternalEntityMockDSL.g:9017:5: lv_body_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_132);
+            lv_body_2_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
+              					}
+              					set(
+              						current,
+              						"body",
+              						lv_body_2_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,136,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
+              		
+            }
+            otherlv_4=(Token)match(input,25,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
+              		
+            }
+            // InternalEntityMockDSL.g:9042:3: ( (lv_predicate_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:9043:4: (lv_predicate_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:9043:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:9044:5: lv_predicate_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_predicate_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
+              					}
+              					set(
+              						current,
+              						"predicate",
+              						lv_predicate_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXDoWhileExpression"
+
+
+    // $ANTLR start "entryRuleXBlockExpression"
+    // InternalEntityMockDSL.g:9069:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
+    public final EObject entryRuleXBlockExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBlockExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9069:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
+            // InternalEntityMockDSL.g:9070:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXBlockExpression=ruleXBlockExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXBlockExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXBlockExpression"
+
+
+    // $ANTLR start "ruleXBlockExpression"
+    // InternalEntityMockDSL.g:9076:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
+    public final EObject ruleXBlockExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        EObject lv_expressions_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9082:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
+            // InternalEntityMockDSL.g:9083:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            {
+            // InternalEntityMockDSL.g:9083:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalEntityMockDSL.g:9084:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
+            {
+            // InternalEntityMockDSL.g:9084:3: ()
+            // InternalEntityMockDSL.g:9085:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,14,FOLLOW_133); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:9095:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
+            loop155:
+            do {
+                int alt155=2;
+                int LA155_0 = input.LA(1);
+
+                if ( ((LA155_0>=RULE_ID && LA155_0<=RULE_DECIMAL)||LA155_0==14||LA155_0==25||LA155_0==31||LA155_0==77||(LA155_0>=87 && LA155_0<=89)||(LA155_0>=95 && LA155_0<=96)||LA155_0==103||LA155_0==119||LA155_0==123||LA155_0==129||LA155_0==131||(LA155_0>=135 && LA155_0<=148)||LA155_0==150) ) {
+                    alt155=1;
+                }
+
+
+                switch (alt155) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:9096:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
+            	    {
+            	    // InternalEntityMockDSL.g:9096:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalEntityMockDSL.g:9097:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    {
+            	    // InternalEntityMockDSL.g:9097:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalEntityMockDSL.g:9098:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
+            	      					
+            	    }
+            	    pushFollow(FOLLOW_134);
+            	    lv_expressions_2_0=ruleXExpressionOrVarDeclaration();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"expressions",
+            	      							lv_expressions_2_0,
+            	      							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalEntityMockDSL.g:9115:4: (otherlv_3= ';' )?
+            	    int alt154=2;
+            	    int LA154_0 = input.LA(1);
+
+            	    if ( (LA154_0==92) ) {
+            	        alt154=1;
+            	    }
+            	    switch (alt154) {
+            	        case 1 :
+            	            // InternalEntityMockDSL.g:9116:5: otherlv_3= ';'
+            	            {
+            	            otherlv_3=(Token)match(input,92,FOLLOW_133); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop155;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXBlockExpression"
+
+
+    // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
+    // InternalEntityMockDSL.g:9130:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
+    public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXExpressionOrVarDeclaration = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9130:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
+            // InternalEntityMockDSL.g:9131:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXExpressionOrVarDeclaration; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXExpressionOrVarDeclaration"
+
+
+    // $ANTLR start "ruleXExpressionOrVarDeclaration"
+    // InternalEntityMockDSL.g:9137:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
+    public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XVariableDeclaration_0 = null;
+
+        EObject this_XExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9143:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
+            // InternalEntityMockDSL.g:9144:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:9144:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            int alt156=2;
+            int LA156_0 = input.LA(1);
+
+            if ( (LA156_0==31||LA156_0==138) ) {
+                alt156=1;
+            }
+            else if ( ((LA156_0>=RULE_ID && LA156_0<=RULE_DECIMAL)||LA156_0==14||LA156_0==25||LA156_0==77||(LA156_0>=87 && LA156_0<=89)||(LA156_0>=95 && LA156_0<=96)||LA156_0==103||LA156_0==119||LA156_0==123||LA156_0==129||LA156_0==131||(LA156_0>=135 && LA156_0<=137)||(LA156_0>=139 && LA156_0<=148)||LA156_0==150) ) {
+                alt156=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 156, 0, input);
+
+                throw nvae;
+            }
+            switch (alt156) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9145:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XVariableDeclaration_0=ruleXVariableDeclaration();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XVariableDeclaration_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:9154:3: this_XExpression_1= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XExpression_1=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXExpressionOrVarDeclaration"
+
+
+    // $ANTLR start "entryRuleXVariableDeclaration"
+    // InternalEntityMockDSL.g:9166:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
+    public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXVariableDeclaration = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9166:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
+            // InternalEntityMockDSL.g:9167:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXVariableDeclaration=ruleXVariableDeclaration();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXVariableDeclaration; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXVariableDeclaration"
+
+
+    // $ANTLR start "ruleXVariableDeclaration"
+    // InternalEntityMockDSL.g:9173:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
+    public final EObject ruleXVariableDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_writeable_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        EObject lv_type_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_5_0 = null;
+
+        EObject lv_right_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9179:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
+            // InternalEntityMockDSL.g:9180:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            {
+            // InternalEntityMockDSL.g:9180:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            // InternalEntityMockDSL.g:9181:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            {
+            // InternalEntityMockDSL.g:9181:3: ()
+            // InternalEntityMockDSL.g:9182:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:9188:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
+            int alt157=2;
+            int LA157_0 = input.LA(1);
+
+            if ( (LA157_0==31) ) {
+                alt157=1;
+            }
+            else if ( (LA157_0==138) ) {
+                alt157=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 157, 0, input);
+
+                throw nvae;
+            }
+            switch (alt157) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9189:4: ( (lv_writeable_1_0= 'var' ) )
+                    {
+                    // InternalEntityMockDSL.g:9189:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalEntityMockDSL.g:9190:5: (lv_writeable_1_0= 'var' )
+                    {
+                    // InternalEntityMockDSL.g:9190:5: (lv_writeable_1_0= 'var' )
+                    // InternalEntityMockDSL.g:9191:6: lv_writeable_1_0= 'var'
+                    {
+                    lv_writeable_1_0=(Token)match(input,31,FOLLOW_39); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXVariableDeclarationRule());
+                      						}
+                      						setWithLastConsumed(current, "writeable", true, "var");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:9204:4: otherlv_2= 'val'
+                    {
+                    otherlv_2=(Token)match(input,138,FOLLOW_39); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9209:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
+            int alt158=2;
+            int LA158_0 = input.LA(1);
+
+            if ( (LA158_0==RULE_ID) ) {
+                int LA158_1 = input.LA(2);
+
+                if ( (synpred35_InternalEntityMockDSL()) ) {
+                    alt158=1;
+                }
+                else if ( (true) ) {
+                    alt158=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 158, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA158_0==25) && (synpred35_InternalEntityMockDSL())) {
+                alt158=1;
+            }
+            else if ( (LA158_0==116) && (synpred35_InternalEntityMockDSL())) {
+                alt158=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 158, 0, input);
+
+                throw nvae;
+            }
+            switch (alt158) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9210:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    {
+                    // InternalEntityMockDSL.g:9210:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalEntityMockDSL.g:9211:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    {
+                    // InternalEntityMockDSL.g:9224:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalEntityMockDSL.g:9225:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
+                    {
+                    // InternalEntityMockDSL.g:9225:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
+                    // InternalEntityMockDSL.g:9226:7: (lv_type_3_0= ruleJvmTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:9226:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalEntityMockDSL.g:9227:8: lv_type_3_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_4);
+                    lv_type_3_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      								if (current==null) {
+                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+                      								}
+                      								set(
+                      									current,
+                      									"type",
+                      									lv_type_3_0,
+                      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      								afterParserOrEnumRuleCall();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:9244:6: ( (lv_name_4_0= ruleValidID ) )
+                    // InternalEntityMockDSL.g:9245:7: (lv_name_4_0= ruleValidID )
+                    {
+                    // InternalEntityMockDSL.g:9245:7: (lv_name_4_0= ruleValidID )
+                    // InternalEntityMockDSL.g:9246:8: lv_name_4_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
+                      							
+                    }
+                    pushFollow(FOLLOW_135);
+                    lv_name_4_0=ruleValidID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      								if (current==null) {
+                      									current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+                      								}
+                      								set(
+                      									current,
+                      									"name",
+                      									lv_name_4_0,
+                      									"org.eclipse.xtext.xbase.Xtype.ValidID");
+                      								afterParserOrEnumRuleCall();
+                      							
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:9266:4: ( (lv_name_5_0= ruleValidID ) )
+                    {
+                    // InternalEntityMockDSL.g:9266:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalEntityMockDSL.g:9267:5: (lv_name_5_0= ruleValidID )
+                    {
+                    // InternalEntityMockDSL.g:9267:5: (lv_name_5_0= ruleValidID )
+                    // InternalEntityMockDSL.g:9268:6: lv_name_5_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_135);
+                    lv_name_5_0=ruleValidID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_5_0,
+                      							"org.eclipse.xtext.xbase.Xtype.ValidID");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9286:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            int alt159=2;
+            int LA159_0 = input.LA(1);
+
+            if ( (LA159_0==94) ) {
+                alt159=1;
+            }
+            switch (alt159) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9287:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:9291:4: ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:9292:5: (lv_right_7_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:9292:5: (lv_right_7_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:9293:6: lv_right_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_right_7_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"right",
+                      							lv_right_7_0,
+                      							"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXVariableDeclaration"
+
+
+    // $ANTLR start "entryRuleJvmFormalParameter"
+    // InternalEntityMockDSL.g:9315:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
+    public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmFormalParameter = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9315:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
+            // InternalEntityMockDSL.g:9316:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmFormalParameter=ruleJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmFormalParameter; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmFormalParameter"
+
+
+    // $ANTLR start "ruleJvmFormalParameter"
+    // InternalEntityMockDSL.g:9322:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
+    public final EObject ruleJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_parameterType_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9328:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalEntityMockDSL.g:9329:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalEntityMockDSL.g:9329:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalEntityMockDSL.g:9330:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalEntityMockDSL.g:9330:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
+            int alt160=2;
+            int LA160_0 = input.LA(1);
+
+            if ( (LA160_0==RULE_ID) ) {
+                int LA160_1 = input.LA(2);
+
+                if ( (LA160_1==RULE_ID||LA160_1==34||LA160_1==96||LA160_1==103) ) {
+                    alt160=1;
+                }
+            }
+            else if ( (LA160_0==25||LA160_0==116) ) {
+                alt160=1;
+            }
+            switch (alt160) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9331:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:9331:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalEntityMockDSL.g:9332:5: lv_parameterType_0_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_4);
+                    lv_parameterType_0_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"parameterType",
+                      						lv_parameterType_0_0,
+                      						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9349:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalEntityMockDSL.g:9350:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalEntityMockDSL.g:9350:4: (lv_name_1_0= ruleValidID )
+            // InternalEntityMockDSL.g:9351:5: lv_name_1_0= ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_name_1_0=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ValidID");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmFormalParameter"
+
+
+    // $ANTLR start "entryRuleFullJvmFormalParameter"
+    // InternalEntityMockDSL.g:9372:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
+    public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFullJvmFormalParameter = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9372:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
+            // InternalEntityMockDSL.g:9373:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFullJvmFormalParameter; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFullJvmFormalParameter"
+
+
+    // $ANTLR start "ruleFullJvmFormalParameter"
+    // InternalEntityMockDSL.g:9379:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
+    public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_parameterType_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9385:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalEntityMockDSL.g:9386:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            {
+            // InternalEntityMockDSL.g:9386:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalEntityMockDSL.g:9387:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
+            {
+            // InternalEntityMockDSL.g:9387:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:9388:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:9388:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:9389:5: lv_parameterType_0_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FOLLOW_4);
+            lv_parameterType_0_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
+              					}
+              					set(
+              						current,
+              						"parameterType",
+              						lv_parameterType_0_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:9406:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalEntityMockDSL.g:9407:4: (lv_name_1_0= ruleValidID )
+            {
+            // InternalEntityMockDSL.g:9407:4: (lv_name_1_0= ruleValidID )
+            // InternalEntityMockDSL.g:9408:5: lv_name_1_0= ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_name_1_0=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.ValidID");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFullJvmFormalParameter"
+
+
+    // $ANTLR start "entryRuleXFeatureCall"
+    // InternalEntityMockDSL.g:9429:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
+    public final EObject entryRuleXFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFeatureCall = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9429:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
+            // InternalEntityMockDSL.g:9430:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXFeatureCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXFeatureCall=ruleXFeatureCall();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXFeatureCall; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXFeatureCall"
+
+
+    // $ANTLR start "ruleXFeatureCall"
+    // InternalEntityMockDSL.g:9436:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
+    public final EObject ruleXFeatureCall() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token lv_explicitOperationCall_7_0=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        EObject lv_typeArguments_2_0 = null;
+
+        EObject lv_typeArguments_4_0 = null;
+
+        EObject lv_featureCallArguments_8_0 = null;
+
+        EObject lv_featureCallArguments_9_0 = null;
+
+        EObject lv_featureCallArguments_11_0 = null;
+
+        EObject lv_featureCallArguments_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9442:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
+            // InternalEntityMockDSL.g:9443:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            {
+            // InternalEntityMockDSL.g:9443:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            // InternalEntityMockDSL.g:9444:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            {
+            // InternalEntityMockDSL.g:9444:3: ()
+            // InternalEntityMockDSL.g:9445:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:9451:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
+            int alt162=2;
+            int LA162_0 = input.LA(1);
+
+            if ( (LA162_0==103) ) {
+                alt162=1;
+            }
+            switch (alt162) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9452:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
+                    {
+                    otherlv_1=(Token)match(input,103,FOLLOW_108); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:9456:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalEntityMockDSL.g:9457:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:9457:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalEntityMockDSL.g:9458:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_109);
+                    lv_typeArguments_2_0=ruleJvmArgumentTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                      						}
+                      						add(
+                      							current,
+                      							"typeArguments",
+                      							lv_typeArguments_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:9475:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop161:
+                    do {
+                        int alt161=2;
+                        int LA161_0 = input.LA(1);
+
+                        if ( (LA161_0==26) ) {
+                            alt161=1;
+                        }
+
+
+                        switch (alt161) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:9476:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,26,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:9480:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalEntityMockDSL.g:9481:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalEntityMockDSL.g:9481:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalEntityMockDSL.g:9482:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_109);
+                    	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"typeArguments",
+                    	      								lv_typeArguments_4_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop161;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,104,FOLLOW_107); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9505:3: ( ( ruleIdOrSuper ) )
+            // InternalEntityMockDSL.g:9506:4: ( ruleIdOrSuper )
+            {
+            // InternalEntityMockDSL.g:9506:4: ( ruleIdOrSuper )
+            // InternalEntityMockDSL.g:9507:5: ruleIdOrSuper
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXFeatureCallRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
+              				
+            }
+            pushFollow(FOLLOW_136);
+            ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:9521:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
+            int alt165=2;
+            alt165 = dfa165.predict(input);
+            switch (alt165) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9522:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
+                    {
+                    // InternalEntityMockDSL.g:9522:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
+                    // InternalEntityMockDSL.g:9523:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
+                    {
+                    // InternalEntityMockDSL.g:9527:5: (lv_explicitOperationCall_7_0= '(' )
+                    // InternalEntityMockDSL.g:9528:6: lv_explicitOperationCall_7_0= '('
+                    {
+                    lv_explicitOperationCall_7_0=(Token)match(input,25,FOLLOW_111); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXFeatureCallRule());
+                      						}
+                      						setWithLastConsumed(current, "explicitOperationCall", true, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:9540:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
+                    int alt164=3;
+                    alt164 = dfa164.predict(input);
+                    switch (alt164) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:9541:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            {
+                            // InternalEntityMockDSL.g:9541:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalEntityMockDSL.g:9542:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            {
+                            // InternalEntityMockDSL.g:9567:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalEntityMockDSL.g:9568:7: lv_featureCallArguments_8_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_82);
+                            lv_featureCallArguments_8_0=ruleXShortClosure();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                              							}
+                              							add(
+                              								current,
+                              								"featureCallArguments",
+                              								lv_featureCallArguments_8_0,
+                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:9586:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalEntityMockDSL.g:9586:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalEntityMockDSL.g:9587:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:9587:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
+                            // InternalEntityMockDSL.g:9588:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            {
+                            // InternalEntityMockDSL.g:9588:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalEntityMockDSL.g:9589:8: lv_featureCallArguments_9_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_38);
+                            lv_featureCallArguments_9_0=ruleXExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                              								}
+                              								add(
+                              									current,
+                              									"featureCallArguments",
+                              									lv_featureCallArguments_9_0,
+                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:9606:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            loop163:
+                            do {
+                                int alt163=2;
+                                int LA163_0 = input.LA(1);
+
+                                if ( (LA163_0==26) ) {
+                                    alt163=1;
+                                }
+
+
+                                switch (alt163) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:9607:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_10=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalEntityMockDSL.g:9611:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalEntityMockDSL.g:9612:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    {
+                            	    // InternalEntityMockDSL.g:9612:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalEntityMockDSL.g:9613:9: lv_featureCallArguments_11_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_38);
+                            	    lv_featureCallArguments_11_0=ruleXExpression();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"featureCallArguments",
+                            	      										lv_featureCallArguments_11_0,
+                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop163;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_12=(Token)match(input,27,FOLLOW_137); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9638:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            int alt166=2;
+            alt166 = dfa166.predict(input);
+            switch (alt166) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9639:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
+                    {
+                    // InternalEntityMockDSL.g:9645:4: (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalEntityMockDSL.g:9646:5: lv_featureCallArguments_13_0= ruleXClosure
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_featureCallArguments_13_0=ruleXClosure();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
+                      					}
+                      					add(
+                      						current,
+                      						"featureCallArguments",
+                      						lv_featureCallArguments_13_0,
+                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXFeatureCall"
+
+
+    // $ANTLR start "entryRuleFeatureCallID"
+    // InternalEntityMockDSL.g:9667:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
+    public final String entryRuleFeatureCallID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleFeatureCallID = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9667:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
+            // InternalEntityMockDSL.g:9668:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleFeatureCallID=ruleFeatureCallID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFeatureCallID.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFeatureCallID"
+
+
+    // $ANTLR start "ruleFeatureCallID"
+    // InternalEntityMockDSL.g:9674:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
+    public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_ValidID_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9680:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
+            // InternalEntityMockDSL.g:9681:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            {
+            // InternalEntityMockDSL.g:9681:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            int alt167=5;
+            switch ( input.LA(1) ) {
+            case RULE_ID:
+                {
+                alt167=1;
+                }
+                break;
+            case 139:
+                {
+                alt167=2;
+                }
+                break;
+            case 88:
+                {
+                alt167=3;
+                }
+                break;
+            case 87:
+                {
+                alt167=4;
+                }
+                break;
+            case 89:
+                {
+                alt167=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 167, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt167) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9682:3: this_ValidID_0= ruleValidID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_ValidID_0=ruleValidID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_ValidID_0);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:9693:3: kw= 'extends'
+                    {
+                    kw=(Token)match(input,139,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:9699:3: kw= 'static'
+                    {
+                    kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:9705:3: kw= 'import'
+                    {
+                    kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalEntityMockDSL.g:9711:3: kw= 'extension'
+                    {
+                    kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFeatureCallID"
+
+
+    // $ANTLR start "entryRuleIdOrSuper"
+    // InternalEntityMockDSL.g:9720:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
+    public final String entryRuleIdOrSuper() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleIdOrSuper = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9720:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
+            // InternalEntityMockDSL.g:9721:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIdOrSuperRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleIdOrSuper=ruleIdOrSuper();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIdOrSuper.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIdOrSuper"
+
+
+    // $ANTLR start "ruleIdOrSuper"
+    // InternalEntityMockDSL.g:9727:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
+    public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_FeatureCallID_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9733:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
+            // InternalEntityMockDSL.g:9734:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            {
+            // InternalEntityMockDSL.g:9734:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            int alt168=2;
+            int LA168_0 = input.LA(1);
+
+            if ( (LA168_0==RULE_ID||(LA168_0>=87 && LA168_0<=89)||LA168_0==139) ) {
+                alt168=1;
+            }
+            else if ( (LA168_0==140) ) {
+                alt168=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 168, 0, input);
+
+                throw nvae;
+            }
+            switch (alt168) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9735:3: this_FeatureCallID_0= ruleFeatureCallID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_FeatureCallID_0=ruleFeatureCallID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_FeatureCallID_0);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:9746:3: kw= 'super'
+                    {
+                    kw=(Token)match(input,140,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIdOrSuper"
+
+
+    // $ANTLR start "entryRuleXConstructorCall"
+    // InternalEntityMockDSL.g:9755:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
+    public final EObject entryRuleXConstructorCall() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXConstructorCall = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:9755:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
+            // InternalEntityMockDSL.g:9756:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXConstructorCallRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXConstructorCall=ruleXConstructorCall();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXConstructorCall; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXConstructorCall"
+
+
+    // $ANTLR start "ruleXConstructorCall"
+    // InternalEntityMockDSL.g:9762:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
+    public final EObject ruleXConstructorCall() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token lv_explicitConstructorCall_8_0=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        EObject lv_typeArguments_4_0 = null;
+
+        EObject lv_typeArguments_6_0 = null;
+
+        EObject lv_arguments_9_0 = null;
+
+        EObject lv_arguments_10_0 = null;
+
+        EObject lv_arguments_12_0 = null;
+
+        EObject lv_arguments_14_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:9768:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
+            // InternalEntityMockDSL.g:9769:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            {
+            // InternalEntityMockDSL.g:9769:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            // InternalEntityMockDSL.g:9770:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            {
+            // InternalEntityMockDSL.g:9770:3: ()
+            // InternalEntityMockDSL.g:9771:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,141,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:9781:3: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:9782:4: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:9782:4: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:9783:5: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXConstructorCallRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
+              				
+            }
+            pushFollow(FOLLOW_138);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:9797:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
+            int alt170=2;
+            alt170 = dfa170.predict(input);
+            switch (alt170) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9798:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
+                    {
+                    // InternalEntityMockDSL.g:9798:4: ( ( '<' )=>otherlv_3= '<' )
+                    // InternalEntityMockDSL.g:9799:5: ( '<' )=>otherlv_3= '<'
+                    {
+                    otherlv_3=(Token)match(input,103,FOLLOW_108); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:9805:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    // InternalEntityMockDSL.g:9806:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:9806:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalEntityMockDSL.g:9807:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_109);
+                    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                      						}
+                      						add(
+                      							current,
+                      							"typeArguments",
+                      							lv_typeArguments_4_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:9824:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop169:
+                    do {
+                        int alt169=2;
+                        int LA169_0 = input.LA(1);
+
+                        if ( (LA169_0==26) ) {
+                            alt169=1;
+                        }
+
+
+                        switch (alt169) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:9825:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_5=(Token)match(input,26,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:9829:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalEntityMockDSL.g:9830:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalEntityMockDSL.g:9830:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalEntityMockDSL.g:9831:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_109);
+                    	    lv_typeArguments_6_0=ruleJvmArgumentTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"typeArguments",
+                    	      								lv_typeArguments_6_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop169;
+                        }
+                    } while (true);
+
+                    otherlv_7=(Token)match(input,104,FOLLOW_136); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9854:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
+            int alt173=2;
+            alt173 = dfa173.predict(input);
+            switch (alt173) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9855:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
+                    {
+                    // InternalEntityMockDSL.g:9855:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
+                    // InternalEntityMockDSL.g:9856:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
+                    {
+                    // InternalEntityMockDSL.g:9860:5: (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalEntityMockDSL.g:9861:6: lv_explicitConstructorCall_8_0= '('
+                    {
+                    lv_explicitConstructorCall_8_0=(Token)match(input,25,FOLLOW_111); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXConstructorCallRule());
+                      						}
+                      						setWithLastConsumed(current, "explicitConstructorCall", true, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:9873:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
+                    int alt172=3;
+                    alt172 = dfa172.predict(input);
+                    switch (alt172) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:9874:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            {
+                            // InternalEntityMockDSL.g:9874:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalEntityMockDSL.g:9875:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
+                            {
+                            // InternalEntityMockDSL.g:9900:6: (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalEntityMockDSL.g:9901:7: lv_arguments_9_0= ruleXShortClosure
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_82);
+                            lv_arguments_9_0=ruleXShortClosure();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                              							}
+                              							add(
+                              								current,
+                              								"arguments",
+                              								lv_arguments_9_0,
+                              								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:9919:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            {
+                            // InternalEntityMockDSL.g:9919:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalEntityMockDSL.g:9920:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:9920:6: ( (lv_arguments_10_0= ruleXExpression ) )
+                            // InternalEntityMockDSL.g:9921:7: (lv_arguments_10_0= ruleXExpression )
+                            {
+                            // InternalEntityMockDSL.g:9921:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalEntityMockDSL.g:9922:8: lv_arguments_10_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_38);
+                            lv_arguments_10_0=ruleXExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                              								}
+                              								add(
+                              									current,
+                              									"arguments",
+                              									lv_arguments_10_0,
+                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:9939:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            loop171:
+                            do {
+                                int alt171=2;
+                                int LA171_0 = input.LA(1);
+
+                                if ( (LA171_0==26) ) {
+                                    alt171=1;
+                                }
+
+
+                                switch (alt171) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:9940:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    {
+                            	    otherlv_11=(Token)match(input,26,FOLLOW_84); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalEntityMockDSL.g:9944:7: ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalEntityMockDSL.g:9945:8: (lv_arguments_12_0= ruleXExpression )
+                            	    {
+                            	    // InternalEntityMockDSL.g:9945:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalEntityMockDSL.g:9946:9: lv_arguments_12_0= ruleXExpression
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FOLLOW_38);
+                            	    lv_arguments_12_0=ruleXExpression();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"arguments",
+                            	      										lv_arguments_12_0,
+                            	      										"org.eclipse.xtext.xbase.Xbase.XExpression");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop171;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_13=(Token)match(input,27,FOLLOW_137); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalEntityMockDSL.g:9971:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            int alt174=2;
+            alt174 = dfa174.predict(input);
+            switch (alt174) {
+                case 1 :
+                    // InternalEntityMockDSL.g:9972:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
+                    {
+                    // InternalEntityMockDSL.g:9978:4: (lv_arguments_14_0= ruleXClosure )
+                    // InternalEntityMockDSL.g:9979:5: lv_arguments_14_0= ruleXClosure
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_arguments_14_0=ruleXClosure();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
+                      					}
+                      					add(
+                      						current,
+                      						"arguments",
+                      						lv_arguments_14_0,
+                      						"org.eclipse.xtext.xbase.Xbase.XClosure");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXConstructorCall"
+
+
+    // $ANTLR start "entryRuleXBooleanLiteral"
+    // InternalEntityMockDSL.g:10000:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
+    public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXBooleanLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10000:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
+            // InternalEntityMockDSL.g:10001:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXBooleanLiteral=ruleXBooleanLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXBooleanLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXBooleanLiteral"
+
+
+    // $ANTLR start "ruleXBooleanLiteral"
+    // InternalEntityMockDSL.g:10007:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
+    public final EObject ruleXBooleanLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_isTrue_2_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10013:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
+            // InternalEntityMockDSL.g:10014:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            {
+            // InternalEntityMockDSL.g:10014:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalEntityMockDSL.g:10015:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            {
+            // InternalEntityMockDSL.g:10015:3: ()
+            // InternalEntityMockDSL.g:10016:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:10022:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            int alt175=2;
+            int LA175_0 = input.LA(1);
+
+            if ( (LA175_0==142) ) {
+                alt175=1;
+            }
+            else if ( (LA175_0==143) ) {
+                alt175=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 175, 0, input);
+
+                throw nvae;
+            }
+            switch (alt175) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10023:4: otherlv_1= 'false'
+                    {
+                    otherlv_1=(Token)match(input,142,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:10028:4: ( (lv_isTrue_2_0= 'true' ) )
+                    {
+                    // InternalEntityMockDSL.g:10028:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalEntityMockDSL.g:10029:5: (lv_isTrue_2_0= 'true' )
+                    {
+                    // InternalEntityMockDSL.g:10029:5: (lv_isTrue_2_0= 'true' )
+                    // InternalEntityMockDSL.g:10030:6: lv_isTrue_2_0= 'true'
+                    {
+                    lv_isTrue_2_0=(Token)match(input,143,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXBooleanLiteralRule());
+                      						}
+                      						setWithLastConsumed(current, "isTrue", true, "true");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXBooleanLiteral"
+
+
+    // $ANTLR start "entryRuleXNullLiteral"
+    // InternalEntityMockDSL.g:10047:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
+    public final EObject entryRuleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNullLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10047:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
+            // InternalEntityMockDSL.g:10048:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXNullLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXNullLiteral=ruleXNullLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXNullLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXNullLiteral"
+
+
+    // $ANTLR start "ruleXNullLiteral"
+    // InternalEntityMockDSL.g:10054:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
+    public final EObject ruleXNullLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10060:2: ( ( () otherlv_1= 'null' ) )
+            // InternalEntityMockDSL.g:10061:2: ( () otherlv_1= 'null' )
+            {
+            // InternalEntityMockDSL.g:10061:2: ( () otherlv_1= 'null' )
+            // InternalEntityMockDSL.g:10062:3: () otherlv_1= 'null'
+            {
+            // InternalEntityMockDSL.g:10062:3: ()
+            // InternalEntityMockDSL.g:10063:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,144,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXNullLiteral"
+
+
+    // $ANTLR start "entryRuleXNumberLiteral"
+    // InternalEntityMockDSL.g:10077:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
+    public final EObject entryRuleXNumberLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXNumberLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10077:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
+            // InternalEntityMockDSL.g:10078:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXNumberLiteral=ruleXNumberLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXNumberLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXNumberLiteral"
+
+
+    // $ANTLR start "ruleXNumberLiteral"
+    // InternalEntityMockDSL.g:10084:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
+    public final EObject ruleXNumberLiteral() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10090:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
+            // InternalEntityMockDSL.g:10091:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            {
+            // InternalEntityMockDSL.g:10091:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalEntityMockDSL.g:10092:3: () ( (lv_value_1_0= ruleNumber ) )
+            {
+            // InternalEntityMockDSL.g:10092:3: ()
+            // InternalEntityMockDSL.g:10093:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:10099:3: ( (lv_value_1_0= ruleNumber ) )
+            // InternalEntityMockDSL.g:10100:4: (lv_value_1_0= ruleNumber )
+            {
+            // InternalEntityMockDSL.g:10100:4: (lv_value_1_0= ruleNumber )
+            // InternalEntityMockDSL.g:10101:5: lv_value_1_0= ruleNumber
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_value_1_0=ruleNumber();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.xtext.xbase.Xbase.Number");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXNumberLiteral"
+
+
+    // $ANTLR start "entryRuleXStringLiteral"
+    // InternalEntityMockDSL.g:10122:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
+    public final EObject entryRuleXStringLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXStringLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10122:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
+            // InternalEntityMockDSL.g:10123:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXStringLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXStringLiteral=ruleXStringLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXStringLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXStringLiteral"
+
+
+    // $ANTLR start "ruleXStringLiteral"
+    // InternalEntityMockDSL.g:10129:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
+    public final EObject ruleXStringLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_value_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10135:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalEntityMockDSL.g:10136:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            {
+            // InternalEntityMockDSL.g:10136:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalEntityMockDSL.g:10137:3: () ( (lv_value_1_0= RULE_STRING ) )
+            {
+            // InternalEntityMockDSL.g:10137:3: ()
+            // InternalEntityMockDSL.g:10138:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalEntityMockDSL.g:10144:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalEntityMockDSL.g:10145:4: (lv_value_1_0= RULE_STRING )
+            {
+            // InternalEntityMockDSL.g:10145:4: (lv_value_1_0= RULE_STRING )
+            // InternalEntityMockDSL.g:10146:5: lv_value_1_0= RULE_STRING
+            {
+            lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXStringLiteralRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXStringLiteral"
+
+
+    // $ANTLR start "entryRuleXTypeLiteral"
+    // InternalEntityMockDSL.g:10166:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
+    public final EObject entryRuleXTypeLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTypeLiteral = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10166:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
+            // InternalEntityMockDSL.g:10167:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXTypeLiteral=ruleXTypeLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXTypeLiteral; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXTypeLiteral"
+
+
+    // $ANTLR start "ruleXTypeLiteral"
+    // InternalEntityMockDSL.g:10173:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
+    public final EObject ruleXTypeLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        AntlrDatatypeRuleToken lv_arrayDimensions_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10179:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
+            // InternalEntityMockDSL.g:10180:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            {
+            // InternalEntityMockDSL.g:10180:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalEntityMockDSL.g:10181:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
+            {
+            // InternalEntityMockDSL.g:10181:3: ()
+            // InternalEntityMockDSL.g:10182:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,145,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:10196:3: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:10197:4: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:10197:4: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:10198:5: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXTypeLiteralRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
+              				
+            }
+            pushFollow(FOLLOW_139);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:10212:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
+            loop176:
+            do {
+                int alt176=2;
+                int LA176_0 = input.LA(1);
+
+                if ( (LA176_0==96) ) {
+                    alt176=1;
+                }
+
+
+                switch (alt176) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:10213:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    {
+            	    // InternalEntityMockDSL.g:10213:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalEntityMockDSL.g:10214:5: lv_arrayDimensions_4_0= ruleArrayBrackets
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FOLLOW_139);
+            	    lv_arrayDimensions_4_0=ruleArrayBrackets();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"arrayDimensions",
+            	      						lv_arrayDimensions_4_0,
+            	      						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop176;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,27,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXTypeLiteral"
+
+
+    // $ANTLR start "entryRuleXThrowExpression"
+    // InternalEntityMockDSL.g:10239:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
+    public final EObject entryRuleXThrowExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXThrowExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10239:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
+            // InternalEntityMockDSL.g:10240:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXThrowExpression=ruleXThrowExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXThrowExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXThrowExpression"
+
+
+    // $ANTLR start "ruleXThrowExpression"
+    // InternalEntityMockDSL.g:10246:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXThrowExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_expression_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10252:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:10253:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:10253:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:10254:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:10254:3: ()
+            // InternalEntityMockDSL.g:10255:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,146,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:10265:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:10266:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:10266:4: (lv_expression_2_0= ruleXExpression )
+            // InternalEntityMockDSL.g:10267:5: lv_expression_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_expression_2_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_2_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXThrowExpression"
+
+
+    // $ANTLR start "entryRuleXReturnExpression"
+    // InternalEntityMockDSL.g:10288:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
+    public final EObject entryRuleXReturnExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXReturnExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10288:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
+            // InternalEntityMockDSL.g:10289:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXReturnExpression=ruleXReturnExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXReturnExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXReturnExpression"
+
+
+    // $ANTLR start "ruleXReturnExpression"
+    // InternalEntityMockDSL.g:10295:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
+    public final EObject ruleXReturnExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_expression_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10301:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
+            // InternalEntityMockDSL.g:10302:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            {
+            // InternalEntityMockDSL.g:10302:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            // InternalEntityMockDSL.g:10303:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            {
+            // InternalEntityMockDSL.g:10303:3: ()
+            // InternalEntityMockDSL.g:10304:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,147,FOLLOW_140); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:10314:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            int alt177=2;
+            alt177 = dfa177.predict(input);
+            switch (alt177) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10315:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:10316:4: (lv_expression_2_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:10317:5: lv_expression_2_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_expression_2_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"expression",
+                      						lv_expression_2_0,
+                      						"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXReturnExpression"
+
+
+    // $ANTLR start "entryRuleXTryCatchFinallyExpression"
+    // InternalEntityMockDSL.g:10338:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
+    public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXTryCatchFinallyExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10338:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
+            // InternalEntityMockDSL.g:10339:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXTryCatchFinallyExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXTryCatchFinallyExpression"
+
+
+    // $ANTLR start "ruleXTryCatchFinallyExpression"
+    // InternalEntityMockDSL.g:10345:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
+    public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_expression_2_0 = null;
+
+        EObject lv_catchClauses_3_0 = null;
+
+        EObject lv_finallyExpression_5_0 = null;
+
+        EObject lv_finallyExpression_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10351:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
+            // InternalEntityMockDSL.g:10352:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            {
+            // InternalEntityMockDSL.g:10352:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            // InternalEntityMockDSL.g:10353:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            {
+            // InternalEntityMockDSL.g:10353:3: ()
+            // InternalEntityMockDSL.g:10354:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,148,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:10364:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:10365:4: (lv_expression_2_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:10365:4: (lv_expression_2_0= ruleXExpression )
+            // InternalEntityMockDSL.g:10366:5: lv_expression_2_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_141);
+            lv_expression_2_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_2_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:10383:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            int alt180=2;
+            int LA180_0 = input.LA(1);
+
+            if ( (LA180_0==151) ) {
+                alt180=1;
+            }
+            else if ( (LA180_0==149) ) {
+                alt180=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 180, 0, input);
+
+                throw nvae;
+            }
+            switch (alt180) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10384:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    {
+                    // InternalEntityMockDSL.g:10384:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalEntityMockDSL.g:10385:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    {
+                    // InternalEntityMockDSL.g:10385:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
+                    int cnt178=0;
+                    loop178:
+                    do {
+                        int alt178=2;
+                        int LA178_0 = input.LA(1);
+
+                        if ( (LA178_0==151) ) {
+                            int LA178_2 = input.LA(2);
+
+                            if ( (synpred44_InternalEntityMockDSL()) ) {
+                                alt178=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt178) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:10386:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    {
+                    	    // InternalEntityMockDSL.g:10387:6: (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalEntityMockDSL.g:10388:7: lv_catchClauses_3_0= ruleXCatchClause
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_142);
+                    	    lv_catchClauses_3_0=ruleXCatchClause();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"catchClauses",
+                    	      								lv_catchClauses_3_0,
+                    	      								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt178 >= 1 ) break loop178;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(178, input);
+                                throw eee;
+                        }
+                        cnt178++;
+                    } while (true);
+
+                    // InternalEntityMockDSL.g:10405:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    int alt179=2;
+                    int LA179_0 = input.LA(1);
+
+                    if ( (LA179_0==149) ) {
+                        int LA179_1 = input.LA(2);
+
+                        if ( (synpred45_InternalEntityMockDSL()) ) {
+                            alt179=1;
+                        }
+                    }
+                    switch (alt179) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:10406:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            {
+                            // InternalEntityMockDSL.g:10406:6: ( ( 'finally' )=>otherlv_4= 'finally' )
+                            // InternalEntityMockDSL.g:10407:7: ( 'finally' )=>otherlv_4= 'finally'
+                            {
+                            otherlv_4=(Token)match(input,149,FOLLOW_84); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
+                              						
+                            }
+
+                            }
+
+                            // InternalEntityMockDSL.g:10413:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalEntityMockDSL.g:10414:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            {
+                            // InternalEntityMockDSL.g:10414:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalEntityMockDSL.g:10415:8: lv_finallyExpression_5_0= ruleXExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
+                              							
+                            }
+                            pushFollow(FOLLOW_2);
+                            lv_finallyExpression_5_0=ruleXExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"finallyExpression",
+                              									lv_finallyExpression_5_0,
+                              									"org.eclipse.xtext.xbase.Xbase.XExpression");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:10435:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    {
+                    // InternalEntityMockDSL.g:10435:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalEntityMockDSL.g:10436:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    {
+                    otherlv_6=(Token)match(input,149,FOLLOW_84); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
+                      				
+                    }
+                    // InternalEntityMockDSL.g:10440:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalEntityMockDSL.g:10441:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    {
+                    // InternalEntityMockDSL.g:10441:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalEntityMockDSL.g:10442:7: lv_finallyExpression_7_0= ruleXExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_finallyExpression_7_0=ruleXExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"finallyExpression",
+                      								lv_finallyExpression_7_0,
+                      								"org.eclipse.xtext.xbase.Xbase.XExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXTryCatchFinallyExpression"
+
+
+    // $ANTLR start "entryRuleXSynchronizedExpression"
+    // InternalEntityMockDSL.g:10465:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
+    public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXSynchronizedExpression = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10465:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
+            // InternalEntityMockDSL.g:10466:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXSynchronizedExpression; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXSynchronizedExpression"
+
+
+    // $ANTLR start "ruleXSynchronizedExpression"
+    // InternalEntityMockDSL.g:10472:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXSynchronizedExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_param_3_0 = null;
+
+        EObject lv_expression_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10478:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:10479:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:10479:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:10480:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:10480:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
+            // InternalEntityMockDSL.g:10481:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            {
+            // InternalEntityMockDSL.g:10488:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalEntityMockDSL.g:10489:5: () otherlv_1= 'synchronized' otherlv_2= '('
+            {
+            // InternalEntityMockDSL.g:10489:5: ()
+            // InternalEntityMockDSL.g:10490:6: 
+            {
+            if ( state.backtracking==0 ) {
+
+              						current = forceCreateModelElement(
+              							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
+              							current);
+              					
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,150,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
+              				
+            }
+            otherlv_2=(Token)match(input,25,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:10506:3: ( (lv_param_3_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:10507:4: (lv_param_3_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:10507:4: (lv_param_3_0= ruleXExpression )
+            // InternalEntityMockDSL.g:10508:5: lv_param_3_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_param_3_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
+              					}
+              					set(
+              						current,
+              						"param",
+              						lv_param_3_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+            // InternalEntityMockDSL.g:10529:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:10530:4: (lv_expression_5_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:10530:4: (lv_expression_5_0= ruleXExpression )
+            // InternalEntityMockDSL.g:10531:5: lv_expression_5_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_expression_5_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_5_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXSynchronizedExpression"
+
+
+    // $ANTLR start "entryRuleXCatchClause"
+    // InternalEntityMockDSL.g:10552:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
+    public final EObject entryRuleXCatchClause() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXCatchClause = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10552:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
+            // InternalEntityMockDSL.g:10553:2: iv_ruleXCatchClause= ruleXCatchClause EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXCatchClauseRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXCatchClause=ruleXCatchClause();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXCatchClause; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXCatchClause"
+
+
+    // $ANTLR start "ruleXCatchClause"
+    // InternalEntityMockDSL.g:10559:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
+    public final EObject ruleXCatchClause() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject lv_declaredParam_2_0 = null;
+
+        EObject lv_expression_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10565:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
+            // InternalEntityMockDSL.g:10566:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            {
+            // InternalEntityMockDSL.g:10566:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalEntityMockDSL.g:10567:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
+            {
+            // InternalEntityMockDSL.g:10567:3: ( ( 'catch' )=>otherlv_0= 'catch' )
+            // InternalEntityMockDSL.g:10568:4: ( 'catch' )=>otherlv_0= 'catch'
+            {
+            otherlv_0=(Token)match(input,151,FOLLOW_17); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,25,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:10578:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
+            // InternalEntityMockDSL.g:10579:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            {
+            // InternalEntityMockDSL.g:10579:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalEntityMockDSL.g:10580:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_82);
+            lv_declaredParam_2_0=ruleFullJvmFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
+              					}
+              					set(
+              						current,
+              						"declaredParam",
+              						lv_declaredParam_2_0,
+              						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,27,FOLLOW_84); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
+              		
+            }
+            // InternalEntityMockDSL.g:10601:3: ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalEntityMockDSL.g:10602:4: (lv_expression_4_0= ruleXExpression )
+            {
+            // InternalEntityMockDSL.g:10602:4: (lv_expression_4_0= ruleXExpression )
+            // InternalEntityMockDSL.g:10603:5: lv_expression_4_0= ruleXExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_expression_4_0=ruleXExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_4_0,
+              						"org.eclipse.xtext.xbase.Xbase.XExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXCatchClause"
+
+
+    // $ANTLR start "entryRuleQualifiedName"
+    // InternalEntityMockDSL.g:10624:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    public final String entryRuleQualifiedName() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10624:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalEntityMockDSL.g:10625:2: iv_ruleQualifiedName= ruleQualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleQualifiedName=ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedName.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedName"
+
+
+    // $ANTLR start "ruleQualifiedName"
+    // InternalEntityMockDSL.g:10631:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
+    public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_ValidID_0 = null;
+
+        AntlrDatatypeRuleToken this_ValidID_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10637:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalEntityMockDSL.g:10638:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            {
+            // InternalEntityMockDSL.g:10638:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalEntityMockDSL.g:10639:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_31);
+            this_ValidID_0=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_ValidID_0);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalEntityMockDSL.g:10649:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            loop181:
+            do {
+                int alt181=2;
+                int LA181_0 = input.LA(1);
+
+                if ( (LA181_0==34) ) {
+                    int LA181_2 = input.LA(2);
+
+                    if ( (LA181_2==RULE_ID) ) {
+                        int LA181_3 = input.LA(3);
+
+                        if ( (synpred48_InternalEntityMockDSL()) ) {
+                            alt181=1;
+                        }
+
+
+                    }
+
+
+                }
+
+
+                switch (alt181) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:10650:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    {
+            	    // InternalEntityMockDSL.g:10650:4: ( ( '.' )=>kw= '.' )
+            	    // InternalEntityMockDSL.g:10651:5: ( '.' )=>kw= '.'
+            	    {
+            	    kw=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					current.merge(kw);
+            	      					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
+            	      				
+            	    }
+
+            	    }
+
+            	    if ( state.backtracking==0 ) {
+
+            	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
+            	      			
+            	    }
+            	    pushFollow(FOLLOW_31);
+            	    this_ValidID_2=ruleValidID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				current.merge(this_ValidID_2);
+            	      			
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      				afterParserOrEnumRuleCall();
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop181;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $ANTLR start "entryRuleNumber"
+    // InternalEntityMockDSL.g:10673:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
+    public final String entryRuleNumber() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleNumber = null;
+
+
+
+        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+
+        try {
+            // InternalEntityMockDSL.g:10675:2: (iv_ruleNumber= ruleNumber EOF )
+            // InternalEntityMockDSL.g:10676:2: iv_ruleNumber= ruleNumber EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNumberRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleNumber=ruleNumber();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNumber.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myHiddenTokenState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNumber"
+
+
+    // $ANTLR start "ruleNumber"
+    // InternalEntityMockDSL.g:10685:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
+    public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_HEX_0=null;
+        Token this_INT_1=null;
+        Token this_DECIMAL_2=null;
+        Token kw=null;
+        Token this_INT_4=null;
+        Token this_DECIMAL_5=null;
+
+
+        	enterRule();
+        	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
+
+        try {
+            // InternalEntityMockDSL.g:10692:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
+            // InternalEntityMockDSL.g:10693:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            {
+            // InternalEntityMockDSL.g:10693:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            int alt185=2;
+            int LA185_0 = input.LA(1);
+
+            if ( (LA185_0==RULE_HEX) ) {
+                alt185=1;
+            }
+            else if ( (LA185_0==RULE_INT||LA185_0==RULE_DECIMAL) ) {
+                alt185=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 185, 0, input);
+
+                throw nvae;
+            }
+            switch (alt185) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10694:3: this_HEX_0= RULE_HEX
+                    {
+                    this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_HEX_0);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:10702:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    {
+                    // InternalEntityMockDSL.g:10702:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalEntityMockDSL.g:10703:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    {
+                    // InternalEntityMockDSL.g:10703:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
+                    int alt182=2;
+                    int LA182_0 = input.LA(1);
+
+                    if ( (LA182_0==RULE_INT) ) {
+                        alt182=1;
+                    }
+                    else if ( (LA182_0==RULE_DECIMAL) ) {
+                        alt182=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 182, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt182) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:10704:5: this_INT_1= RULE_INT
+                            {
+                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_31); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(this_INT_1);
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalEntityMockDSL.g:10712:5: this_DECIMAL_2= RULE_DECIMAL
+                            {
+                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_31); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(this_DECIMAL_2);
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalEntityMockDSL.g:10720:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    int alt184=2;
+                    int LA184_0 = input.LA(1);
+
+                    if ( (LA184_0==34) ) {
+                        int LA184_1 = input.LA(2);
+
+                        if ( (LA184_1==RULE_INT||LA184_1==RULE_DECIMAL) ) {
+                            alt184=1;
+                        }
+                    }
+                    switch (alt184) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:10721:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            {
+                            kw=(Token)match(input,34,FOLLOW_143); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current.merge(kw);
+                              					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
+                              				
+                            }
+                            // InternalEntityMockDSL.g:10726:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            int alt183=2;
+                            int LA183_0 = input.LA(1);
+
+                            if ( (LA183_0==RULE_INT) ) {
+                                alt183=1;
+                            }
+                            else if ( (LA183_0==RULE_DECIMAL) ) {
+                                alt183=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 183, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt183) {
+                                case 1 :
+                                    // InternalEntityMockDSL.g:10727:6: this_INT_4= RULE_INT
+                                    {
+                                    this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      						current.merge(this_INT_4);
+                                      					
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
+                                      					
+                                    }
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalEntityMockDSL.g:10735:6: this_DECIMAL_5= RULE_DECIMAL
+                                    {
+                                    this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      						current.merge(this_DECIMAL_5);
+                                      					
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
+                                      					
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myHiddenTokenState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNumber"
+
+
+    // $ANTLR start "entryRuleJvmTypeReference"
+    // InternalEntityMockDSL.g:10752:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmTypeReference = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10752:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalEntityMockDSL.g:10753:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmTypeReference=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmTypeReference; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmTypeReference"
+
+
+    // $ANTLR start "ruleJvmTypeReference"
+    // InternalEntityMockDSL.g:10759:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
+    public final EObject ruleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_JvmParameterizedTypeReference_0 = null;
+
+        EObject this_XFunctionTypeRef_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10765:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalEntityMockDSL.g:10766:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            {
+            // InternalEntityMockDSL.g:10766:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            int alt187=2;
+            int LA187_0 = input.LA(1);
+
+            if ( (LA187_0==RULE_ID) ) {
+                alt187=1;
+            }
+            else if ( (LA187_0==25||LA187_0==116) ) {
+                alt187=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 187, 0, input);
+
+                throw nvae;
+            }
+            switch (alt187) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10767:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    {
+                    // InternalEntityMockDSL.g:10767:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalEntityMockDSL.g:10768:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
+                      			
+                    }
+                    pushFollow(FOLLOW_137);
+                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_JvmParameterizedTypeReference_0;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalEntityMockDSL.g:10776:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    loop186:
+                    do {
+                        int alt186=2;
+                        int LA186_0 = input.LA(1);
+
+                        if ( (LA186_0==96) ) {
+                            int LA186_2 = input.LA(2);
+
+                            if ( (LA186_2==97) ) {
+                                int LA186_3 = input.LA(3);
+
+                                if ( (synpred49_InternalEntityMockDSL()) ) {
+                                    alt186=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt186) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:10777:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    {
+                    	    // InternalEntityMockDSL.g:10783:5: ( () ruleArrayBrackets )
+                    	    // InternalEntityMockDSL.g:10784:6: () ruleArrayBrackets
+                    	    {
+                    	    // InternalEntityMockDSL.g:10784:6: ()
+                    	    // InternalEntityMockDSL.g:10785:7: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							current = forceCreateModelElementAndSet(
+                    	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
+                    	      								current);
+                    	      						
+                    	    }
+
+                    	    }
+
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
+                    	      					
+                    	    }
+                    	    pushFollow(FOLLOW_137);
+                    	    ruleArrayBrackets();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop186;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:10802:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_XFunctionTypeRef_3=ruleXFunctionTypeRef();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XFunctionTypeRef_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmTypeReference"
+
+
+    // $ANTLR start "entryRuleArrayBrackets"
+    // InternalEntityMockDSL.g:10814:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    public final String entryRuleArrayBrackets() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10814:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalEntityMockDSL.g:10815:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getArrayBracketsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleArrayBrackets=ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleArrayBrackets.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleArrayBrackets"
+
+
+    // $ANTLR start "ruleArrayBrackets"
+    // InternalEntityMockDSL.g:10821:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10827:2: ( (kw= '[' kw= ']' ) )
+            // InternalEntityMockDSL.g:10828:2: (kw= '[' kw= ']' )
+            {
+            // InternalEntityMockDSL.g:10828:2: (kw= '[' kw= ']' )
+            // InternalEntityMockDSL.g:10829:3: kw= '[' kw= ']'
+            {
+            kw=(Token)match(input,96,FOLLOW_118); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
+              		
+            }
+            kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleArrayBrackets"
+
+
+    // $ANTLR start "entryRuleXFunctionTypeRef"
+    // InternalEntityMockDSL.g:10843:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFunctionTypeRef = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10843:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalEntityMockDSL.g:10844:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXFunctionTypeRef; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXFunctionTypeRef"
+
+
+    // $ANTLR start "ruleXFunctionTypeRef"
+    // InternalEntityMockDSL.g:10850:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
+    public final EObject ruleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject lv_paramTypes_1_0 = null;
+
+        EObject lv_paramTypes_3_0 = null;
+
+        EObject lv_returnType_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10856:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalEntityMockDSL.g:10857:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalEntityMockDSL.g:10857:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalEntityMockDSL.g:10858:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            {
+            // InternalEntityMockDSL.g:10858:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            int alt190=2;
+            int LA190_0 = input.LA(1);
+
+            if ( (LA190_0==25) ) {
+                alt190=1;
+            }
+            switch (alt190) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10859:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    {
+                    otherlv_0=(Token)match(input,25,FOLLOW_37); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:10863:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    int alt189=2;
+                    int LA189_0 = input.LA(1);
+
+                    if ( (LA189_0==RULE_ID||LA189_0==25||LA189_0==116) ) {
+                        alt189=1;
+                    }
+                    switch (alt189) {
+                        case 1 :
+                            // InternalEntityMockDSL.g:10864:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            {
+                            // InternalEntityMockDSL.g:10864:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalEntityMockDSL.g:10865:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            {
+                            // InternalEntityMockDSL.g:10865:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalEntityMockDSL.g:10866:7: lv_paramTypes_1_0= ruleJvmTypeReference
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
+                              						
+                            }
+                            pushFollow(FOLLOW_38);
+                            lv_paramTypes_1_0=ruleJvmTypeReference();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+                              							}
+                              							add(
+                              								current,
+                              								"paramTypes",
+                              								lv_paramTypes_1_0,
+                              								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalEntityMockDSL.g:10883:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            loop188:
+                            do {
+                                int alt188=2;
+                                int LA188_0 = input.LA(1);
+
+                                if ( (LA188_0==26) ) {
+                                    alt188=1;
+                                }
+
+
+                                switch (alt188) {
+                            	case 1 :
+                            	    // InternalEntityMockDSL.g:10884:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    {
+                            	    otherlv_2=(Token)match(input,26,FOLLOW_39); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
+                            	      					
+                            	    }
+                            	    // InternalEntityMockDSL.g:10888:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalEntityMockDSL.g:10889:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    {
+                            	    // InternalEntityMockDSL.g:10889:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalEntityMockDSL.g:10890:8: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
+                            	      							
+                            	    }
+                            	    pushFollow(FOLLOW_38);
+                            	    lv_paramTypes_3_0=ruleJvmTypeReference();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								if (current==null) {
+                            	      									current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+                            	      								}
+                            	      								add(
+                            	      									current,
+                            	      									"paramTypes",
+                            	      									lv_paramTypes_3_0,
+                            	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                            	      								afterParserOrEnumRuleCall();
+                            	      							
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop188;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,27,FOLLOW_144); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,116,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:10918:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:10919:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:10919:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:10920:5: lv_returnType_6_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_returnType_6_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+              					}
+              					set(
+              						current,
+              						"returnType",
+              						lv_returnType_6_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXFunctionTypeRef"
+
+
+    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
+    // InternalEntityMockDSL.g:10941:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmParameterizedTypeReference = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:10941:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalEntityMockDSL.g:10942:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmParameterizedTypeReference; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "ruleJvmParameterizedTypeReference"
+    // InternalEntityMockDSL.g:10948:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
+    public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        EObject lv_arguments_2_0 = null;
+
+        EObject lv_arguments_4_0 = null;
+
+        EObject lv_arguments_10_0 = null;
+
+        EObject lv_arguments_12_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:10954:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
+            // InternalEntityMockDSL.g:10955:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            {
+            // InternalEntityMockDSL.g:10955:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            // InternalEntityMockDSL.g:10956:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            {
+            // InternalEntityMockDSL.g:10956:3: ( ( ruleQualifiedName ) )
+            // InternalEntityMockDSL.g:10957:4: ( ruleQualifiedName )
+            {
+            // InternalEntityMockDSL.g:10957:4: ( ruleQualifiedName )
+            // InternalEntityMockDSL.g:10958:5: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
+              				
+            }
+            pushFollow(FOLLOW_145);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalEntityMockDSL.g:10972:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            int alt195=2;
+            alt195 = dfa195.predict(input);
+            switch (alt195) {
+                case 1 :
+                    // InternalEntityMockDSL.g:10973:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    {
+                    // InternalEntityMockDSL.g:10973:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalEntityMockDSL.g:10974:5: ( '<' )=>otherlv_1= '<'
+                    {
+                    otherlv_1=(Token)match(input,103,FOLLOW_108); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+                      				
+                    }
+
+                    }
+
+                    // InternalEntityMockDSL.g:10980:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalEntityMockDSL.g:10981:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    {
+                    // InternalEntityMockDSL.g:10981:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalEntityMockDSL.g:10982:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_109);
+                    lv_arguments_2_0=ruleJvmArgumentTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                      						}
+                      						add(
+                      							current,
+                      							"arguments",
+                      							lv_arguments_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:10999:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop191:
+                    do {
+                        int alt191=2;
+                        int LA191_0 = input.LA(1);
+
+                        if ( (LA191_0==26) ) {
+                            alt191=1;
+                        }
+
+
+                        switch (alt191) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:11000:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,26,FOLLOW_108); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
+                    	      				
+                    	    }
+                    	    // InternalEntityMockDSL.g:11004:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalEntityMockDSL.g:11005:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    {
+                    	    // InternalEntityMockDSL.g:11005:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalEntityMockDSL.g:11006:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_109);
+                    	    lv_arguments_4_0=ruleJvmArgumentTypeReference();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"arguments",
+                    	      								lv_arguments_4_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop191;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,104,FOLLOW_31); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+                    // InternalEntityMockDSL.g:11028:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    loop194:
+                    do {
+                        int alt194=2;
+                        int LA194_0 = input.LA(1);
+
+                        if ( (LA194_0==34) ) {
+                            int LA194_2 = input.LA(2);
+
+                            if ( (LA194_2==RULE_ID) ) {
+                                int LA194_3 = input.LA(3);
+
+                                if ( (synpred51_InternalEntityMockDSL()) ) {
+                                    alt194=1;
+                                }
+
+
+                            }
+
+
+                        }
+
+
+                        switch (alt194) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:11029:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    {
+                    	    // InternalEntityMockDSL.g:11029:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalEntityMockDSL.g:11030:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    {
+                    	    // InternalEntityMockDSL.g:11036:6: ( () otherlv_7= '.' )
+                    	    // InternalEntityMockDSL.g:11037:7: () otherlv_7= '.'
+                    	    {
+                    	    // InternalEntityMockDSL.g:11037:7: ()
+                    	    // InternalEntityMockDSL.g:11038:8: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								current = forceCreateModelElementAndSet(
+                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
+                    	      									current);
+                    	      							
+                    	    }
+
+                    	    }
+
+                    	    otherlv_7=(Token)match(input,34,FOLLOW_4); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalEntityMockDSL.g:11050:5: ( ( ruleValidID ) )
+                    	    // InternalEntityMockDSL.g:11051:6: ( ruleValidID )
+                    	    {
+                    	    // InternalEntityMockDSL.g:11051:6: ( ruleValidID )
+                    	    // InternalEntityMockDSL.g:11052:7: ruleValidID
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	      							}
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_146);
+                    	    ruleValidID();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalEntityMockDSL.g:11066:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    int alt193=2;
+                    	    alt193 = dfa193.predict(input);
+                    	    switch (alt193) {
+                    	        case 1 :
+                    	            // InternalEntityMockDSL.g:11067:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            {
+                    	            // InternalEntityMockDSL.g:11067:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalEntityMockDSL.g:11068:7: ( '<' )=>otherlv_9= '<'
+                    	            {
+                    	            otherlv_9=(Token)match(input,103,FOLLOW_108); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
+                    	              						
+                    	            }
+
+                    	            }
+
+                    	            // InternalEntityMockDSL.g:11074:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalEntityMockDSL.g:11075:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            {
+                    	            // InternalEntityMockDSL.g:11075:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalEntityMockDSL.g:11076:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FOLLOW_109);
+                    	            lv_arguments_10_0=ruleJvmArgumentTypeReference();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"arguments",
+                    	              									lv_arguments_10_0,
+                    	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalEntityMockDSL.g:11093:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            loop192:
+                    	            do {
+                    	                int alt192=2;
+                    	                int LA192_0 = input.LA(1);
+
+                    	                if ( (LA192_0==26) ) {
+                    	                    alt192=1;
+                    	                }
+
+
+                    	                switch (alt192) {
+                    	            	case 1 :
+                    	            	    // InternalEntityMockDSL.g:11094:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    {
+                    	            	    otherlv_11=(Token)match(input,26,FOLLOW_108); if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
+                    	            	      						
+                    	            	    }
+                    	            	    // InternalEntityMockDSL.g:11098:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalEntityMockDSL.g:11099:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    {
+                    	            	    // InternalEntityMockDSL.g:11099:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalEntityMockDSL.g:11100:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
+                    	            	      								
+                    	            	    }
+                    	            	    pushFollow(FOLLOW_109);
+                    	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      									if (current==null) {
+                    	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	            	      									}
+                    	            	      									add(
+                    	            	      										current,
+                    	            	      										"arguments",
+                    	            	      										lv_arguments_12_0,
+                    	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	            	      									afterParserOrEnumRuleCall();
+                    	            	      								
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    break loop192;
+                    	                }
+                    	            } while (true);
+
+                    	            otherlv_13=(Token)match(input,104,FOLLOW_31); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop194;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // InternalEntityMockDSL.g:11129:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmArgumentTypeReference = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11129:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalEntityMockDSL.g:11130:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmArgumentTypeReference; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "ruleJvmArgumentTypeReference"
+    // InternalEntityMockDSL.g:11136:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
+    public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_JvmTypeReference_0 = null;
+
+        EObject this_JvmWildcardTypeReference_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11142:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalEntityMockDSL.g:11143:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            {
+            // InternalEntityMockDSL.g:11143:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            int alt196=2;
+            int LA196_0 = input.LA(1);
+
+            if ( (LA196_0==RULE_ID||LA196_0==25||LA196_0==116) ) {
+                alt196=1;
+            }
+            else if ( (LA196_0==152) ) {
+                alt196=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 196, 0, input);
+
+                throw nvae;
+            }
+            switch (alt196) {
+                case 1 :
+                    // InternalEntityMockDSL.g:11144:3: this_JvmTypeReference_0= ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_JvmTypeReference_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_JvmTypeReference_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:11153:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_JvmWildcardTypeReference_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmWildcardTypeReference"
+    // InternalEntityMockDSL.g:11165:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmWildcardTypeReference = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11165:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalEntityMockDSL.g:11166:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmWildcardTypeReference; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "ruleJvmWildcardTypeReference"
+    // InternalEntityMockDSL.g:11172:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
+    public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_constraints_2_0 = null;
+
+        EObject lv_constraints_3_0 = null;
+
+        EObject lv_constraints_4_0 = null;
+
+        EObject lv_constraints_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11178:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalEntityMockDSL.g:11179:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            {
+            // InternalEntityMockDSL.g:11179:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalEntityMockDSL.g:11180:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            {
+            // InternalEntityMockDSL.g:11180:3: ()
+            // InternalEntityMockDSL.g:11181:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,152,FOLLOW_147); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+              		
+            }
+            // InternalEntityMockDSL.g:11191:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            int alt199=3;
+            int LA199_0 = input.LA(1);
+
+            if ( (LA199_0==139) ) {
+                alt199=1;
+            }
+            else if ( (LA199_0==140) ) {
+                alt199=2;
+            }
+            switch (alt199) {
+                case 1 :
+                    // InternalEntityMockDSL.g:11192:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    {
+                    // InternalEntityMockDSL.g:11192:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalEntityMockDSL.g:11193:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    {
+                    // InternalEntityMockDSL.g:11193:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalEntityMockDSL.g:11194:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    {
+                    // InternalEntityMockDSL.g:11194:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalEntityMockDSL.g:11195:7: lv_constraints_2_0= ruleJvmUpperBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_148);
+                    lv_constraints_2_0=ruleJvmUpperBound();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                      							}
+                      							add(
+                      								current,
+                      								"constraints",
+                      								lv_constraints_2_0,
+                      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:11212:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    loop197:
+                    do {
+                        int alt197=2;
+                        int LA197_0 = input.LA(1);
+
+                        if ( (LA197_0==153) ) {
+                            alt197=1;
+                        }
+
+
+                        switch (alt197) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:11213:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    {
+                    	    // InternalEntityMockDSL.g:11213:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalEntityMockDSL.g:11214:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_148);
+                    	    lv_constraints_3_0=ruleJvmUpperBoundAnded();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"constraints",
+                    	      								lv_constraints_3_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop197;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:11233:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    {
+                    // InternalEntityMockDSL.g:11233:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalEntityMockDSL.g:11234:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    {
+                    // InternalEntityMockDSL.g:11234:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalEntityMockDSL.g:11235:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    {
+                    // InternalEntityMockDSL.g:11235:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalEntityMockDSL.g:11236:7: lv_constraints_4_0= ruleJvmLowerBound
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
+                      						
+                    }
+                    pushFollow(FOLLOW_148);
+                    lv_constraints_4_0=ruleJvmLowerBound();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                      							}
+                      							add(
+                      								current,
+                      								"constraints",
+                      								lv_constraints_4_0,
+                      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalEntityMockDSL.g:11253:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    loop198:
+                    do {
+                        int alt198=2;
+                        int LA198_0 = input.LA(1);
+
+                        if ( (LA198_0==153) ) {
+                            alt198=1;
+                        }
+
+
+                        switch (alt198) {
+                    	case 1 :
+                    	    // InternalEntityMockDSL.g:11254:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    {
+                    	    // InternalEntityMockDSL.g:11254:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalEntityMockDSL.g:11255:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_148);
+                    	    lv_constraints_5_0=ruleJvmLowerBoundAnded();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"constraints",
+                    	      								lv_constraints_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop198;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // InternalEntityMockDSL.g:11278:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBound = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11278:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalEntityMockDSL.g:11279:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmUpperBound=ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmUpperBound; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmUpperBound"
+
+
+    // $ANTLR start "ruleJvmUpperBound"
+    // InternalEntityMockDSL.g:11285:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    public final EObject ruleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11291:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalEntityMockDSL.g:11292:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalEntityMockDSL.g:11292:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalEntityMockDSL.g:11293:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,139,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:11297:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:11298:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:11298:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:11299:5: lv_typeReference_1_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_typeReference_1_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmUpperBound"
+
+
+    // $ANTLR start "entryRuleJvmUpperBoundAnded"
+    // InternalEntityMockDSL.g:11320:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBoundAnded = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11320:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalEntityMockDSL.g:11321:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmUpperBoundAnded; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "ruleJvmUpperBoundAnded"
+    // InternalEntityMockDSL.g:11327:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11333:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalEntityMockDSL.g:11334:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalEntityMockDSL.g:11334:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalEntityMockDSL.g:11335:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,153,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:11339:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:11340:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:11340:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:11341:5: lv_typeReference_1_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_typeReference_1_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "entryRuleJvmLowerBound"
+    // InternalEntityMockDSL.g:11362:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBound = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11362:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalEntityMockDSL.g:11363:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmLowerBound=ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmLowerBound; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmLowerBound"
+
+
+    // $ANTLR start "ruleJvmLowerBound"
+    // InternalEntityMockDSL.g:11369:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    public final EObject ruleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11375:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalEntityMockDSL.g:11376:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalEntityMockDSL.g:11376:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalEntityMockDSL.g:11377:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,140,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:11381:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:11382:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:11382:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:11383:5: lv_typeReference_1_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_typeReference_1_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmLowerBound"
+
+
+    // $ANTLR start "entryRuleJvmLowerBoundAnded"
+    // InternalEntityMockDSL.g:11404:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBoundAnded = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11404:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalEntityMockDSL.g:11405:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmLowerBoundAnded; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "ruleJvmLowerBoundAnded"
+    // InternalEntityMockDSL.g:11411:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11417:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalEntityMockDSL.g:11418:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            {
+            // InternalEntityMockDSL.g:11418:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalEntityMockDSL.g:11419:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            {
+            otherlv_0=(Token)match(input,153,FOLLOW_39); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+              		
+            }
+            // InternalEntityMockDSL.g:11423:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalEntityMockDSL.g:11424:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            {
+            // InternalEntityMockDSL.g:11424:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalEntityMockDSL.g:11425:5: lv_typeReference_1_0= ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_2);
+            lv_typeReference_1_0=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
+    // InternalEntityMockDSL.g:11446:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11446:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalEntityMockDSL.g:11447:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedNameWithWildcard.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "ruleQualifiedNameWithWildcard"
+    // InternalEntityMockDSL.g:11453:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
+    public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_QualifiedName_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11459:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalEntityMockDSL.g:11460:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            {
+            // InternalEntityMockDSL.g:11460:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalEntityMockDSL.g:11461:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
+              		
+            }
+            pushFollow(FOLLOW_72);
+            this_QualifiedName_0=ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_QualifiedName_0);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            kw=(Token)match(input,34,FOLLOW_149); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
+              		
+            }
+            kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "entryRuleValidID"
+    // InternalEntityMockDSL.g:11485:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    public final String entryRuleValidID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleValidID = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11485:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalEntityMockDSL.g:11486:2: iv_ruleValidID= ruleValidID EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getValidIDRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleValidID=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleValidID.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleValidID"
+
+
+    // $ANTLR start "ruleValidID"
+    // InternalEntityMockDSL.g:11492:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_ID_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11498:2: (this_ID_0= RULE_ID )
+            // InternalEntityMockDSL.g:11499:2: this_ID_0= RULE_ID
+            {
+            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_ID_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValidID"
+
+
+    // $ANTLR start "entryRuleXImportSection"
+    // InternalEntityMockDSL.g:11509:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
+    public final EObject entryRuleXImportSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportSection = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11509:55: (iv_ruleXImportSection= ruleXImportSection EOF )
+            // InternalEntityMockDSL.g:11510:2: iv_ruleXImportSection= ruleXImportSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXImportSectionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleXImportSection=ruleXImportSection();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXImportSection; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXImportSection"
+
+
+    // $ANTLR start "ruleXImportSection"
+    // InternalEntityMockDSL.g:11516:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
+    public final EObject ruleXImportSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_importDeclarations_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11522:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
+            // InternalEntityMockDSL.g:11523:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            {
+            // InternalEntityMockDSL.g:11523:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            int cnt200=0;
+            loop200:
+            do {
+                int alt200=2;
+                int LA200_0 = input.LA(1);
+
+                if ( (LA200_0==87) ) {
+                    alt200=1;
+                }
+
+
+                switch (alt200) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11524:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    {
+            	    // InternalEntityMockDSL.g:11524:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalEntityMockDSL.g:11525:4: lv_importDeclarations_0_0= ruleXImportDeclaration
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
+            	      			
+            	    }
+            	    pushFollow(FOLLOW_150);
+            	    lv_importDeclarations_0_0=ruleXImportDeclaration();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				if (current==null) {
+            	      					current = createModelElementForParent(grammarAccess.getXImportSectionRule());
+            	      				}
+            	      				add(
+            	      					current,
+            	      					"importDeclarations",
+            	      					lv_importDeclarations_0_0,
+            	      					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
+            	      				afterParserOrEnumRuleCall();
+            	      			
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt200 >= 1 ) break loop200;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(200, input);
+                        throw eee;
+                }
+                cnt200++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXImportSection"
+
+
+    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
+    // InternalEntityMockDSL.g:11545:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;
+
+
+        try {
+            // InternalEntityMockDSL.g:11545:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalEntityMockDSL.g:11546:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedNameInStaticImport.getText(); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleQualifiedNameInStaticImport"
+    // InternalEntityMockDSL.g:11552:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
+    public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_ValidID_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11558:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalEntityMockDSL.g:11559:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            {
+            // InternalEntityMockDSL.g:11559:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            int cnt201=0;
+            loop201:
+            do {
+                int alt201=2;
+                int LA201_0 = input.LA(1);
+
+                if ( (LA201_0==RULE_ID) ) {
+                    int LA201_2 = input.LA(2);
+
+                    if ( (LA201_2==34) ) {
+                        alt201=1;
+                    }
+
+
+                }
+
+
+                switch (alt201) {
+            	case 1 :
+            	    // InternalEntityMockDSL.g:11560:3: this_ValidID_0= ruleValidID kw= '.'
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
+            	      		
+            	    }
+            	    pushFollow(FOLLOW_72);
+            	    this_ValidID_0=ruleValidID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      			current.merge(this_ValidID_0);
+            	      		
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      			afterParserOrEnumRuleCall();
+            	      		
+            	    }
+            	    kw=(Token)match(input,34,FOLLOW_151); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      			current.merge(kw);
+            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
+            	      		
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt201 >= 1 ) break loop201;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(201, input);
+                        throw eee;
+                }
+                cnt201++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleEDateStepType"
+    // InternalEntityMockDSL.g:11579:1: ruleEDateStepType returns [Enumerator current=null] : ( (enumLiteral_0= 'days' ) | (enumLiteral_1= 'weeks' ) | (enumLiteral_2= 'months' ) | (enumLiteral_3= 'years' ) ) ;
+    public final Enumerator ruleEDateStepType() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalEntityMockDSL.g:11585:2: ( ( (enumLiteral_0= 'days' ) | (enumLiteral_1= 'weeks' ) | (enumLiteral_2= 'months' ) | (enumLiteral_3= 'years' ) ) )
+            // InternalEntityMockDSL.g:11586:2: ( (enumLiteral_0= 'days' ) | (enumLiteral_1= 'weeks' ) | (enumLiteral_2= 'months' ) | (enumLiteral_3= 'years' ) )
+            {
+            // InternalEntityMockDSL.g:11586:2: ( (enumLiteral_0= 'days' ) | (enumLiteral_1= 'weeks' ) | (enumLiteral_2= 'months' ) | (enumLiteral_3= 'years' ) )
+            int alt202=4;
+            switch ( input.LA(1) ) {
+            case 154:
+                {
+                alt202=1;
+                }
+                break;
+            case 155:
+                {
+                alt202=2;
+                }
+                break;
+            case 156:
+                {
+                alt202=3;
+                }
+                break;
+            case 43:
+                {
+                alt202=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 202, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt202) {
+                case 1 :
+                    // InternalEntityMockDSL.g:11587:3: (enumLiteral_0= 'days' )
+                    {
+                    // InternalEntityMockDSL.g:11587:3: (enumLiteral_0= 'days' )
+                    // InternalEntityMockDSL.g:11588:4: enumLiteral_0= 'days'
+                    {
+                    enumLiteral_0=(Token)match(input,154,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getEDateStepTypeAccess().getDAYSEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalEntityMockDSL.g:11595:3: (enumLiteral_1= 'weeks' )
+                    {
+                    // InternalEntityMockDSL.g:11595:3: (enumLiteral_1= 'weeks' )
+                    // InternalEntityMockDSL.g:11596:4: enumLiteral_1= 'weeks'
+                    {
+                    enumLiteral_1=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getEDateStepTypeAccess().getWEEKSEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalEntityMockDSL.g:11603:3: (enumLiteral_2= 'months' )
+                    {
+                    // InternalEntityMockDSL.g:11603:3: (enumLiteral_2= 'months' )
+                    // InternalEntityMockDSL.g:11604:4: enumLiteral_2= 'months'
+                    {
+                    enumLiteral_2=(Token)match(input,156,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getEDateStepTypeAccess().getMONTHSEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalEntityMockDSL.g:11611:3: (enumLiteral_3= 'years' )
+                    {
+                    // InternalEntityMockDSL.g:11611:3: (enumLiteral_3= 'years' )
+                    // InternalEntityMockDSL.g:11612:4: enumLiteral_3= 'years'
+                    {
+                    enumLiteral_3=(Token)match(input,43,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getEDateStepTypeAccess().getYEARSEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEDateStepType"
+
+    // $ANTLR start synpred1_InternalEntityMockDSL
+    public final void synpred1_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4955:5: ( '(' )
+        // InternalEntityMockDSL.g:4955:6: '('
+        {
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1_InternalEntityMockDSL
+
+    // $ANTLR start synpred2_InternalEntityMockDSL
+    public final void synpred2_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:4964:7: ( ( ( ( ruleValidID ) ) '=' ) )
+        // InternalEntityMockDSL.g:4964:8: ( ( ( ruleValidID ) ) '=' )
+        {
+        // InternalEntityMockDSL.g:4964:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalEntityMockDSL.g:4965:8: ( ( ruleValidID ) ) '='
+        {
+        // InternalEntityMockDSL.g:4965:8: ( ( ruleValidID ) )
+        // InternalEntityMockDSL.g:4966:9: ( ruleValidID )
+        {
+        // InternalEntityMockDSL.g:4966:9: ( ruleValidID )
+        // InternalEntityMockDSL.g:4967:10: ruleValidID
+        {
+        pushFollow(FOLLOW_83);
+        ruleValidID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,94,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred2_InternalEntityMockDSL
+
+    // $ANTLR start synpred5_InternalEntityMockDSL
+    public final void synpred5_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5144:5: ( ( () '#' '[' ) )
+        // InternalEntityMockDSL.g:5144:6: ( () '#' '[' )
+        {
+        // InternalEntityMockDSL.g:5144:6: ( () '#' '[' )
+        // InternalEntityMockDSL.g:5145:6: () '#' '['
+        {
+        // InternalEntityMockDSL.g:5145:6: ()
+        // InternalEntityMockDSL.g:5146:6: 
+        {
+        }
+
+        match(input,95,FOLLOW_85); if (state.failed) return ;
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred5_InternalEntityMockDSL
+
+    // $ANTLR start synpred6_InternalEntityMockDSL
+    public final void synpred6_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5286:5: ( ( () '#' '[' ) )
+        // InternalEntityMockDSL.g:5286:6: ( () '#' '[' )
+        {
+        // InternalEntityMockDSL.g:5286:6: ( () '#' '[' )
+        // InternalEntityMockDSL.g:5287:6: () '#' '['
+        {
+        // InternalEntityMockDSL.g:5287:6: ()
+        // InternalEntityMockDSL.g:5288:6: 
+        {
+        }
+
+        match(input,95,FOLLOW_85); if (state.failed) return ;
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred6_InternalEntityMockDSL
+
+    // $ANTLR start synpred7_InternalEntityMockDSL
+    public final void synpred7_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5514:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
+        // InternalEntityMockDSL.g:5514:7: ( () ( ( ruleOpMultiAssign ) ) )
+        {
+        // InternalEntityMockDSL.g:5514:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalEntityMockDSL.g:5515:7: () ( ( ruleOpMultiAssign ) )
+        {
+        // InternalEntityMockDSL.g:5515:7: ()
+        // InternalEntityMockDSL.g:5516:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:5517:7: ( ( ruleOpMultiAssign ) )
+        // InternalEntityMockDSL.g:5518:8: ( ruleOpMultiAssign )
+        {
+        // InternalEntityMockDSL.g:5518:8: ( ruleOpMultiAssign )
+        // InternalEntityMockDSL.g:5519:9: ruleOpMultiAssign
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMultiAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred7_InternalEntityMockDSL
+
+    // $ANTLR start synpred8_InternalEntityMockDSL
+    public final void synpred8_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5708:5: ( ( () ( ( ruleOpOr ) ) ) )
+        // InternalEntityMockDSL.g:5708:6: ( () ( ( ruleOpOr ) ) )
+        {
+        // InternalEntityMockDSL.g:5708:6: ( () ( ( ruleOpOr ) ) )
+        // InternalEntityMockDSL.g:5709:6: () ( ( ruleOpOr ) )
+        {
+        // InternalEntityMockDSL.g:5709:6: ()
+        // InternalEntityMockDSL.g:5710:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:5711:6: ( ( ruleOpOr ) )
+        // InternalEntityMockDSL.g:5712:7: ( ruleOpOr )
+        {
+        // InternalEntityMockDSL.g:5712:7: ( ruleOpOr )
+        // InternalEntityMockDSL.g:5713:8: ruleOpOr
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOr();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred8_InternalEntityMockDSL
+
+    // $ANTLR start synpred9_InternalEntityMockDSL
+    public final void synpred9_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5815:5: ( ( () ( ( ruleOpAnd ) ) ) )
+        // InternalEntityMockDSL.g:5815:6: ( () ( ( ruleOpAnd ) ) )
+        {
+        // InternalEntityMockDSL.g:5815:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalEntityMockDSL.g:5816:6: () ( ( ruleOpAnd ) )
+        {
+        // InternalEntityMockDSL.g:5816:6: ()
+        // InternalEntityMockDSL.g:5817:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:5818:6: ( ( ruleOpAnd ) )
+        // InternalEntityMockDSL.g:5819:7: ( ruleOpAnd )
+        {
+        // InternalEntityMockDSL.g:5819:7: ( ruleOpAnd )
+        // InternalEntityMockDSL.g:5820:8: ruleOpAnd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAnd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred9_InternalEntityMockDSL
+
+    // $ANTLR start synpred10_InternalEntityMockDSL
+    public final void synpred10_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:5922:5: ( ( () ( ( ruleOpEquality ) ) ) )
+        // InternalEntityMockDSL.g:5922:6: ( () ( ( ruleOpEquality ) ) )
+        {
+        // InternalEntityMockDSL.g:5922:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalEntityMockDSL.g:5923:6: () ( ( ruleOpEquality ) )
+        {
+        // InternalEntityMockDSL.g:5923:6: ()
+        // InternalEntityMockDSL.g:5924:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:5925:6: ( ( ruleOpEquality ) )
+        // InternalEntityMockDSL.g:5926:7: ( ruleOpEquality )
+        {
+        // InternalEntityMockDSL.g:5926:7: ( ruleOpEquality )
+        // InternalEntityMockDSL.g:5927:8: ruleOpEquality
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpEquality();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred10_InternalEntityMockDSL
+
+    // $ANTLR start synpred11_InternalEntityMockDSL
+    public final void synpred11_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6050:6: ( ( () 'instanceof' ) )
+        // InternalEntityMockDSL.g:6050:7: ( () 'instanceof' )
+        {
+        // InternalEntityMockDSL.g:6050:7: ( () 'instanceof' )
+        // InternalEntityMockDSL.g:6051:7: () 'instanceof'
+        {
+        // InternalEntityMockDSL.g:6051:7: ()
+        // InternalEntityMockDSL.g:6052:7: 
+        {
+        }
+
+        match(input,112,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred11_InternalEntityMockDSL
+
+    // $ANTLR start synpred12_InternalEntityMockDSL
+    public final void synpred12_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6093:6: ( ( () ( ( ruleOpCompare ) ) ) )
+        // InternalEntityMockDSL.g:6093:7: ( () ( ( ruleOpCompare ) ) )
+        {
+        // InternalEntityMockDSL.g:6093:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalEntityMockDSL.g:6094:7: () ( ( ruleOpCompare ) )
+        {
+        // InternalEntityMockDSL.g:6094:7: ()
+        // InternalEntityMockDSL.g:6095:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6096:7: ( ( ruleOpCompare ) )
+        // InternalEntityMockDSL.g:6097:8: ( ruleOpCompare )
+        {
+        // InternalEntityMockDSL.g:6097:8: ( ruleOpCompare )
+        // InternalEntityMockDSL.g:6098:9: ruleOpCompare
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpCompare();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred12_InternalEntityMockDSL
+
+    // $ANTLR start synpred13_InternalEntityMockDSL
+    public final void synpred13_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6228:5: ( ( () ( ( ruleOpOther ) ) ) )
+        // InternalEntityMockDSL.g:6228:6: ( () ( ( ruleOpOther ) ) )
+        {
+        // InternalEntityMockDSL.g:6228:6: ( () ( ( ruleOpOther ) ) )
+        // InternalEntityMockDSL.g:6229:6: () ( ( ruleOpOther ) )
+        {
+        // InternalEntityMockDSL.g:6229:6: ()
+        // InternalEntityMockDSL.g:6230:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6231:6: ( ( ruleOpOther ) )
+        // InternalEntityMockDSL.g:6232:7: ( ruleOpOther )
+        {
+        // InternalEntityMockDSL.g:6232:7: ( ruleOpOther )
+        // InternalEntityMockDSL.g:6233:8: ruleOpOther
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpOther();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred13_InternalEntityMockDSL
+
+    // $ANTLR start synpred14_InternalEntityMockDSL
+    public final void synpred14_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6348:6: ( ( '>' '>' ) )
+        // InternalEntityMockDSL.g:6348:7: ( '>' '>' )
+        {
+        // InternalEntityMockDSL.g:6348:7: ( '>' '>' )
+        // InternalEntityMockDSL.g:6349:7: '>' '>'
+        {
+        match(input,104,FOLLOW_99); if (state.failed) return ;
+        match(input,104,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred14_InternalEntityMockDSL
+
+    // $ANTLR start synpred15_InternalEntityMockDSL
+    public final void synpred15_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6383:6: ( ( '<' '<' ) )
+        // InternalEntityMockDSL.g:6383:7: ( '<' '<' )
+        {
+        // InternalEntityMockDSL.g:6383:7: ( '<' '<' )
+        // InternalEntityMockDSL.g:6384:7: '<' '<'
+        {
+        match(input,103,FOLLOW_90); if (state.failed) return ;
+        match(input,103,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred15_InternalEntityMockDSL
+
+    // $ANTLR start synpred16_InternalEntityMockDSL
+    public final void synpred16_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6456:5: ( ( () ( ( ruleOpAdd ) ) ) )
+        // InternalEntityMockDSL.g:6456:6: ( () ( ( ruleOpAdd ) ) )
+        {
+        // InternalEntityMockDSL.g:6456:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalEntityMockDSL.g:6457:6: () ( ( ruleOpAdd ) )
+        {
+        // InternalEntityMockDSL.g:6457:6: ()
+        // InternalEntityMockDSL.g:6458:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6459:6: ( ( ruleOpAdd ) )
+        // InternalEntityMockDSL.g:6460:7: ( ruleOpAdd )
+        {
+        // InternalEntityMockDSL.g:6460:7: ( ruleOpAdd )
+        // InternalEntityMockDSL.g:6461:8: ruleOpAdd
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpAdd();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred16_InternalEntityMockDSL
+
+    // $ANTLR start synpred17_InternalEntityMockDSL
+    public final void synpred17_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6571:5: ( ( () ( ( ruleOpMulti ) ) ) )
+        // InternalEntityMockDSL.g:6571:6: ( () ( ( ruleOpMulti ) ) )
+        {
+        // InternalEntityMockDSL.g:6571:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalEntityMockDSL.g:6572:6: () ( ( ruleOpMulti ) )
+        {
+        // InternalEntityMockDSL.g:6572:6: ()
+        // InternalEntityMockDSL.g:6573:6: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6574:6: ( ( ruleOpMulti ) )
+        // InternalEntityMockDSL.g:6575:7: ( ruleOpMulti )
+        {
+        // InternalEntityMockDSL.g:6575:7: ( ruleOpMulti )
+        // InternalEntityMockDSL.g:6576:8: ruleOpMulti
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpMulti();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred17_InternalEntityMockDSL
+
+    // $ANTLR start synpred18_InternalEntityMockDSL
+    public final void synpred18_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6806:5: ( ( () 'as' ) )
+        // InternalEntityMockDSL.g:6806:6: ( () 'as' )
+        {
+        // InternalEntityMockDSL.g:6806:6: ( () 'as' )
+        // InternalEntityMockDSL.g:6807:6: () 'as'
+        {
+        // InternalEntityMockDSL.g:6807:6: ()
+        // InternalEntityMockDSL.g:6808:6: 
+        {
+        }
+
+        match(input,78,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred18_InternalEntityMockDSL
+
+    // $ANTLR start synpred19_InternalEntityMockDSL
+    public final void synpred19_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6874:4: ( ( () ( ( ruleOpPostfix ) ) ) )
+        // InternalEntityMockDSL.g:6874:5: ( () ( ( ruleOpPostfix ) ) )
+        {
+        // InternalEntityMockDSL.g:6874:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalEntityMockDSL.g:6875:5: () ( ( ruleOpPostfix ) )
+        {
+        // InternalEntityMockDSL.g:6875:5: ()
+        // InternalEntityMockDSL.g:6876:5: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6877:5: ( ( ruleOpPostfix ) )
+        // InternalEntityMockDSL.g:6878:6: ( ruleOpPostfix )
+        {
+        // InternalEntityMockDSL.g:6878:6: ( ruleOpPostfix )
+        // InternalEntityMockDSL.g:6879:7: ruleOpPostfix
+        {
+        pushFollow(FOLLOW_2);
+        ruleOpPostfix();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred19_InternalEntityMockDSL
+
+    // $ANTLR start synpred20_InternalEntityMockDSL
+    public final void synpred20_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:6970:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+        // InternalEntityMockDSL.g:6970:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        {
+        // InternalEntityMockDSL.g:6970:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalEntityMockDSL.g:6971:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+        {
+        // InternalEntityMockDSL.g:6971:7: ()
+        // InternalEntityMockDSL.g:6972:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:6973:7: ( '.' | ( ( '::' ) ) )
+        int alt203=2;
+        int LA203_0 = input.LA(1);
+
+        if ( (LA203_0==34) ) {
+            alt203=1;
+        }
+        else if ( (LA203_0==126) ) {
+            alt203=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 203, 0, input);
+
+            throw nvae;
+        }
+        switch (alt203) {
+            case 1 :
+                // InternalEntityMockDSL.g:6974:8: '.'
+                {
+                match(input,34,FOLLOW_106); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalEntityMockDSL.g:6976:8: ( ( '::' ) )
+                {
+                // InternalEntityMockDSL.g:6976:8: ( ( '::' ) )
+                // InternalEntityMockDSL.g:6977:9: ( '::' )
+                {
+                // InternalEntityMockDSL.g:6977:9: ( '::' )
+                // InternalEntityMockDSL.g:6978:10: '::'
+                {
+                match(input,126,FOLLOW_106); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+        // InternalEntityMockDSL.g:6982:7: ( ( ruleFeatureCallID ) )
+        // InternalEntityMockDSL.g:6983:8: ( ruleFeatureCallID )
+        {
+        // InternalEntityMockDSL.g:6983:8: ( ruleFeatureCallID )
+        // InternalEntityMockDSL.g:6984:9: ruleFeatureCallID
+        {
+        pushFollow(FOLLOW_83);
+        ruleFeatureCallID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleOpSingleAssign();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred20_InternalEntityMockDSL
+
+    // $ANTLR start synpred21_InternalEntityMockDSL
+    public final void synpred21_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7067:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
+        // InternalEntityMockDSL.g:7067:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        {
+        // InternalEntityMockDSL.g:7067:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalEntityMockDSL.g:7068:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        {
+        // InternalEntityMockDSL.g:7068:7: ()
+        // InternalEntityMockDSL.g:7069:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:7070:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        int alt204=3;
+        switch ( input.LA(1) ) {
+        case 34:
+            {
+            alt204=1;
+            }
+            break;
+        case 127:
+            {
+            alt204=2;
+            }
+            break;
+        case 126:
+            {
+            alt204=3;
+            }
+            break;
+        default:
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 204, 0, input);
+
+            throw nvae;
+        }
+
+        switch (alt204) {
+            case 1 :
+                // InternalEntityMockDSL.g:7071:8: '.'
+                {
+                match(input,34,FOLLOW_2); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalEntityMockDSL.g:7073:8: ( ( '?.' ) )
+                {
+                // InternalEntityMockDSL.g:7073:8: ( ( '?.' ) )
+                // InternalEntityMockDSL.g:7074:9: ( '?.' )
+                {
+                // InternalEntityMockDSL.g:7074:9: ( '?.' )
+                // InternalEntityMockDSL.g:7075:10: '?.'
+                {
+                match(input,127,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 3 :
+                // InternalEntityMockDSL.g:7079:8: ( ( '::' ) )
+                {
+                // InternalEntityMockDSL.g:7079:8: ( ( '::' ) )
+                // InternalEntityMockDSL.g:7080:9: ( '::' )
+                {
+                // InternalEntityMockDSL.g:7080:9: ( '::' )
+                // InternalEntityMockDSL.g:7081:10: '::'
+                {
+                match(input,126,FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred21_InternalEntityMockDSL
+
+    // $ANTLR start synpred22_InternalEntityMockDSL
+    public final void synpred22_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7205:7: ( ( '(' ) )
+        // InternalEntityMockDSL.g:7205:8: ( '(' )
+        {
+        // InternalEntityMockDSL.g:7205:8: ( '(' )
+        // InternalEntityMockDSL.g:7206:8: '('
+        {
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred22_InternalEntityMockDSL
+
+    // $ANTLR start synpred23_InternalEntityMockDSL
+    public final void synpred23_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7224:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalEntityMockDSL.g:7224:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalEntityMockDSL.g:7224:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalEntityMockDSL.g:7225:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalEntityMockDSL.g:7225:9: ()
+        // InternalEntityMockDSL.g:7226:9: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:7227:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt206=2;
+        int LA206_0 = input.LA(1);
+
+        if ( (LA206_0==RULE_ID||LA206_0==25||LA206_0==116) ) {
+            alt206=1;
+        }
+        switch (alt206) {
+            case 1 :
+                // InternalEntityMockDSL.g:7228:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalEntityMockDSL.g:7228:10: ( ( ruleJvmFormalParameter ) )
+                // InternalEntityMockDSL.g:7229:11: ( ruleJvmFormalParameter )
+                {
+                // InternalEntityMockDSL.g:7229:11: ( ruleJvmFormalParameter )
+                // InternalEntityMockDSL.g:7230:12: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_116);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalEntityMockDSL.g:7233:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop205:
+                do {
+                    int alt205=2;
+                    int LA205_0 = input.LA(1);
+
+                    if ( (LA205_0==26) ) {
+                        alt205=1;
+                    }
+
+
+                    switch (alt205) {
+                	case 1 :
+                	    // InternalEntityMockDSL.g:7234:11: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,26,FOLLOW_39); if (state.failed) return ;
+                	    // InternalEntityMockDSL.g:7235:11: ( ( ruleJvmFormalParameter ) )
+                	    // InternalEntityMockDSL.g:7236:12: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalEntityMockDSL.g:7236:12: ( ruleJvmFormalParameter )
+                	    // InternalEntityMockDSL.g:7237:13: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_116);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop205;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalEntityMockDSL.g:7242:9: ( ( '|' ) )
+        // InternalEntityMockDSL.g:7243:10: ( '|' )
+        {
+        // InternalEntityMockDSL.g:7243:10: ( '|' )
+        // InternalEntityMockDSL.g:7244:11: '|'
+        {
+        match(input,128,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred23_InternalEntityMockDSL
+
+    // $ANTLR start synpred24_InternalEntityMockDSL
+    public final void synpred24_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7321:6: ( ( () '[' ) )
+        // InternalEntityMockDSL.g:7321:7: ( () '[' )
+        {
+        // InternalEntityMockDSL.g:7321:7: ( () '[' )
+        // InternalEntityMockDSL.g:7322:7: () '['
+        {
+        // InternalEntityMockDSL.g:7322:7: ()
+        // InternalEntityMockDSL.g:7323:7: 
+        {
+        }
+
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred24_InternalEntityMockDSL
+
+    // $ANTLR start synpred25_InternalEntityMockDSL
+    public final void synpred25_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7394:4: ( ( () 'synchronized' '(' ) )
+        // InternalEntityMockDSL.g:7394:5: ( () 'synchronized' '(' )
+        {
+        // InternalEntityMockDSL.g:7394:5: ( () 'synchronized' '(' )
+        // InternalEntityMockDSL.g:7395:5: () 'synchronized' '('
+        {
+        // InternalEntityMockDSL.g:7395:5: ()
+        // InternalEntityMockDSL.g:7396:5: 
+        {
+        }
+
+        match(input,150,FOLLOW_17); if (state.failed) return ;
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred25_InternalEntityMockDSL
+
+    // $ANTLR start synpred26_InternalEntityMockDSL
+    public final void synpred26_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7439:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalEntityMockDSL.g:7439:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalEntityMockDSL.g:7439:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalEntityMockDSL.g:7440:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalEntityMockDSL.g:7440:5: ()
+        // InternalEntityMockDSL.g:7441:5: 
+        {
+        }
+
+        match(input,135,FOLLOW_17); if (state.failed) return ;
+        match(input,25,FOLLOW_39); if (state.failed) return ;
+        // InternalEntityMockDSL.g:7444:5: ( ( ruleJvmFormalParameter ) )
+        // InternalEntityMockDSL.g:7445:6: ( ruleJvmFormalParameter )
+        {
+        // InternalEntityMockDSL.g:7445:6: ( ruleJvmFormalParameter )
+        // InternalEntityMockDSL.g:7446:7: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_123);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,132,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred26_InternalEntityMockDSL
+
+    // $ANTLR start synpred27_InternalEntityMockDSL
+    public final void synpred27_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7553:4: ( ( () '[' ) )
+        // InternalEntityMockDSL.g:7553:5: ( () '[' )
+        {
+        // InternalEntityMockDSL.g:7553:5: ( () '[' )
+        // InternalEntityMockDSL.g:7554:5: () '['
+        {
+        // InternalEntityMockDSL.g:7554:5: ()
+        // InternalEntityMockDSL.g:7555:5: 
+        {
+        }
+
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred27_InternalEntityMockDSL
+
+    // $ANTLR start synpred29_InternalEntityMockDSL
+    public final void synpred29_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:7858:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalEntityMockDSL.g:7858:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalEntityMockDSL.g:7858:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalEntityMockDSL.g:7859:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalEntityMockDSL.g:7859:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt208=2;
+        int LA208_0 = input.LA(1);
+
+        if ( (LA208_0==RULE_ID||LA208_0==25||LA208_0==116) ) {
+            alt208=1;
+        }
+        switch (alt208) {
+            case 1 :
+                // InternalEntityMockDSL.g:7860:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalEntityMockDSL.g:7860:6: ( ( ruleJvmFormalParameter ) )
+                // InternalEntityMockDSL.g:7861:7: ( ruleJvmFormalParameter )
+                {
+                // InternalEntityMockDSL.g:7861:7: ( ruleJvmFormalParameter )
+                // InternalEntityMockDSL.g:7862:8: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_116);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalEntityMockDSL.g:7865:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop207:
+                do {
+                    int alt207=2;
+                    int LA207_0 = input.LA(1);
+
+                    if ( (LA207_0==26) ) {
+                        alt207=1;
+                    }
+
+
+                    switch (alt207) {
+                	case 1 :
+                	    // InternalEntityMockDSL.g:7866:7: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,26,FOLLOW_39); if (state.failed) return ;
+                	    // InternalEntityMockDSL.g:7867:7: ( ( ruleJvmFormalParameter ) )
+                	    // InternalEntityMockDSL.g:7868:8: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalEntityMockDSL.g:7868:8: ( ruleJvmFormalParameter )
+                	    // InternalEntityMockDSL.g:7869:9: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_116);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop207;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalEntityMockDSL.g:7874:5: ( ( '|' ) )
+        // InternalEntityMockDSL.g:7875:6: ( '|' )
+        {
+        // InternalEntityMockDSL.g:7875:6: ( '|' )
+        // InternalEntityMockDSL.g:7876:7: '|'
+        {
+        match(input,128,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred29_InternalEntityMockDSL
+
+    // $ANTLR start synpred31_InternalEntityMockDSL
+    public final void synpred31_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:8267:5: ( 'else' )
+        // InternalEntityMockDSL.g:8267:6: 'else'
+        {
+        match(input,130,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred31_InternalEntityMockDSL
+
+    // $ANTLR start synpred32_InternalEntityMockDSL
+    public final void synpred32_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:8326:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalEntityMockDSL.g:8326:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalEntityMockDSL.g:8326:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalEntityMockDSL.g:8327:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        match(input,25,FOLLOW_39); if (state.failed) return ;
+        // InternalEntityMockDSL.g:8328:7: ( ( ruleJvmFormalParameter ) )
+        // InternalEntityMockDSL.g:8329:8: ( ruleJvmFormalParameter )
+        {
+        // InternalEntityMockDSL.g:8329:8: ( ruleJvmFormalParameter )
+        // InternalEntityMockDSL.g:8330:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_123);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,132,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred32_InternalEntityMockDSL
+
+    // $ANTLR start synpred33_InternalEntityMockDSL
+    public final void synpred33_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:8393:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalEntityMockDSL.g:8393:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        {
+        // InternalEntityMockDSL.g:8393:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalEntityMockDSL.g:8394:7: ( ( ruleJvmFormalParameter ) ) ':'
+        {
+        // InternalEntityMockDSL.g:8394:7: ( ( ruleJvmFormalParameter ) )
+        // InternalEntityMockDSL.g:8395:8: ( ruleJvmFormalParameter )
+        {
+        // InternalEntityMockDSL.g:8395:8: ( ruleJvmFormalParameter )
+        // InternalEntityMockDSL.g:8396:9: ruleJvmFormalParameter
+        {
+        pushFollow(FOLLOW_123);
+        ruleJvmFormalParameter();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        match(input,132,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred33_InternalEntityMockDSL
+
+    // $ANTLR start synpred35_InternalEntityMockDSL
+    public final void synpred35_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9211:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
+        // InternalEntityMockDSL.g:9211:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        {
+        // InternalEntityMockDSL.g:9211:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalEntityMockDSL.g:9212:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
+        {
+        // InternalEntityMockDSL.g:9212:6: ( ( ruleJvmTypeReference ) )
+        // InternalEntityMockDSL.g:9213:7: ( ruleJvmTypeReference )
+        {
+        // InternalEntityMockDSL.g:9213:7: ( ruleJvmTypeReference )
+        // InternalEntityMockDSL.g:9214:8: ruleJvmTypeReference
+        {
+        pushFollow(FOLLOW_4);
+        ruleJvmTypeReference();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalEntityMockDSL.g:9217:6: ( ( ruleValidID ) )
+        // InternalEntityMockDSL.g:9218:7: ( ruleValidID )
+        {
+        // InternalEntityMockDSL.g:9218:7: ( ruleValidID )
+        // InternalEntityMockDSL.g:9219:8: ruleValidID
+        {
+        pushFollow(FOLLOW_2);
+        ruleValidID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred35_InternalEntityMockDSL
+
+    // $ANTLR start synpred36_InternalEntityMockDSL
+    public final void synpred36_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9523:5: ( ( '(' ) )
+        // InternalEntityMockDSL.g:9523:6: ( '(' )
+        {
+        // InternalEntityMockDSL.g:9523:6: ( '(' )
+        // InternalEntityMockDSL.g:9524:6: '('
+        {
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred36_InternalEntityMockDSL
+
+    // $ANTLR start synpred37_InternalEntityMockDSL
+    public final void synpred37_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9542:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalEntityMockDSL.g:9542:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalEntityMockDSL.g:9542:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalEntityMockDSL.g:9543:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalEntityMockDSL.g:9543:7: ()
+        // InternalEntityMockDSL.g:9544:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:9545:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt212=2;
+        int LA212_0 = input.LA(1);
+
+        if ( (LA212_0==RULE_ID||LA212_0==25||LA212_0==116) ) {
+            alt212=1;
+        }
+        switch (alt212) {
+            case 1 :
+                // InternalEntityMockDSL.g:9546:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalEntityMockDSL.g:9546:8: ( ( ruleJvmFormalParameter ) )
+                // InternalEntityMockDSL.g:9547:9: ( ruleJvmFormalParameter )
+                {
+                // InternalEntityMockDSL.g:9547:9: ( ruleJvmFormalParameter )
+                // InternalEntityMockDSL.g:9548:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_116);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalEntityMockDSL.g:9551:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop211:
+                do {
+                    int alt211=2;
+                    int LA211_0 = input.LA(1);
+
+                    if ( (LA211_0==26) ) {
+                        alt211=1;
+                    }
+
+
+                    switch (alt211) {
+                	case 1 :
+                	    // InternalEntityMockDSL.g:9552:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,26,FOLLOW_39); if (state.failed) return ;
+                	    // InternalEntityMockDSL.g:9553:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalEntityMockDSL.g:9554:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalEntityMockDSL.g:9554:10: ( ruleJvmFormalParameter )
+                	    // InternalEntityMockDSL.g:9555:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_116);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop211;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalEntityMockDSL.g:9560:7: ( ( '|' ) )
+        // InternalEntityMockDSL.g:9561:8: ( '|' )
+        {
+        // InternalEntityMockDSL.g:9561:8: ( '|' )
+        // InternalEntityMockDSL.g:9562:9: '|'
+        {
+        match(input,128,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred37_InternalEntityMockDSL
+
+    // $ANTLR start synpred38_InternalEntityMockDSL
+    public final void synpred38_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9639:4: ( ( () '[' ) )
+        // InternalEntityMockDSL.g:9639:5: ( () '[' )
+        {
+        // InternalEntityMockDSL.g:9639:5: ( () '[' )
+        // InternalEntityMockDSL.g:9640:5: () '['
+        {
+        // InternalEntityMockDSL.g:9640:5: ()
+        // InternalEntityMockDSL.g:9641:5: 
+        {
+        }
+
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred38_InternalEntityMockDSL
+
+    // $ANTLR start synpred39_InternalEntityMockDSL
+    public final void synpred39_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9799:5: ( '<' )
+        // InternalEntityMockDSL.g:9799:6: '<'
+        {
+        match(input,103,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred39_InternalEntityMockDSL
+
+    // $ANTLR start synpred40_InternalEntityMockDSL
+    public final void synpred40_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9856:5: ( ( '(' ) )
+        // InternalEntityMockDSL.g:9856:6: ( '(' )
+        {
+        // InternalEntityMockDSL.g:9856:6: ( '(' )
+        // InternalEntityMockDSL.g:9857:6: '('
+        {
+        match(input,25,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred40_InternalEntityMockDSL
+
+    // $ANTLR start synpred41_InternalEntityMockDSL
+    public final void synpred41_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9875:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalEntityMockDSL.g:9875:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        {
+        // InternalEntityMockDSL.g:9875:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalEntityMockDSL.g:9876:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        {
+        // InternalEntityMockDSL.g:9876:7: ()
+        // InternalEntityMockDSL.g:9877:7: 
+        {
+        }
+
+        // InternalEntityMockDSL.g:9878:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt214=2;
+        int LA214_0 = input.LA(1);
+
+        if ( (LA214_0==RULE_ID||LA214_0==25||LA214_0==116) ) {
+            alt214=1;
+        }
+        switch (alt214) {
+            case 1 :
+                // InternalEntityMockDSL.g:9879:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                {
+                // InternalEntityMockDSL.g:9879:8: ( ( ruleJvmFormalParameter ) )
+                // InternalEntityMockDSL.g:9880:9: ( ruleJvmFormalParameter )
+                {
+                // InternalEntityMockDSL.g:9880:9: ( ruleJvmFormalParameter )
+                // InternalEntityMockDSL.g:9881:10: ruleJvmFormalParameter
+                {
+                pushFollow(FOLLOW_116);
+                ruleJvmFormalParameter();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalEntityMockDSL.g:9884:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop213:
+                do {
+                    int alt213=2;
+                    int LA213_0 = input.LA(1);
+
+                    if ( (LA213_0==26) ) {
+                        alt213=1;
+                    }
+
+
+                    switch (alt213) {
+                	case 1 :
+                	    // InternalEntityMockDSL.g:9885:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    {
+                	    match(input,26,FOLLOW_39); if (state.failed) return ;
+                	    // InternalEntityMockDSL.g:9886:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalEntityMockDSL.g:9887:10: ( ruleJvmFormalParameter )
+                	    {
+                	    // InternalEntityMockDSL.g:9887:10: ( ruleJvmFormalParameter )
+                	    // InternalEntityMockDSL.g:9888:11: ruleJvmFormalParameter
+                	    {
+                	    pushFollow(FOLLOW_116);
+                	    ruleJvmFormalParameter();
+
+                	    state._fsp--;
+                	    if (state.failed) return ;
+
+                	    }
+
+
+                	    }
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop213;
+                    }
+                } while (true);
+
+
+                }
+                break;
+
+        }
+
+        // InternalEntityMockDSL.g:9893:7: ( ( '|' ) )
+        // InternalEntityMockDSL.g:9894:8: ( '|' )
+        {
+        // InternalEntityMockDSL.g:9894:8: ( '|' )
+        // InternalEntityMockDSL.g:9895:9: '|'
+        {
+        match(input,128,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred41_InternalEntityMockDSL
+
+    // $ANTLR start synpred42_InternalEntityMockDSL
+    public final void synpred42_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:9972:4: ( ( () '[' ) )
+        // InternalEntityMockDSL.g:9972:5: ( () '[' )
+        {
+        // InternalEntityMockDSL.g:9972:5: ( () '[' )
+        // InternalEntityMockDSL.g:9973:5: () '['
+        {
+        // InternalEntityMockDSL.g:9973:5: ()
+        // InternalEntityMockDSL.g:9974:5: 
+        {
+        }
+
+        match(input,96,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred42_InternalEntityMockDSL
+
+    // $ANTLR start synpred43_InternalEntityMockDSL
+    public final void synpred43_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10315:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
+        // InternalEntityMockDSL.g:
+        {
+        if ( (input.LA(1)>=RULE_ID && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||input.LA(1)==25||input.LA(1)==77||(input.LA(1)>=87 && input.LA(1)<=89)||(input.LA(1)>=95 && input.LA(1)<=96)||input.LA(1)==103||input.LA(1)==119||input.LA(1)==123||input.LA(1)==129||input.LA(1)==131||(input.LA(1)>=135 && input.LA(1)<=137)||(input.LA(1)>=139 && input.LA(1)<=148)||input.LA(1)==150 ) {
+            input.consume();
+            state.errorRecovery=false;state.failed=false;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            MismatchedSetException mse = new MismatchedSetException(null,input);
+            throw mse;
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred43_InternalEntityMockDSL
+
+    // $ANTLR start synpred44_InternalEntityMockDSL
+    public final void synpred44_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10386:6: ( 'catch' )
+        // InternalEntityMockDSL.g:10386:7: 'catch'
+        {
+        match(input,151,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred44_InternalEntityMockDSL
+
+    // $ANTLR start synpred45_InternalEntityMockDSL
+    public final void synpred45_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10407:7: ( 'finally' )
+        // InternalEntityMockDSL.g:10407:8: 'finally'
+        {
+        match(input,149,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred45_InternalEntityMockDSL
+
+    // $ANTLR start synpred48_InternalEntityMockDSL
+    public final void synpred48_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10651:5: ( '.' )
+        // InternalEntityMockDSL.g:10651:6: '.'
+        {
+        match(input,34,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred48_InternalEntityMockDSL
+
+    // $ANTLR start synpred49_InternalEntityMockDSL
+    public final void synpred49_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10777:5: ( ( () ruleArrayBrackets ) )
+        // InternalEntityMockDSL.g:10777:6: ( () ruleArrayBrackets )
+        {
+        // InternalEntityMockDSL.g:10777:6: ( () ruleArrayBrackets )
+        // InternalEntityMockDSL.g:10778:6: () ruleArrayBrackets
+        {
+        // InternalEntityMockDSL.g:10778:6: ()
+        // InternalEntityMockDSL.g:10779:6: 
+        {
+        }
+
+        pushFollow(FOLLOW_2);
+        ruleArrayBrackets();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred49_InternalEntityMockDSL
+
+    // $ANTLR start synpred50_InternalEntityMockDSL
+    public final void synpred50_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:10974:5: ( '<' )
+        // InternalEntityMockDSL.g:10974:6: '<'
+        {
+        match(input,103,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred50_InternalEntityMockDSL
+
+    // $ANTLR start synpred51_InternalEntityMockDSL
+    public final void synpred51_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:11030:6: ( ( () '.' ) )
+        // InternalEntityMockDSL.g:11030:7: ( () '.' )
+        {
+        // InternalEntityMockDSL.g:11030:7: ( () '.' )
+        // InternalEntityMockDSL.g:11031:7: () '.'
+        {
+        // InternalEntityMockDSL.g:11031:7: ()
+        // InternalEntityMockDSL.g:11032:7: 
+        {
+        }
+
+        match(input,34,FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred51_InternalEntityMockDSL
+
+    // $ANTLR start synpred52_InternalEntityMockDSL
+    public final void synpred52_InternalEntityMockDSL_fragment() throws RecognitionException {   
+        // InternalEntityMockDSL.g:11068:7: ( '<' )
+        // InternalEntityMockDSL.g:11068:8: '<'
+        {
+        match(input,103,FOLLOW_2); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred52_InternalEntityMockDSL
+
+    // Delegated rules
+
+    public final boolean synpred12_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred12_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred20_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred20_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred45_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred45_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred16_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred16_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred36_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred36_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred2_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred2_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred5_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred5_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred9_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred9_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred41_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred41_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred48_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred48_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred33_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred33_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred13_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred13_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred15_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred15_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred21_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred21_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred42_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred42_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred50_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred50_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred27_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred27_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred19_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred19_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred22_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred22_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred8_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred8_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred39_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred39_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred14_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred14_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred10_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred10_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred26_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred26_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred43_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred43_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred35_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred35_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred38_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred38_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred51_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred51_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred31_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred31_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred18_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred18_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred7_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred7_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred23_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred23_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred11_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred11_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred17_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred17_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred25_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred25_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred37_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred37_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred40_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred40_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred6_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred6_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred44_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred44_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred24_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred24_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred49_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred49_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred32_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred32_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred52_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred52_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred29_InternalEntityMockDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred29_InternalEntityMockDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA81 dfa81 = new DFA81(this);
+    protected DFA84 dfa84 = new DFA84(this);
+    protected DFA90 dfa90 = new DFA90(this);
+    protected DFA93 dfa93 = new DFA93(this);
+    protected DFA95 dfa95 = new DFA95(this);
+    protected DFA105 dfa105 = new DFA105(this);
+    protected DFA108 dfa108 = new DFA108(this);
+    protected DFA124 dfa124 = new DFA124(this);
+    protected DFA123 dfa123 = new DFA123(this);
+    protected DFA125 dfa125 = new DFA125(this);
+    protected DFA127 dfa127 = new DFA127(this);
+    protected DFA136 dfa136 = new DFA136(this);
+    protected DFA143 dfa143 = new DFA143(this);
+    protected DFA142 dfa142 = new DFA142(this);
+    protected DFA165 dfa165 = new DFA165(this);
+    protected DFA164 dfa164 = new DFA164(this);
+    protected DFA166 dfa166 = new DFA166(this);
+    protected DFA170 dfa170 = new DFA170(this);
+    protected DFA173 dfa173 = new DFA173(this);
+    protected DFA172 dfa172 = new DFA172(this);
+    protected DFA174 dfa174 = new DFA174(this);
+    protected DFA177 dfa177 = new DFA177(this);
+    protected DFA195 dfa195 = new DFA195(this);
+    protected DFA193 dfa193 = new DFA193(this);
+    static final String dfa_1s = "\10\uffff";
+    static final String dfa_2s = "\2\uffff\1\5\4\uffff\1\5";
+    static final String dfa_3s = "\1\4\1\uffff\1\15\1\uffff\1\4\2\uffff\1\15";
+    static final String dfa_4s = "\1\133\1\uffff\1\134\1\uffff\1\132\2\uffff\1\134";
+    static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\3\1\uffff";
+    static final String dfa_6s = "\10\uffff}>";
+    static final String[] dfa_7s = {
+            "\1\2\123\uffff\1\1\2\uffff\1\3",
+            "",
+            "\1\5\24\uffff\1\4\64\uffff\1\5\4\uffff\1\5",
+            "",
+            "\1\7\125\uffff\1\6",
+            "",
+            "",
+            "\1\5\24\uffff\1\4\64\uffff\1\5\4\uffff\1\5"
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final short[] dfa_2 = DFA.unpackEncodedString(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final char[] dfa_4 = DFA.unpackEncodedStringToUnsignedChars(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
+    static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);
+
+    class DFA81 extends DFA {
+
+        public DFA81(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 81;
+            this.eot = dfa_1;
+            this.eof = dfa_2;
+            this.min = dfa_3;
+            this.max = dfa_4;
+            this.accept = dfa_5;
+            this.special = dfa_6;
+            this.transition = dfa_7;
+        }
+        public String getDescription() {
+            return "4744:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
+        }
+    }
+    static final String dfa_8s = "\44\uffff";
+    static final String dfa_9s = "\1\4\1\0\42\uffff";
+    static final String dfa_10s = "\1\u0096\1\0\42\uffff";
+    static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\3\1\1";
+    static final String dfa_12s = "\1\uffff\1\0\42\uffff}>";
+    static final String[] dfa_13s = {
+            "\1\1\4\2\5\uffff\1\2\12\uffff\1\2\1\uffff\1\42\61\uffff\1\2\11\uffff\3\2\3\uffff\1\2\1\uffff\2\2\6\uffff\1\2\17\uffff\1\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
+    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
+    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
+    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
+    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
+    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);
+
+    class DFA84 extends DFA {
+
+        public DFA84(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 84;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_9;
+            this.max = dfa_10;
+            this.accept = dfa_11;
+            this.special = dfa_12;
+            this.transition = dfa_13;
+        }
+        public String getDescription() {
+            return "4961:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA84_1 = input.LA(1);
+
+                         
+                        int index84_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred2_InternalEntityMockDSL()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index84_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 84, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_14s = "\43\uffff";
+    static final String dfa_15s = "\1\4\1\0\41\uffff";
+    static final String dfa_16s = "\1\u0096\1\0\41\uffff";
+    static final String dfa_17s = "\2\uffff\1\2\37\uffff\1\1";
+    static final String dfa_18s = "\1\uffff\1\0\41\uffff}>";
+    static final String[] dfa_19s = {
+            "\5\2\5\uffff\1\2\12\uffff\1\2\63\uffff\1\2\11\uffff\3\2\3\uffff\1\2\1\uffff\1\1\1\2\6\uffff\1\2\17\uffff\1\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_14 = DFA.unpackEncodedString(dfa_14s);
+    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
+    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
+    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
+    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
+    static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);
+
+    class DFA90 extends DFA {
+
+        public DFA90(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 90;
+            this.eot = dfa_14;
+            this.eof = dfa_14;
+            this.min = dfa_15;
+            this.max = dfa_16;
+            this.accept = dfa_17;
+            this.special = dfa_18;
+            this.transition = dfa_19;
+        }
+        public String getDescription() {
+            return "5141:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA90_1 = input.LA(1);
+
+                         
+                        int index90_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred5_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index90_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 90, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA93 extends DFA {
+
+        public DFA93(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 93;
+            this.eot = dfa_14;
+            this.eof = dfa_14;
+            this.min = dfa_15;
+            this.max = dfa_16;
+            this.accept = dfa_17;
+            this.special = dfa_18;
+            this.transition = dfa_19;
+        }
+        public String getDescription() {
+            return "5283:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA93_1 = input.LA(1);
+
+                         
+                        int index93_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index93_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 93, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_20s = "\12\uffff";
+    static final String dfa_21s = "\1\10\11\uffff";
+    static final String dfa_22s = "\1\4\7\0\2\uffff";
+    static final String dfa_23s = "\1\u0097\7\0\2\uffff";
+    static final String dfa_24s = "\10\uffff\1\2\1\1";
+    static final String dfa_25s = "\1\uffff\1\2\1\3\1\4\1\5\1\6\1\1\1\0\2\uffff}>";
+    static final String[] dfa_26s = {
+            "\5\10\5\uffff\2\10\11\uffff\3\10\3\uffff\1\10\2\uffff\1\10\52\uffff\2\10\10\uffff\4\10\1\uffff\1\10\2\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\27\10\1\uffff\27\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+
+    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
+    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
+    static final char[] dfa_22 = DFA.unpackEncodedStringToUnsignedChars(dfa_22s);
+    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
+    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
+    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
+    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);
+
+    class DFA95 extends DFA {
+
+        public DFA95(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 95;
+            this.eot = dfa_20;
+            this.eof = dfa_21;
+            this.min = dfa_22;
+            this.max = dfa_23;
+            this.accept = dfa_24;
+            this.special = dfa_25;
+            this.transition = dfa_26;
+        }
+        public String getDescription() {
+            return "5512:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA95_7 = input.LA(1);
+
+                         
+                        int index95_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA95_6 = input.LA(1);
+
+                         
+                        int index95_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA95_1 = input.LA(1);
+
+                         
+                        int index95_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA95_2 = input.LA(1);
+
+                         
+                        int index95_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA95_3 = input.LA(1);
+
+                         
+                        int index95_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA95_4 = input.LA(1);
+
+                         
+                        int index95_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA95_5 = input.LA(1);
+
+                         
+                        int index95_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7_InternalEntityMockDSL()) ) {s = 9;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index95_5);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 95, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_27s = "\13\uffff";
+    static final String dfa_28s = "\1\1\12\uffff";
+    static final String dfa_29s = "\1\4\1\uffff\10\0\1\uffff";
+    static final String dfa_30s = "\1\u0097\1\uffff\10\0\1\uffff";
+    static final String dfa_31s = "\1\uffff\1\2\10\uffff\1\1";
+    static final String dfa_32s = "\2\uffff\1\7\1\3\1\0\1\1\1\2\1\4\1\5\1\6\1\uffff}>";
+    static final String[] dfa_33s = {
+            "\5\1\5\uffff\2\1\11\uffff\3\1\3\uffff\1\1\2\uffff\1\1\52\uffff\2\1\10\uffff\4\1\1\uffff\1\1\2\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\11\1\1\uffff\27\1",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
+    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
+    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
+    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
+    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
+    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
+    static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);
+
+    class DFA105 extends DFA {
+
+        public DFA105(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 105;
+            this.eot = dfa_27;
+            this.eof = dfa_28;
+            this.min = dfa_29;
+            this.max = dfa_30;
+            this.accept = dfa_31;
+            this.special = dfa_32;
+            this.transition = dfa_33;
+        }
+        public String getDescription() {
+            return "()* loopback of 6226:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA105_4 = input.LA(1);
+
+                         
+                        int index105_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA105_5 = input.LA(1);
+
+                         
+                        int index105_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA105_6 = input.LA(1);
+
+                         
+                        int index105_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA105_3 = input.LA(1);
+
+                         
+                        int index105_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA105_7 = input.LA(1);
+
+                         
+                        int index105_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA105_8 = input.LA(1);
+
+                         
+                        int index105_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA105_9 = input.LA(1);
+
+                         
+                        int index105_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA105_2 = input.LA(1);
+
+                         
+                        int index105_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred13_InternalEntityMockDSL()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index105_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 105, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_34s = "\1\147\2\uffff\1\150\7\uffff";
+    static final String dfa_35s = "\1\166\2\uffff\1\163\7\uffff";
+    static final String dfa_36s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\3\1\6";
+    static final String dfa_37s = "\13\uffff}>";
+    static final String[] dfa_38s = {
+            "\1\6\1\3\10\uffff\1\1\1\2\1\4\1\5\1\7\1\10",
+            "",
+            "",
+            "\1\12\12\uffff\1\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_34 = DFA.unpackEncodedStringToUnsignedChars(dfa_34s);
+    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
+    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
+    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
+    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);
+
+    class DFA108 extends DFA {
+
+        public DFA108(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 108;
+            this.eot = dfa_27;
+            this.eof = dfa_27;
+            this.min = dfa_34;
+            this.max = dfa_35;
+            this.accept = dfa_36;
+            this.special = dfa_37;
+            this.transition = dfa_38;
+        }
+        public String getDescription() {
+            return "6302:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
+        }
+    }
+    static final String dfa_39s = "\116\uffff";
+    static final String dfa_40s = "\1\2\115\uffff";
+    static final String dfa_41s = "\1\4\1\0\114\uffff";
+    static final String dfa_42s = "\1\u0097\1\0\114\uffff";
+    static final String dfa_43s = "\2\uffff\1\2\112\uffff\1\1";
+    static final String dfa_44s = "\1\uffff\1\0\114\uffff}>";
+    static final String[] dfa_45s = {
+            "\5\2\5\uffff\2\2\11\uffff\1\1\2\2\3\uffff\1\2\2\uffff\1\2\52\uffff\2\2\10\uffff\4\2\1\uffff\1\2\2\uffff\41\2\1\uffff\27\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
+    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
+    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
+
+    class DFA124 extends DFA {
+
+        public DFA124(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 124;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "7203:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA124_1 = input.LA(1);
+
+                         
+                        int index124_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred22_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index124_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 124, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_46s = "\1\4\2\0\41\uffff";
+    static final String dfa_47s = "\1\u0096\2\0\41\uffff";
+    static final String dfa_48s = "\3\uffff\2\1\1\2\35\uffff\1\3";
+    static final String dfa_49s = "\1\0\1\1\1\2\41\uffff}>";
+    static final String[] dfa_50s = {
+            "\1\1\4\5\5\uffff\1\5\12\uffff\1\2\1\uffff\1\43\61\uffff\1\5\11\uffff\3\5\5\uffff\2\5\6\uffff\1\5\14\uffff\1\3\2\uffff\1\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\3\5\1\uffff\12\5\1\uffff\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_46 = DFA.unpackEncodedStringToUnsignedChars(dfa_46s);
+    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
+    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
+    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
+    static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);
+
+    class DFA123 extends DFA {
+
+        public DFA123(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 123;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_46;
+            this.max = dfa_47;
+            this.accept = dfa_48;
+            this.special = dfa_49;
+            this.transition = dfa_50;
+        }
+        public String getDescription() {
+            return "7222:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA123_0 = input.LA(1);
+
+                         
+                        int index123_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA123_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA123_0==25) ) {s = 2;}
+
+                        else if ( (LA123_0==116) && (synpred23_InternalEntityMockDSL())) {s = 3;}
+
+                        else if ( (LA123_0==128) && (synpred23_InternalEntityMockDSL())) {s = 4;}
+
+                        else if ( ((LA123_0>=RULE_STRING && LA123_0<=RULE_DECIMAL)||LA123_0==14||LA123_0==77||(LA123_0>=87 && LA123_0<=89)||(LA123_0>=95 && LA123_0<=96)||LA123_0==103||LA123_0==119||LA123_0==123||LA123_0==129||LA123_0==131||(LA123_0>=135 && LA123_0<=137)||(LA123_0>=139 && LA123_0<=148)||LA123_0==150) ) {s = 5;}
+
+                        else if ( (LA123_0==27) ) {s = 35;}
+
+                         
+                        input.seek(index123_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA123_1 = input.LA(1);
+
+                         
+                        int index123_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred23_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index123_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA123_2 = input.LA(1);
+
+                         
+                        int index123_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred23_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index123_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 123, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_51s = {
+            "\5\2\5\uffff\2\2\11\uffff\3\2\3\uffff\1\2\2\uffff\1\2\52\uffff\2\2\10\uffff\4\2\1\uffff\1\2\2\uffff\1\2\1\1\37\2\1\uffff\27\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
+
+    class DFA125 extends DFA {
+
+        public DFA125(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 125;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "7320:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA125_1 = input.LA(1);
+
+                         
+                        int index125_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred24_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index125_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 125, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_52s = "\40\uffff";
+    static final String dfa_53s = "\1\4\26\uffff\1\0\10\uffff";
+    static final String dfa_54s = "\1\u0096\26\uffff\1\0\10\uffff";
+    static final String dfa_55s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
+    static final String dfa_56s = "\1\0\26\uffff\1\1\10\uffff}>";
+    static final String[] dfa_57s = {
+            "\1\5\4\14\5\uffff\1\2\12\uffff\1\35\75\uffff\3\5\5\uffff\2\14\6\uffff\1\5\31\uffff\1\26\1\uffff\1\3\3\uffff\1\27\1\30\1\31\1\uffff\2\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
+    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
+    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
+    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
+    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
+    static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);
+
+    class DFA127 extends DFA {
+
+        public DFA127(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 127;
+            this.eot = dfa_52;
+            this.eof = dfa_52;
+            this.min = dfa_53;
+            this.max = dfa_54;
+            this.accept = dfa_55;
+            this.special = dfa_56;
+            this.transition = dfa_57;
+        }
+        public String getDescription() {
+            return "7365:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA127_0 = input.LA(1);
+
+                         
+                        int index127_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA127_0==141) ) {s = 1;}
+
+                        else if ( (LA127_0==14) ) {s = 2;}
+
+                        else if ( (LA127_0==131) ) {s = 3;}
+
+                        else if ( (LA127_0==150) && (synpred25_InternalEntityMockDSL())) {s = 4;}
+
+                        else if ( (LA127_0==RULE_ID||(LA127_0>=87 && LA127_0<=89)||LA127_0==103||(LA127_0>=139 && LA127_0<=140)) ) {s = 5;}
+
+                        else if ( ((LA127_0>=RULE_STRING && LA127_0<=RULE_DECIMAL)||(LA127_0>=95 && LA127_0<=96)||(LA127_0>=142 && LA127_0<=145)) ) {s = 12;}
+
+                        else if ( (LA127_0==129) ) {s = 22;}
+
+                        else if ( (LA127_0==135) ) {s = 23;}
+
+                        else if ( (LA127_0==136) ) {s = 24;}
+
+                        else if ( (LA127_0==137) ) {s = 25;}
+
+                        else if ( (LA127_0==146) ) {s = 26;}
+
+                        else if ( (LA127_0==147) ) {s = 27;}
+
+                        else if ( (LA127_0==148) ) {s = 28;}
+
+                        else if ( (LA127_0==25) ) {s = 29;}
+
+                         
+                        input.seek(index127_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA127_23 = input.LA(1);
+
+                         
+                        int index127_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred26_InternalEntityMockDSL()) ) {s = 30;}
+
+                        else if ( (true) ) {s = 31;}
+
+                         
+                        input.seek(index127_23);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 127, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_58s = "\46\uffff";
+    static final String dfa_59s = "\1\4\2\0\43\uffff";
+    static final String dfa_60s = "\1\u0096\2\0\43\uffff";
+    static final String dfa_61s = "\3\uffff\2\1\1\2\40\uffff";
+    static final String dfa_62s = "\1\0\1\1\1\2\43\uffff}>";
+    static final String[] dfa_63s = {
+            "\1\1\4\5\5\uffff\1\5\12\uffff\1\2\5\uffff\1\5\55\uffff\1\5\11\uffff\3\5\5\uffff\3\5\5\uffff\1\5\14\uffff\1\3\2\uffff\1\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\16\5\1\uffff\1\5",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
+    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
+    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
+    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
+    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
+    static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);
+
+    class DFA136 extends DFA {
+
+        public DFA136(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 136;
+            this.eot = dfa_58;
+            this.eof = dfa_58;
+            this.min = dfa_59;
+            this.max = dfa_60;
+            this.accept = dfa_61;
+            this.special = dfa_62;
+            this.transition = dfa_63;
+        }
+        public String getDescription() {
+            return "7857:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA136_0 = input.LA(1);
+
+                         
+                        int index136_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA136_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA136_0==25) ) {s = 2;}
+
+                        else if ( (LA136_0==116) && (synpred29_InternalEntityMockDSL())) {s = 3;}
+
+                        else if ( (LA136_0==128) && (synpred29_InternalEntityMockDSL())) {s = 4;}
+
+                        else if ( ((LA136_0>=RULE_STRING && LA136_0<=RULE_DECIMAL)||LA136_0==14||LA136_0==31||LA136_0==77||(LA136_0>=87 && LA136_0<=89)||(LA136_0>=95 && LA136_0<=97)||LA136_0==103||LA136_0==119||LA136_0==123||LA136_0==129||LA136_0==131||(LA136_0>=135 && LA136_0<=148)||LA136_0==150) ) {s = 5;}
+
+                         
+                        input.seek(index136_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA136_1 = input.LA(1);
+
+                         
+                        int index136_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred29_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index136_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA136_2 = input.LA(1);
+
+                         
+                        int index136_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred29_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index136_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 136, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_64s = {
+            "\5\2\5\uffff\1\2\12\uffff\1\1\63\uffff\1\2\11\uffff\3\2\5\uffff\2\2\6\uffff\1\2\14\uffff\1\2\2\uffff\1\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\3\2\1\uffff\12\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);
+
+    class DFA143 extends DFA {
+
+        public DFA143(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 143;
+            this.eot = dfa_14;
+            this.eof = dfa_14;
+            this.min = dfa_15;
+            this.max = dfa_16;
+            this.accept = dfa_17;
+            this.special = dfa_18;
+            this.transition = dfa_64;
+        }
+        public String getDescription() {
+            return "8323:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA143_1 = input.LA(1);
+
+                         
+                        int index143_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred32_InternalEntityMockDSL()) ) {s = 34;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index143_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 143, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_65s = "\42\uffff";
+    static final String dfa_66s = "\1\4\2\0\37\uffff";
+    static final String dfa_67s = "\1\u0096\2\0\37\uffff";
+    static final String dfa_68s = "\3\uffff\1\1\1\2\35\uffff";
+    static final String dfa_69s = "\1\0\1\1\1\2\37\uffff}>";
+    static final String[] dfa_70s = {
+            "\1\1\4\4\5\uffff\1\4\12\uffff\1\2\63\uffff\1\4\11\uffff\3\4\5\uffff\2\4\6\uffff\1\4\14\uffff\1\3\2\uffff\1\4\3\uffff\1\4\5\uffff\1\4\1\uffff\1\4\3\uffff\3\4\1\uffff\12\4\1\uffff\1\4",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_65 = DFA.unpackEncodedString(dfa_65s);
+    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
+    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
+    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
+    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
+    static final short[][] dfa_70 = unpackEncodedStringArray(dfa_70s);
+
+    class DFA142 extends DFA {
+
+        public DFA142(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 142;
+            this.eot = dfa_65;
+            this.eof = dfa_65;
+            this.min = dfa_66;
+            this.max = dfa_67;
+            this.accept = dfa_68;
+            this.special = dfa_69;
+            this.transition = dfa_70;
+        }
+        public String getDescription() {
+            return "8392:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA142_0 = input.LA(1);
+
+                         
+                        int index142_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA142_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA142_0==25) ) {s = 2;}
+
+                        else if ( (LA142_0==116) && (synpred33_InternalEntityMockDSL())) {s = 3;}
+
+                        else if ( ((LA142_0>=RULE_STRING && LA142_0<=RULE_DECIMAL)||LA142_0==14||LA142_0==77||(LA142_0>=87 && LA142_0<=89)||(LA142_0>=95 && LA142_0<=96)||LA142_0==103||LA142_0==119||LA142_0==123||LA142_0==129||LA142_0==131||(LA142_0>=135 && LA142_0<=137)||(LA142_0>=139 && LA142_0<=148)||LA142_0==150) ) {s = 4;}
+
+                         
+                        input.seek(index142_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA142_1 = input.LA(1);
+
+                         
+                        int index142_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred33_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index142_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA142_2 = input.LA(1);
+
+                         
+                        int index142_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred33_InternalEntityMockDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 4;}
+
+                         
+                        input.seek(index142_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 142, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA165 extends DFA {
+
+        public DFA165(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 165;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "9521:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA165_1 = input.LA(1);
+
+                         
+                        int index165_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred36_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index165_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 165, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA164 extends DFA {
+
+        public DFA164(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 164;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_46;
+            this.max = dfa_47;
+            this.accept = dfa_48;
+            this.special = dfa_49;
+            this.transition = dfa_50;
+        }
+        public String getDescription() {
+            return "9540:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA164_0 = input.LA(1);
+
+                         
+                        int index164_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA164_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA164_0==25) ) {s = 2;}
+
+                        else if ( (LA164_0==116) && (synpred37_InternalEntityMockDSL())) {s = 3;}
+
+                        else if ( (LA164_0==128) && (synpred37_InternalEntityMockDSL())) {s = 4;}
+
+                        else if ( ((LA164_0>=RULE_STRING && LA164_0<=RULE_DECIMAL)||LA164_0==14||LA164_0==77||(LA164_0>=87 && LA164_0<=89)||(LA164_0>=95 && LA164_0<=96)||LA164_0==103||LA164_0==119||LA164_0==123||LA164_0==129||LA164_0==131||(LA164_0>=135 && LA164_0<=137)||(LA164_0>=139 && LA164_0<=148)||LA164_0==150) ) {s = 5;}
+
+                        else if ( (LA164_0==27) ) {s = 35;}
+
+                         
+                        input.seek(index164_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA164_1 = input.LA(1);
+
+                         
+                        int index164_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index164_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA164_2 = input.LA(1);
+
+                         
+                        int index164_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred37_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index164_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 164, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA166 extends DFA {
+
+        public DFA166(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 166;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "9638:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA166_1 = input.LA(1);
+
+                         
+                        int index166_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred38_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index166_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 166, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_71s = {
+            "\5\2\5\uffff\2\2\11\uffff\3\2\3\uffff\1\2\2\uffff\1\2\52\uffff\2\2\10\uffff\4\2\1\uffff\1\2\2\uffff\10\2\1\1\30\2\1\uffff\27\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
+
+    class DFA170 extends DFA {
+
+        public DFA170(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 170;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "9797:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA170_1 = input.LA(1);
+
+                         
+                        int index170_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred39_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index170_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 170, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA173 extends DFA {
+
+        public DFA173(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 173;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "9854:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA173_1 = input.LA(1);
+
+                         
+                        int index173_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred40_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index173_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 173, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA172 extends DFA {
+
+        public DFA172(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 172;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_46;
+            this.max = dfa_47;
+            this.accept = dfa_48;
+            this.special = dfa_49;
+            this.transition = dfa_50;
+        }
+        public String getDescription() {
+            return "9873:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA172_0 = input.LA(1);
+
+                         
+                        int index172_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA172_0==RULE_ID) ) {s = 1;}
+
+                        else if ( (LA172_0==25) ) {s = 2;}
+
+                        else if ( (LA172_0==116) && (synpred41_InternalEntityMockDSL())) {s = 3;}
+
+                        else if ( (LA172_0==128) && (synpred41_InternalEntityMockDSL())) {s = 4;}
+
+                        else if ( ((LA172_0>=RULE_STRING && LA172_0<=RULE_DECIMAL)||LA172_0==14||LA172_0==77||(LA172_0>=87 && LA172_0<=89)||(LA172_0>=95 && LA172_0<=96)||LA172_0==103||LA172_0==119||LA172_0==123||LA172_0==129||LA172_0==131||(LA172_0>=135 && LA172_0<=137)||(LA172_0>=139 && LA172_0<=148)||LA172_0==150) ) {s = 5;}
+
+                        else if ( (LA172_0==27) ) {s = 35;}
+
+                         
+                        input.seek(index172_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA172_1 = input.LA(1);
+
+                         
+                        int index172_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred41_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index172_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA172_2 = input.LA(1);
+
+                         
+                        int index172_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred41_InternalEntityMockDSL()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index172_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 172, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA174 extends DFA {
+
+        public DFA174(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 174;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "9971:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA174_1 = input.LA(1);
+
+                         
+                        int index174_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred42_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index174_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 174, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_72s = "\1\41\115\uffff";
+    static final String dfa_73s = "\1\4\40\0\55\uffff";
+    static final String dfa_74s = "\1\u0097\40\0\55\uffff";
+    static final String dfa_75s = "\41\uffff\1\2\53\uffff\1\1";
+    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
+    static final String[] dfa_77s = {
+            "\1\1\1\27\1\24\1\23\1\25\5\uffff\1\12\1\41\11\uffff\1\40\2\41\3\uffff\1\41\2\uffff\1\41\52\uffff\1\7\1\41\10\uffff\1\4\1\3\1\5\1\41\1\uffff\1\41\2\uffff\1\17\1\20\6\41\1\15\17\41\1\10\3\41\1\6\4\41\1\uffff\1\31\1\41\1\13\3\41\1\32\1\33\1\34\1\41\1\2\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
+    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
+    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
+    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
+    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);
+
+    class DFA177 extends DFA {
+
+        public DFA177(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 177;
+            this.eot = dfa_39;
+            this.eof = dfa_72;
+            this.min = dfa_73;
+            this.max = dfa_74;
+            this.accept = dfa_75;
+            this.special = dfa_76;
+            this.transition = dfa_77;
+        }
+        public String getDescription() {
+            return "10314:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA177_1 = input.LA(1);
+
+                         
+                        int index177_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA177_2 = input.LA(1);
+
+                         
+                        int index177_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA177_3 = input.LA(1);
+
+                         
+                        int index177_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA177_4 = input.LA(1);
+
+                         
+                        int index177_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA177_5 = input.LA(1);
+
+                         
+                        int index177_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA177_6 = input.LA(1);
+
+                         
+                        int index177_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA177_7 = input.LA(1);
+
+                         
+                        int index177_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA177_8 = input.LA(1);
+
+                         
+                        int index177_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA177_9 = input.LA(1);
+
+                         
+                        int index177_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA177_10 = input.LA(1);
+
+                         
+                        int index177_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA177_11 = input.LA(1);
+
+                         
+                        int index177_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA177_12 = input.LA(1);
+
+                         
+                        int index177_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA177_13 = input.LA(1);
+
+                         
+                        int index177_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA177_14 = input.LA(1);
+
+                         
+                        int index177_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA177_15 = input.LA(1);
+
+                         
+                        int index177_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA177_16 = input.LA(1);
+
+                         
+                        int index177_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA177_17 = input.LA(1);
+
+                         
+                        int index177_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA177_18 = input.LA(1);
+
+                         
+                        int index177_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA177_19 = input.LA(1);
+
+                         
+                        int index177_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA177_20 = input.LA(1);
+
+                         
+                        int index177_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA177_21 = input.LA(1);
+
+                         
+                        int index177_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA177_22 = input.LA(1);
+
+                         
+                        int index177_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA177_23 = input.LA(1);
+
+                         
+                        int index177_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA177_24 = input.LA(1);
+
+                         
+                        int index177_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA177_25 = input.LA(1);
+
+                         
+                        int index177_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA177_26 = input.LA(1);
+
+                         
+                        int index177_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA177_27 = input.LA(1);
+
+                         
+                        int index177_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA177_28 = input.LA(1);
+
+                         
+                        int index177_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA177_29 = input.LA(1);
+
+                         
+                        int index177_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA177_30 = input.LA(1);
+
+                         
+                        int index177_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA177_31 = input.LA(1);
+
+                         
+                        int index177_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA177_32 = input.LA(1);
+
+                         
+                        int index177_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred43_InternalEntityMockDSL()) ) {s = 77;}
+
+                        else if ( (true) ) {s = 33;}
+
+                         
+                        input.seek(index177_32);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 177, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_78s = "\120\uffff";
+    static final String dfa_79s = "\1\2\117\uffff";
+    static final String dfa_80s = "\1\4\1\0\116\uffff";
+    static final String dfa_81s = "\1\u0099\1\0\116\uffff";
+    static final String dfa_82s = "\2\uffff\1\2\114\uffff\1\1";
+    static final String dfa_83s = "\1\uffff\1\0\116\uffff}>";
+    static final String[] dfa_84s = {
+            "\5\2\5\uffff\2\2\11\uffff\3\2\3\uffff\1\2\2\uffff\1\2\5\uffff\1\2\44\uffff\2\2\10\uffff\4\2\1\uffff\1\2\2\uffff\10\2\1\1\30\2\1\uffff\27\2\1\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
+    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
+    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
+    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
+    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
+    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
+    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);
+
+    class DFA195 extends DFA {
+
+        public DFA195(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 195;
+            this.eot = dfa_78;
+            this.eof = dfa_79;
+            this.min = dfa_80;
+            this.max = dfa_81;
+            this.accept = dfa_82;
+            this.special = dfa_83;
+            this.transition = dfa_84;
+        }
+        public String getDescription() {
+            return "10972:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA195_1 = input.LA(1);
+
+                         
+                        int index195_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred50_InternalEntityMockDSL()) ) {s = 79;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index195_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 195, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA193 extends DFA {
+
+        public DFA193(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 193;
+            this.eot = dfa_78;
+            this.eof = dfa_79;
+            this.min = dfa_80;
+            this.max = dfa_81;
+            this.accept = dfa_82;
+            this.special = dfa_83;
+            this.transition = dfa_84;
+        }
+        public String getDescription() {
+            return "11066:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA193_1 = input.LA(1);
+
+                         
+                        int index193_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred52_InternalEntityMockDSL()) ) {s = 79;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index193_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 193, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000000002002L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000004002L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000018000L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000024002L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x80000000204C0000L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x80000000204C8000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000108000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000808000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000011000000L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000008000010L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x000000000C000010L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000000008010L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000002000002L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000008000020L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x000000000C000020L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000040008000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000002080008000L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000080008000L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000400000002L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000800000000L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000001000008000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000004000000000L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000008000000000L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000010000000000L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x000000000A000010L,0x0010000000000000L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x000000000C000000L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000002000010L,0x0010000000000000L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000020000000000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x7FF2740000000000L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000080000000000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000800000000000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000040L,0x0000000000002000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0001000000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0001000200000050L,0x0000000000002000L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000050L,0x0000000000002000L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0004000000000000L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0008000000000002L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000008000040L,0x0000000000002000L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0009000000000052L,0x0000000000002000L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000042L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0009000000000052L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000050L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000008000040L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000024L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000080008000L,0x00000000000C8000L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000080008000L,0x00000000000C0000L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000080008000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000140L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000040L,0x0000000000001C00L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000080000000000L,0x0000000000000000L,0x000000001C000000L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000400000000L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000400000010L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000010L,0x0000000000100000L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000010L,0x0000000009000000L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000010L,0x0000000002000000L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000010L,0x0000000004000000L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000002L,0x0000000010000000L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x000000000A0041F0L,0x08800081A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x00000000020041F0L,0x08800081A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x00000000020041F0L,0x08800083A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000004000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000004000002L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x000001FC00000000L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000000L,0x0000030000000000L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000002L,0x0000040000000000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000002L,0x0000080000000000L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000002L,0x0000F00000000000L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000002L,0x0001038000000000L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000002L,0x007E018000000000L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000000L,0x0008000000000000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0010008000000000L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000002L,0x0080000000002000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000002L,0x0700000004000000L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000002L,0x0000000000004000L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000002L,0x3000000000000000L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000400000002L,0xC000000000000000L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000010L,0x0000000003800000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000010L,0x0000008003800000L,0x0000000000001800L});
+    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000002000010L,0x0010000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000004000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000402000002L,0xC000000100000000L});
+    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x000000000A0041F0L,0x08900081A3802000L,0x00000000005FFB8BL});
+    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000400000002L,0xC000000100000000L});
+    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x000000000200C1F0L,0x08800081A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000004008000L});
+    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x00000000820041F0L,0x08900083A3802000L,0x00000000005FFF8BL});
+    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x00000000820041F0L,0x08800083A3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x00000000820041F2L,0x08800081B3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x00000000820041F2L,0x08800081A3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x00000000020041F0L,0x08900081A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000006008010L,0x0010000000000000L,0x0000000000000070L});
+    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000050L});
+    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x00000000820041F0L,0x08800081B3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000004000000L,0x0000000010000000L});
+    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x00000000820041F0L,0x08800081A3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x00000000020041F0L,0x08800081B3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x000000008200C1F0L,0x08800081A3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x000000008200C1F0L,0x08800081B3802000L,0x00000000005FFF8AL});
+    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000002L,0x0000000040000000L});
+    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000002000002L,0x0000000100000000L});
+    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000000000002L,0x0000000100000000L});
+    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000002000002L,0x0000008100000000L});
+    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000008000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x00000000020041F2L,0x08800081A3802000L,0x00000000005FFB8AL});
+    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000A00000L});
+    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000A00000L});
+    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000140L});
+    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
+    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000000000002L,0x0000008000000000L});
+    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000400000002L,0x0000008000000000L});
+    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000001800L});
+    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000000012L});
+
+}
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/scoping/AbstractEntityMockDSLScopeProvider.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/scoping/AbstractEntityMockDSLScopeProvider.java
new file mode 100644
index 0000000..5a04d40
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/scoping/AbstractEntityMockDSLScopeProvider.java
@@ -0,0 +1,22 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext 2.11.0
+ *
+ */
+
+package org.eclipse.osbp.xtext.entitymock.scoping;
+
+import org.eclipse.osbp.xtext.oxtype.scoping.OXtypeScopeProvider;
+
+public abstract class AbstractEntityMockDSLScopeProvider extends OXtypeScopeProvider {
+}
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSemanticSequencer.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSemanticSequencer.java
index ed71db6..bdc16ba 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSemanticSequencer.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSemanticSequencer.java
@@ -10,28 +10,30 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.serializer;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
+import java.util.Set;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.osbp.dsl.semantic.common.types.LImport;
+import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
 import org.eclipse.osbp.xtext.entitymock.Date;
 import org.eclipse.osbp.xtext.entitymock.DateIterate;
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
 import org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
-import org.eclipse.osbp.xtext.entitymock.EntityMockDataType;
-import org.eclipse.osbp.xtext.entitymock.EntityMockDataTypes;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
@@ -50,7 +52,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IntegerIterate;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean;
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture;
@@ -71,6 +73,12 @@
 import org.eclipse.osbp.xtext.entitymock.RunningDataInterchange;
 import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;
 import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess;
+import org.eclipse.osbp.xtext.oxtype.oxtype.OXImportDeclaration;
+import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;
+import org.eclipse.osbp.xtext.oxtype.serializer.OXtypeSemanticSequencer;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
 import org.eclipse.xtext.common.types.JvmFormalParameter;
 import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
 import org.eclipse.xtext.common.types.JvmInnerTypeReference;
@@ -80,14 +88,8 @@
 import org.eclipse.xtext.common.types.JvmUpperBound;
 import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
 import org.eclipse.xtext.common.types.TypesPackage;
-import org.eclipse.xtext.serializer.acceptor.ISemanticSequenceAcceptor;
+import org.eclipse.xtext.serializer.ISerializationContext;
 import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
-import org.eclipse.xtext.serializer.diagnostic.ISemanticSequencerDiagnosticProvider;
-import org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic.Acceptor;
-import org.eclipse.xtext.serializer.sequencer.GenericSequencer;
-import org.eclipse.xtext.serializer.sequencer.ISemanticNodeProvider.INodesForEObjectProvider;
-import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
-import org.eclipse.xtext.serializer.sequencer.ITransientValueService;
 import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
 import org.eclipse.xtext.xbase.XAssignment;
 import org.eclipse.xtext.xbase.XBasicForLoopExpression;
@@ -121,1631 +123,505 @@
 import org.eclipse.xtext.xbase.XVariableDeclaration;
 import org.eclipse.xtext.xbase.XWhileExpression;
 import org.eclipse.xtext.xbase.XbasePackage;
-import org.eclipse.xtext.xbase.annotations.serializer.XbaseWithAnnotationsSemanticSequencer;
 import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
 import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationElementValuePair;
 import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage;
 import org.eclipse.xtext.xtype.XFunctionTypeRef;
-import org.eclipse.xtext.xtype.XImportDeclaration;
 import org.eclipse.xtext.xtype.XImportSection;
 import org.eclipse.xtext.xtype.XtypePackage;
 
 @SuppressWarnings("all")
-public class EntityMockDSLSemanticSequencer extends XbaseWithAnnotationsSemanticSequencer {
+public class EntityMockDSLSemanticSequencer extends OXtypeSemanticSequencer {
 
 	@Inject
 	private EntityMockDSLGrammarAccess grammarAccess;
 	
-	public void createSequence(EObject context, EObject semanticObject) {
-		if(semanticObject.eClass().getEPackage() == EntityMockDSLPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+	@Override
+	public void sequence(ISerializationContext context, EObject semanticObject) {
+		EPackage epackage = semanticObject.eClass().getEPackage();
+		ParserRule rule = context.getParserRule();
+		Action action = context.getAssignedAction();
+		Set<Parameter> parameters = context.getEnabledBooleanParameters();
+		if (epackage == EntityMockDSLPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case EntityMockDSLPackage.DATE:
-				if(context == grammarAccess.getDateRule()) {
-					sequence_Date(context, (Date) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_Date(context, (Date) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.DATE_ITERATE:
-				if(context == grammarAccess.getDateIterateRule() ||
-				   context == grammarAccess.getIIterateRule()) {
-					sequence_DateIterate(context, (DateIterate) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_DateIterate(context, (DateIterate) semanticObject); 
+				return; 
+			case EntityMockDSLPackage.ENTITY_MOCK:
+				sequence_EntityMock(context, (EntityMock) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT:
-				if(context == grammarAccess.getEntityMockAttributeByObjectRule() ||
-				   context == grammarAccess.getIEntityMockAttributeRule() ||
-				   context == grammarAccess.getIEntityMockEntityUsableRule()) {
-					sequence_EntityMockAttributeByObject(context, (EntityMockAttributeByObject) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockAttributeByObject(context, (EntityMockAttributeByObject) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE:
-				if(context == grammarAccess.getEntityMockAttributeByReferenceRule() ||
-				   context == grammarAccess.getIEntityMockAttributeRule() ||
-				   context == grammarAccess.getIEntityMockEntityUsableRule()) {
-					sequence_EntityMockAttributeByReference(context, (EntityMockAttributeByReference) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockAttributeByReference(context, (EntityMockAttributeByReference) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_FILLER:
-				if(context == grammarAccess.getEntityMockAttributeFillerRule() ||
-				   context == grammarAccess.getIEntityMockAttributeRule() ||
-				   context == grammarAccess.getIEntityMockEntityUsableRule()) {
-					sequence_EntityMockAttributeFiller(context, (EntityMockAttributeFiller) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockAttributeFiller(context, (EntityMockAttributeFiller) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE:
-				if(context == grammarAccess.getEntityMockByResourceAttributeRule()) {
-					sequence_EntityMockByResourceAttribute(context, (EntityMockByResourceAttribute) semanticObject); 
-					return; 
-				}
-				else break;
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPE:
-				if(context == grammarAccess.getEntityMockDataTypeRule()) {
-					sequence_EntityMockDataType(context, (EntityMockDataType) semanticObject); 
-					return; 
-				}
-				else break;
-			case EntityMockDSLPackage.ENTITY_MOCK_DATA_TYPES:
-				if(context == grammarAccess.getEntityMockDataTypesRule()) {
-					sequence_EntityMockDataTypes(context, (EntityMockDataTypes) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockByResourceAttribute(context, (EntityMockByResourceAttribute) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITIES:
-				if(context == grammarAccess.getEntityMockEntitiesRule()) {
-					sequence_EntityMockEntities(context, (EntityMockEntities) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockEntities(context, (EntityMockEntities) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY:
-				if(context == grammarAccess.getEntityMockEntityRule()) {
-					sequence_EntityMockEntity(context, (EntityMockEntity) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockEntity(context, (EntityMockEntity) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION:
-				if(context == grammarAccess.getEntityMockEntityFunctionRule() ||
-				   context == grammarAccess.getIEntityMockEntityUsableRule()) {
-					sequence_EntityMockEntityFunction(context, (EntityMockEntityFunction) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockEntityFunction(context, (EntityMockEntityFunction) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER:
-				if(context == grammarAccess.getEntityMockEntityFunctionParameterRule()) {
-					sequence_EntityMockEntityFunctionParameter(context, (EntityMockEntityFunctionParameter) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockEntityFunctionParameter(context, (EntityMockEntityFunctionParameter) semanticObject); 
+				return; 
+			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE:
+				sequence_EntityMockEntityNestedAttribute(context, (EntityMockEntityNestedAttribute) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_MODEL:
-				if(context == grammarAccess.getEntityMockModelRule()) {
-					sequence_EntityMockModel(context, (EntityMockModel) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockModel(context, (EntityMockModel) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT:
-				if(context == grammarAccess.getEntityMockObjectRule()) {
-					sequence_EntityMockObject(context, (EntityMockObject) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObject(context, (EntityMockObject) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE:
-				if(context == grammarAccess.getEntityMockObjectArrayValueRule() ||
-				   context == grammarAccess.getIEntityMockObjectAttributeRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectArrayValue(context, (EntityMockObjectArrayValue) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectArrayValue(context, (EntityMockObjectArrayValue) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_EMBED:
-				if(context == grammarAccess.getEntityMockObjectEmbedRule() ||
-				   context == grammarAccess.getIEntityMockObjectAttributeRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectEmbed(context, (EntityMockObjectEmbed) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectEmbed(context, (EntityMockObjectEmbed) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ENUM:
-				if(context == grammarAccess.getEntityMockObjectEnumRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectEnum(context, (EntityMockObjectEnum) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectEnum(context, (EntityMockObjectEnum) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FILL:
-				if(context == grammarAccess.getEntityMockObjectFillRule() ||
-				   context == grammarAccess.getIEntityMockObjectAttributeRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectFill(context, (EntityMockObjectFill) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectFill(context, (EntityMockObjectFill) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FUNCTION:
-				if(context == grammarAccess.getEntityMockObjectFunctionRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectFunction(context, (EntityMockObjectFunction) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectFunction(context, (EntityMockObjectFunction) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER:
-				if(context == grammarAccess.getEntityMockObjectFunctionParameterRule()) {
-					sequence_EntityMockObjectFunctionParameter(context, (EntityMockObjectFunctionParameter) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectFunctionParameter(context, (EntityMockObjectFunctionParameter) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ITEM_VALUE:
-				if(context == grammarAccess.getEntityMockObjectItemValueRule()) {
-					sequence_EntityMockObjectItemValue(context, (EntityMockObjectItemValue) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectItemValue(context, (EntityMockObjectItemValue) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_PLAIN_VALUE:
-				if(context == grammarAccess.getEntityMockObjectPlainValueRule() ||
-				   context == grammarAccess.getIEntityMockObjectAttributeRule() ||
-				   context == grammarAccess.getIEntityMockObjectUsableRule()) {
-					sequence_EntityMockObjectPlainValue(context, (EntityMockObjectPlainValue) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectPlainValue(context, (EntityMockObjectPlainValue) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_RESOURCE_VALUE:
-				if(context == grammarAccess.getEntityMockObjectResourceValueRule() ||
-				   context == grammarAccess.getIEntityMockObjectAttributeRule()) {
-					sequence_EntityMockObjectResourceValue(context, (EntityMockObjectResourceValue) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjectResourceValue(context, (EntityMockObjectResourceValue) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_OBJECTS:
-				if(context == grammarAccess.getEntityMockObjectsRule()) {
-					sequence_EntityMockObjects(context, (EntityMockObjects) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockObjects(context, (EntityMockObjects) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE:
-				if(context == grammarAccess.getEntityMockPackageRule()) {
-					sequence_EntityMockPackage(context, (EntityMockPackage) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockPackage(context, (EntityMockPackage) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE:
-				if(context == grammarAccess.getEntityMockReferencedObjectAttributeRule()) {
-					sequence_EntityMockReferencedObjectAttribute(context, (EntityMockReferencedObjectAttribute) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockReferencedObjectAttribute(context, (EntityMockReferencedObjectAttribute) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE:
-				if(context == grammarAccess.getEntityMockResourceRule()) {
-					sequence_EntityMockResource(context, (EntityMockResource) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockResource(context, (EntityMockResource) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE_ATTRIBUTE:
-				if(context == grammarAccess.getEntityMockResourceAttributeRule()) {
-					sequence_EntityMockResourceAttribute(context, (EntityMockResourceAttribute) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockResourceAttribute(context, (EntityMockResourceAttribute) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE_DATA_ROW:
-				if(context == grammarAccess.getEntityMockResourceDataRowRule()) {
-					sequence_EntityMockResourceDataRow(context, (EntityMockResourceDataRow) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockResourceDataRow(context, (EntityMockResourceDataRow) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCES:
-				if(context == grammarAccess.getEntityMockResourcesRule()) {
-					sequence_EntityMockResources(context, (EntityMockResources) semanticObject); 
-					return; 
-				}
-				else break;
-			case EntityMockDSLPackage.ENTITY_MOCK_TEMPORARY:
-				if(context == grammarAccess.getEntityMockTemporaryRule()) {
-					sequence_EntityMockTemporary(context, (EntityMockTemporary) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EntityMockResources(context, (EntityMockResources) semanticObject); 
+				return; 
+			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE:
+				sequence_EntityMockTemplate(context, (EntityMockTemplate) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.INTEGER_ITERATE:
-				if(context == grammarAccess.getIIterateRule() ||
-				   context == grammarAccess.getIntegerIterateRule()) {
-					sequence_IntegerIterate(context, (IntegerIterate) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_IntegerIterate(context, (IntegerIterate) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_BOOLEAN:
-				if(context == grammarAccess.getPropertyFillerBooleanRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerBoolean(context, (PropertyFillerBoolean) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerBoolean(context, (PropertyFillerBoolean) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_FUTURE:
-				if(context == grammarAccess.getPropertyFillerDateFutureRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerDateFuture(context, (PropertyFillerDateFuture) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerDateFuture(context, (PropertyFillerDateFuture) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_PAST:
-				if(context == grammarAccess.getPropertyFillerDatePastRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerDatePast(context, (PropertyFillerDatePast) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerDatePast(context, (PropertyFillerDatePast) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_RANGE:
-				if(context == grammarAccess.getPropertyFillerDateRangeRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerDateRange(context, (PropertyFillerDateRange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerDateRange(context, (PropertyFillerDateRange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM:
-				if(context == grammarAccess.getPropertyFillerSignedDoubleRandomRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerSignedDoubleRandom(context, (PropertyFillerSignedDoubleRandom) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerSignedDoubleRandom(context, (PropertyFillerSignedDoubleRandom) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANGE:
-				if(context == grammarAccess.getPropertyFillerSignedDoubleRangeRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerSignedDoubleRange(context, (PropertyFillerSignedDoubleRange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerSignedDoubleRange(context, (PropertyFillerSignedDoubleRange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANDOM:
-				if(context == grammarAccess.getPropertyFillerSignedIntegerRandomRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerSignedIntegerRandom(context, (PropertyFillerSignedIntegerRandom) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerSignedIntegerRandom(context, (PropertyFillerSignedIntegerRandom) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANGE:
-				if(context == grammarAccess.getPropertyFillerSignedIntegerRangeRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerSignedIntegerRange(context, (PropertyFillerSignedIntegerRange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerSignedIntegerRange(context, (PropertyFillerSignedIntegerRange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_PARAGRAPHS:
-				if(context == grammarAccess.getPropertyFillerTextParagraphsRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerTextParagraphs(context, (PropertyFillerTextParagraphs) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerTextParagraphs(context, (PropertyFillerTextParagraphs) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_RANDOM:
-				if(context == grammarAccess.getPropertyFillerTextRandomRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerTextRandom(context, (PropertyFillerTextRandom) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerTextRandom(context, (PropertyFillerTextRandom) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_SENTENCES:
-				if(context == grammarAccess.getPropertyFillerTextSentencesRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerTextSentences(context, (PropertyFillerTextSentences) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerTextSentences(context, (PropertyFillerTextSentences) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_WORDS:
-				if(context == grammarAccess.getPropertyFillerTextWordsRule() ||
-				   context == grammarAccess.getPropertyFillerTypeRule()) {
-					sequence_PropertyFillerTextWords(context, (PropertyFillerTextWords) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerTextWords(context, (PropertyFillerTextWords) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM:
-				if(context == grammarAccess.getPropertyFillerTypeRule() ||
-				   context == grammarAccess.getPropertyFillerUnsignedDoubleRandomRule()) {
-					sequence_PropertyFillerUnsignedDoubleRandom(context, (PropertyFillerUnsignedDoubleRandom) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerUnsignedDoubleRandom(context, (PropertyFillerUnsignedDoubleRandom) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE:
-				if(context == grammarAccess.getPropertyFillerTypeRule() ||
-				   context == grammarAccess.getPropertyFillerUnsignedDoubleRangeRule()) {
-					sequence_PropertyFillerUnsignedDoubleRange(context, (PropertyFillerUnsignedDoubleRange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerUnsignedDoubleRange(context, (PropertyFillerUnsignedDoubleRange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM:
-				if(context == grammarAccess.getPropertyFillerTypeRule() ||
-				   context == grammarAccess.getPropertyFillerUnsignedIntegerRandomRule()) {
-					sequence_PropertyFillerUnsignedIntegerRandom(context, (PropertyFillerUnsignedIntegerRandom) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerUnsignedIntegerRandom(context, (PropertyFillerUnsignedIntegerRandom) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE:
-				if(context == grammarAccess.getPropertyFillerTypeRule() ||
-				   context == grammarAccess.getPropertyFillerUnsignedIntegerRangeRule()) {
-					sequence_PropertyFillerUnsignedIntegerRange(context, (PropertyFillerUnsignedIntegerRange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyFillerUnsignedIntegerRange(context, (PropertyFillerUnsignedIntegerRange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE:
-				if(context == grammarAccess.getRunningDataInterchangeRule()) {
-					sequence_RunningDataInterchange(context, (RunningDataInterchange) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_RunningDataInterchange(context, (RunningDataInterchange) semanticObject); 
+				return; 
 			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGES:
-				if(context == grammarAccess.getRunningDataInterchangesRule()) {
-					sequence_RunningDataInterchanges(context, (RunningDataInterchanges) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_RunningDataInterchanges(context, (RunningDataInterchanges) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == OSBPTypesPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
-			case OSBPTypesPackage.LIMPORT:
-				if(context == grammarAccess.getEntityModelImportRule()) {
-					sequence_EntityModelImport(context, (LImport) semanticObject); 
-					return; 
-				}
-				else break;
+		else if (epackage == OXtypePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case OXtypePackage.OX_IMPORT_DECLARATION:
+				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == TypesPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == TypesPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case TypesPackage.JVM_FORMAL_PARAMETER:
-				if(context == grammarAccess.getFullJvmFormalParameterRule()) {
+				if (rule == grammarAccess.getFullJvmFormalParameterRule()) {
 					sequence_FullJvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getJvmFormalParameterRule()) {
+				else if (rule == grammarAccess.getJvmFormalParameterRule()) {
 					sequence_JvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
 					return; 
 				}
 				else break;
 			case TypesPackage.JVM_GENERIC_ARRAY_TYPE_REFERENCE:
-				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
-				   context == grammarAccess.getJvmTypeReferenceRule() ||
-				   context == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()) {
-					sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
+				return; 
 			case TypesPackage.JVM_INNER_TYPE_REFERENCE:
-				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
-				   context == grammarAccess.getJvmParameterizedTypeReferenceRule() ||
-				   context == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0() ||
-				   context == grammarAccess.getJvmTypeReferenceRule() ||
-				   context == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()) {
-					sequence_JvmParameterizedTypeReference(context, (JvmInnerTypeReference) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_JvmParameterizedTypeReference(context, (JvmInnerTypeReference) semanticObject); 
+				return; 
 			case TypesPackage.JVM_LOWER_BOUND:
-				if(context == grammarAccess.getJvmLowerBoundAndedRule()) {
+				if (rule == grammarAccess.getJvmLowerBoundAndedRule()) {
 					sequence_JvmLowerBoundAnded(context, (JvmLowerBound) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getJvmLowerBoundRule()) {
+				else if (rule == grammarAccess.getJvmLowerBoundRule()) {
 					sequence_JvmLowerBound(context, (JvmLowerBound) semanticObject); 
 					return; 
 				}
 				else break;
 			case TypesPackage.JVM_PARAMETERIZED_TYPE_REFERENCE:
-				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
-				   context == grammarAccess.getJvmParameterizedTypeReferenceRule() ||
-				   context == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0() ||
-				   context == grammarAccess.getJvmTypeReferenceRule() ||
-				   context == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()) {
+				if (action == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()) {
+					sequence_JvmParameterizedTypeReference_JvmInnerTypeReference_1_4_0_0_0(context, (JvmParameterizedTypeReference) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getJvmTypeReferenceRule()
+						|| action == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()
+						|| rule == grammarAccess.getJvmParameterizedTypeReferenceRule()
+						|| rule == grammarAccess.getJvmArgumentTypeReferenceRule()) {
 					sequence_JvmParameterizedTypeReference(context, (JvmParameterizedTypeReference) semanticObject); 
 					return; 
 				}
 				else break;
 			case TypesPackage.JVM_TYPE_PARAMETER:
-				if(context == grammarAccess.getJvmTypeParameterRule()) {
-					sequence_JvmTypeParameter(context, (JvmTypeParameter) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_JvmTypeParameter(context, (JvmTypeParameter) semanticObject); 
+				return; 
 			case TypesPackage.JVM_UPPER_BOUND:
-				if(context == grammarAccess.getJvmUpperBoundAndedRule()) {
+				if (rule == grammarAccess.getJvmUpperBoundAndedRule()) {
 					sequence_JvmUpperBoundAnded(context, (JvmUpperBound) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getJvmUpperBoundRule()) {
+				else if (rule == grammarAccess.getJvmUpperBoundRule()) {
 					sequence_JvmUpperBound(context, (JvmUpperBound) semanticObject); 
 					return; 
 				}
 				else break;
 			case TypesPackage.JVM_WILDCARD_TYPE_REFERENCE:
-				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
-				   context == grammarAccess.getJvmWildcardTypeReferenceRule()) {
-					sequence_JvmWildcardTypeReference(context, (JvmWildcardTypeReference) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_JvmWildcardTypeReference(context, (JvmWildcardTypeReference) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == XAnnotationsPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == XAnnotationsPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case XAnnotationsPackage.XANNOTATION:
-				if(context == grammarAccess.getXAnnotationRule() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule()) {
-					sequence_XAnnotation(context, (XAnnotation) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XAnnotation(context, (XAnnotation) semanticObject); 
+				return; 
 			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
-				if(context == grammarAccess.getXAnnotationElementValuePairRule()) {
-					sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == XbasePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == XbasePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case XbasePackage.XASSIGNMENT:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
+				return; 
 			case XbasePackage.XBASIC_FOR_LOOP_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXBasicForLoopExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
+				return; 
 			case XbasePackage.XBINARY_OPERATION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
+				return; 
 			case XbasePackage.XBLOCK_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXBlockExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
+				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
+						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
+						|| rule == grammarAccess.getXAnnotationElementValueRule()
+						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
+						|| rule == grammarAccess.getXExpressionRule()
+						|| rule == grammarAccess.getXAssignmentRule()
+						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOrExpressionRule()
+						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAndExpressionRule()
+						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXEqualityExpressionRule()
+						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXRelationalExpressionRule()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
+						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAdditiveExpressionRule()
+						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
+						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXUnaryOperationRule()
+						|| rule == grammarAccess.getXCastedExpressionRule()
+						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
+						|| rule == grammarAccess.getXPostfixOperationRule()
+						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
+						|| rule == grammarAccess.getXMemberFeatureCallRule()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXPrimaryExpressionRule()
+						|| rule == grammarAccess.getXParenthesizedExpressionRule()
+						|| rule == grammarAccess.getXBlockExpressionRule()
+						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
 					sequence_XBlockExpression(context, (XBlockExpression) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getXExpressionInClosureRule()) {
+				else if (rule == grammarAccess.getXExpressionInClosureRule()) {
 					sequence_XExpressionInClosure(context, (XBlockExpression) semanticObject); 
 					return; 
 				}
 				else break;
 			case XbasePackage.XBOOLEAN_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXBooleanLiteralRule() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XCASE_PART:
-				if(context == grammarAccess.getXCasePartRule()) {
-					sequence_XCasePart(context, (XCasePart) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XCasePart(context, (XCasePart) semanticObject); 
+				return; 
 			case XbasePackage.XCASTED_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
+				return; 
 			case XbasePackage.XCATCH_CLAUSE:
-				if(context == grammarAccess.getXCatchClauseRule()) {
-					sequence_XCatchClause(context, (XCatchClause) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XCatchClause(context, (XCatchClause) semanticObject); 
+				return; 
 			case XbasePackage.XCLOSURE:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXClosureRule() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
+				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
+						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
+						|| rule == grammarAccess.getXAnnotationElementValueRule()
+						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
+						|| rule == grammarAccess.getXExpressionRule()
+						|| rule == grammarAccess.getXAssignmentRule()
+						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOrExpressionRule()
+						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAndExpressionRule()
+						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXEqualityExpressionRule()
+						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXRelationalExpressionRule()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
+						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAdditiveExpressionRule()
+						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
+						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXUnaryOperationRule()
+						|| rule == grammarAccess.getXCastedExpressionRule()
+						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
+						|| rule == grammarAccess.getXPostfixOperationRule()
+						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
+						|| rule == grammarAccess.getXMemberFeatureCallRule()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXPrimaryExpressionRule()
+						|| rule == grammarAccess.getXLiteralRule()
+						|| rule == grammarAccess.getXClosureRule()
+						|| rule == grammarAccess.getXParenthesizedExpressionRule()
+						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
 					sequence_XClosure(context, (XClosure) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getXShortClosureRule()) {
+				else if (rule == grammarAccess.getXShortClosureRule()) {
 					sequence_XShortClosure(context, (XClosure) semanticObject); 
 					return; 
 				}
 				else break;
 			case XbasePackage.XCONSTRUCTOR_CALL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXConstructorCallRule() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
+				return; 
 			case XbasePackage.XDO_WHILE_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXDoWhileExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
+				return; 
 			case XbasePackage.XFEATURE_CALL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
+				return; 
 			case XbasePackage.XFOR_LOOP_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXForLoopExpressionRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
+				return; 
 			case XbasePackage.XIF_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXIfExpressionRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XIfExpression(context, (XIfExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XIfExpression(context, (XIfExpression) semanticObject); 
+				return; 
 			case XbasePackage.XINSTANCE_OF_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
+				return; 
 			case XbasePackage.XLIST_LITERAL:
-				if(context == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
+				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
 					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getXAnnotationElementValueRule()) {
+				else if (rule == grammarAccess.getXAnnotationElementValueRule()) {
 					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
 					return; 
 				}
-				else if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXCollectionLiteralRule() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXListLiteralRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
+				else if (action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
+						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
+						|| rule == grammarAccess.getXExpressionRule()
+						|| rule == grammarAccess.getXAssignmentRule()
+						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOrExpressionRule()
+						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAndExpressionRule()
+						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXEqualityExpressionRule()
+						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXRelationalExpressionRule()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
+						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
+						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXAdditiveExpressionRule()
+						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
+						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
+						|| rule == grammarAccess.getXUnaryOperationRule()
+						|| rule == grammarAccess.getXCastedExpressionRule()
+						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
+						|| rule == grammarAccess.getXPostfixOperationRule()
+						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
+						|| rule == grammarAccess.getXMemberFeatureCallRule()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
+						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
+						|| rule == grammarAccess.getXPrimaryExpressionRule()
+						|| rule == grammarAccess.getXLiteralRule()
+						|| rule == grammarAccess.getXCollectionLiteralRule()
+						|| rule == grammarAccess.getXListLiteralRule()
+						|| rule == grammarAccess.getXParenthesizedExpressionRule()
+						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
 					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
 					return; 
 				}
 				else break;
 			case XbasePackage.XMEMBER_FEATURE_CALL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
+				return; 
 			case XbasePackage.XNULL_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXNullLiteralRule() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XNUMBER_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXNumberLiteralRule() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XPOSTFIX_OPERATION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
+				return; 
 			case XbasePackage.XRETURN_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXReturnExpressionRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
+				return; 
 			case XbasePackage.XSET_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXCollectionLiteralRule() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXSetLiteralRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XSTRING_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXStringLiteralRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XSWITCH_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXSwitchExpressionRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
+				return; 
 			case XbasePackage.XSYNCHRONIZED_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXSynchronizedExpressionRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
+				return; 
 			case XbasePackage.XTHROW_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXThrowExpressionRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
+				return; 
 			case XbasePackage.XTRY_CATCH_FINALLY_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXTryCatchFinallyExpressionRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
+				return; 
 			case XbasePackage.XTYPE_LITERAL:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXLiteralRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXTypeLiteralRule() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
+				return; 
 			case XbasePackage.XUNARY_OPERATION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule()) {
-					sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
+				return; 
 			case XbasePackage.XVARIABLE_DECLARATION:
-				if(context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXVariableDeclarationRule()) {
-					sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
+				return; 
 			case XbasePackage.XWHILE_EXPRESSION:
-				if(context == grammarAccess.getXAdditiveExpressionRule() ||
-				   context == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAndExpressionRule() ||
-				   context == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXAnnotationElementValueRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListRule() ||
-				   context == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0() ||
-				   context == grammarAccess.getXAnnotationOrExpressionRule() ||
-				   context == grammarAccess.getXAssignmentRule() ||
-				   context == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXCastedExpressionRule() ||
-				   context == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0() ||
-				   context == grammarAccess.getXEqualityExpressionRule() ||
-				   context == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXExpressionRule() ||
-				   context == grammarAccess.getXExpressionOrVarDeclarationRule() ||
-				   context == grammarAccess.getXMemberFeatureCallRule() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXMultiplicativeExpressionRule() ||
-				   context == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOrExpressionRule() ||
-				   context == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXOtherOperatorExpressionRule() ||
-				   context == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0() ||
-				   context == grammarAccess.getXParenthesizedExpressionRule() ||
-				   context == grammarAccess.getXPostfixOperationRule() ||
-				   context == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0() ||
-				   context == grammarAccess.getXPrimaryExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionRule() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0() ||
-				   context == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0() ||
-				   context == grammarAccess.getXUnaryOperationRule() ||
-				   context == grammarAccess.getXWhileExpressionRule()) {
-					sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == XtypePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == XtypePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case XtypePackage.XFUNCTION_TYPE_REF:
-				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
-				   context == grammarAccess.getJvmTypeReferenceRule() ||
-				   context == grammarAccess.getXFunctionTypeRefRule()) {
-					sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
-					return; 
-				}
-				else break;
-			case XtypePackage.XIMPORT_DECLARATION:
-				if(context == grammarAccess.getXImportDeclarationRule()) {
-					sequence_XImportDeclaration(context, (XImportDeclaration) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
+				return; 
 			case XtypePackage.XIMPORT_SECTION:
-				if(context == grammarAccess.getXImportSectionRule()) {
-					sequence_XImportSection(context, (XImportSection) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XImportSection(context, (XImportSection) semanticObject); 
+				return; 
 			}
-		if (errorAcceptor != null) errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+		if (errorAcceptor != null)
+			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
 	}
 	
 	/**
+	 * Contexts:
+	 *     IIterate returns DateIterate
+	 *     DateIterate returns DateIterate
+	 *
 	 * Constraint:
 	 *     (from=Date until=Date stepCount=INT stepType=EDateStepType)
 	 */
-	protected void sequence_DateIterate(EObject context, DateIterate semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__FROM) == ValueTransient.YES)
+	protected void sequence_DateIterate(ISerializationContext context, DateIterate semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__FROM) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__FROM));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__UNTIL) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__UNTIL) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__UNTIL));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_COUNT) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_COUNT) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_COUNT));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_TYPE) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_TYPE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.DATE_ITERATE__STEP_TYPE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getDateIterateAccess().getFromDateParserRuleCall_1_0(), semanticObject.getFrom());
 		feeder.accept(grammarAccess.getDateIterateAccess().getUntilDateParserRuleCall_3_0(), semanticObject.getUntil());
 		feeder.accept(grammarAccess.getDateIterateAccess().getStepCountINTTerminalRuleCall_5_0(), semanticObject.getStepCount());
@@ -1755,120 +631,121 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     Date returns Date
+	 *
 	 * Constraint:
 	 *     (yesterday?='yesterday' | today?='today' | tomorrow?='tomorrow' | (year=INT month=INT day=INT))
 	 */
-	protected void sequence_Date(EObject context, Date semanticObject) {
+	protected void sequence_Date(ISerializationContext context, Date semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockEntityUsable returns EntityMockAttributeByObject
+	 *     IEntityMockAttribute returns EntityMockAttributeByObject
+	 *     EntityMockAttributeByObject returns EntityMockAttributeByObject
+	 *
 	 * Constraint:
 	 *     (
 	 *         (attributeRef=[LEntityAttribute|ID] reference=EntityMockReferencedObjectAttribute) | 
 	 *         (resourceEnum=[EntityMockObjectEnum|ID] resourceAttribute=[EntityMockResourceAttribute|ID])
 	 *     )
 	 */
-	protected void sequence_EntityMockAttributeByObject(EObject context, EntityMockAttributeByObject semanticObject) {
+	protected void sequence_EntityMockAttributeByObject(ISerializationContext context, EntityMockAttributeByObject semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockEntityUsable returns EntityMockAttributeByReference
+	 *     IEntityMockAttribute returns EntityMockAttributeByReference
+	 *     EntityMockAttributeByReference returns EntityMockAttributeByReference
+	 *
 	 * Constraint:
 	 *     (attributeRef=[LEntityReference|ID] mockedEntity=[EntityMockEntity|ID]? optionalFor=INT?)
 	 */
-	protected void sequence_EntityMockAttributeByReference(EObject context, EntityMockAttributeByReference semanticObject) {
+	protected void sequence_EntityMockAttributeByReference(ISerializationContext context, EntityMockAttributeByReference semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockEntityUsable returns EntityMockAttributeFiller
+	 *     IEntityMockAttribute returns EntityMockAttributeFiller
+	 *     EntityMockAttributeFiller returns EntityMockAttributeFiller
+	 *
 	 * Constraint:
 	 *     (attributeRef=[LEntityAttribute|ID] fillerType=PropertyFillerType)
 	 */
-	protected void sequence_EntityMockAttributeFiller(EObject context, EntityMockAttributeFiller semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) == ValueTransient.YES)
+	protected void sequence_EntityMockAttributeFiller(ISerializationContext context, EntityMockAttributeFiller semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1(), semanticObject.getAttributeRef());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockAttributeFillerAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF, false));
 		feeder.accept(grammarAccess.getEntityMockAttributeFillerAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0(), semanticObject.getFillerType());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockByResourceAttribute returns EntityMockByResourceAttribute
+	 *
 	 * Constraint:
 	 *     (attributeRef=[LEntityAttribute|ID] resourceAttribute=[EntityMockResourceAttribute|ID])
 	 */
-	protected void sequence_EntityMockByResourceAttribute(EObject context, EntityMockByResourceAttribute semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF) == ValueTransient.YES)
+	protected void sequence_EntityMockByResourceAttribute(ISerializationContext context, EntityMockByResourceAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1(), semanticObject.getAttributeRef());
-		feeder.accept(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1(), semanticObject.getResourceAttribute());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockByResourceAttributeAccess().getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF, false));
+		feeder.accept(grammarAccess.getEntityMockByResourceAttributeAccess().getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE, false));
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockEntities returns EntityMockEntities
+	 *
 	 * Constraint:
-	 *     name=QualifiedName
+	 *     entities+=EntityMockEntity*
 	 */
-	protected void sequence_EntityMockDataType(EObject context, EntityMockDataType semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_DATA_TYPE__NAME) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_DATA_TYPE__NAME));
-		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockDataTypeAccess().getNameQualifiedNameParserRuleCall_1_0(), semanticObject.getName());
-		feeder.finish();
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (datatypes+=EntityMockDataType*)
-	 */
-	protected void sequence_EntityMockDataTypes(EObject context, EntityMockDataTypes semanticObject) {
+	protected void sequence_EntityMockEntities(ISerializationContext context, EntityMockEntities semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockEntityFunctionParameter returns EntityMockEntityFunctionParameter
+	 *
 	 * Constraint:
-	 *     (entities+=EntityMockEntity*)
+	 *     (attributeRef=[LEntityAttribute|ID] | nestedAttribute=EntityMockEntityNestedAttribute)
 	 */
-	protected void sequence_EntityMockEntities(EObject context, EntityMockEntities semanticObject) {
+	protected void sequence_EntityMockEntityFunctionParameter(ISerializationContext context, EntityMockEntityFunctionParameter semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
-	 * Constraint:
-	 *     (
-	 *         attributeRef=[LEntityAttribute|ID] | 
-	 *         (referencePaths+=[LEntityReference|ID] referencePaths+=[LEntityReference|ID]* referenceRef=[LEntityAttribute|ID])
-	 *     )
-	 */
-	protected void sequence_EntityMockEntityFunctionParameter(EObject context, EntityMockEntityFunctionParameter semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
+	 * Contexts:
+	 *     IEntityMockEntityUsable returns EntityMockEntityFunction
+	 *     EntityMockEntityFunction returns EntityMockEntityFunction
+	 *
 	 * Constraint:
 	 *     (
 	 *         attributeRef=[LEntityAttribute|ID] 
@@ -1876,300 +753,387 @@
 	 *         body=XBlockExpression
 	 *     )
 	 */
-	protected void sequence_EntityMockEntityFunction(EObject context, EntityMockEntityFunction semanticObject) {
+	protected void sequence_EntityMockEntityFunction(ISerializationContext context, EntityMockEntityFunction semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockEntityNestedAttribute returns EntityMockEntityNestedAttribute
+	 *
+	 * Constraint:
+	 *     (reference=[LEntityReference|ID] attribute=[LEntityAttribute|ID])
+	 */
+	protected void sequence_EntityMockEntityNestedAttribute(ISerializationContext context, EntityMockEntityNestedAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE));
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockEntityNestedAttributeAccess().getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE, false));
+		feeder.accept(grammarAccess.getEntityMockEntityNestedAttributeAccess().getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE, false));
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockEntity returns EntityMockEntity
+	 *
 	 * Constraint:
 	 *     (
-	 *         name=QualifiedName 
+	 *         name=ID 
 	 *         entityRef=[LEntity|ID] 
 	 *         (
-	 *             (minRows=INT maxRows=INT temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction*) | 
-	 *             (byResource=[EntityMockResource|ID] byResourceAttributes+=EntityMockByResourceAttribute* createBlobMapping?='createBlobMapping'?) | 
+	 *             (minRows=INT maxRows=INT templates+=EntityMockTemplate* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction*) | 
+	 *             (byResource=[EntityMockResource|ID] (byResourceAttributes+=EntityMockByResourceAttribute | createBlobMapping?='createBlobMapping')*) | 
 	 *             (
 	 *                 iterator=[LEntityAttribute|ID] 
 	 *                 iterate=IIterate 
-	 *                 temporaries+=EntityMockTemporary* 
+	 *                 templates+=EntityMockTemplate* 
 	 *                 attributes+=IEntityMockAttribute* 
 	 *                 calculations+=EntityMockEntityFunction*
 	 *             )
 	 *         )
 	 *     )
 	 */
-	protected void sequence_EntityMockEntity(EObject context, EntityMockEntity semanticObject) {
+	protected void sequence_EntityMockEntity(ISerializationContext context, EntityMockEntity semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockModel returns EntityMockModel
+	 *
 	 * Constraint:
-	 *     packages+=EntityMockPackage*
+	 *     ((importSection=XImportSection packages+=EntityMockPackage+) | packages+=EntityMockPackage+)?
 	 */
-	protected void sequence_EntityMockModel(EObject context, EntityMockModel semanticObject) {
+	protected void sequence_EntityMockModel(ISerializationContext context, EntityMockModel semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectUsable returns EntityMockObjectArrayValue
+	 *     IEntityMockObjectAttribute returns EntityMockObjectArrayValue
+	 *     EntityMockObjectArrayValue returns EntityMockObjectArrayValue
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName enumeration=[EntityMockObjectEnum|ID] items+=EntityMockObjectItemValue*)
+	 *     (name=ID enumeration=[EntityMockObjectEnum|ID] items+=EntityMockObjectItemValue*)
 	 */
-	protected void sequence_EntityMockObjectArrayValue(EObject context, EntityMockObjectArrayValue semanticObject) {
+	protected void sequence_EntityMockObjectArrayValue(ISerializationContext context, EntityMockObjectArrayValue semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectUsable returns EntityMockObjectEmbed
+	 *     IEntityMockObjectAttribute returns EntityMockObjectEmbed
+	 *     EntityMockObjectEmbed returns EntityMockObjectEmbed
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName object=[EntityMockObject|ID])
+	 *     (name=ID object=[EntityMockObject|ID])
 	 */
-	protected void sequence_EntityMockObjectEmbed(EObject context, EntityMockObjectEmbed semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME) == ValueTransient.YES)
+	protected void sequence_EntityMockObjectEmbed(ISerializationContext context, EntityMockObjectEmbed semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_EMBED__OBJECT) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_EMBED__OBJECT) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_EMBED__OBJECT));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockObjectEmbedAccess().getNameQualifiedNameParserRuleCall_2_0(), semanticObject.getName());
-		feeder.accept(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1(), semanticObject.getObject());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockObjectEmbedAccess().getNameIDTerminalRuleCall_2_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getEntityMockObjectEmbedAccess().getObjectEntityMockObjectIDTerminalRuleCall_4_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_EMBED__OBJECT, false));
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockObjectEnum returns EntityMockObjectEnum
+	 *     IEntityMockObjectUsable returns EntityMockObjectEnum
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName usingResource=[LEnum|ID])
+	 *     (name=ID usingResource=[LEnum|ID])
 	 */
-	protected void sequence_EntityMockObjectEnum(EObject context, EntityMockObjectEnum semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__NAME) == ValueTransient.YES)
+	protected void sequence_EntityMockObjectEnum(ISerializationContext context, EntityMockObjectEnum semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__NAME));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockObjectEnumAccess().getNameQualifiedNameParserRuleCall_1_0(), semanticObject.getName());
-		feeder.accept(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1(), semanticObject.getUsingResource());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockObjectEnumAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getEntityMockObjectEnumAccess().getUsingResourceLEnumIDTerminalRuleCall_3_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE, false));
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectUsable returns EntityMockObjectFill
+	 *     IEntityMockObjectAttribute returns EntityMockObjectFill
+	 *     EntityMockObjectFill returns EntityMockObjectFill
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName fillerType=PropertyFillerType)
+	 *     (name=ID fillerType=PropertyFillerType)
 	 */
-	protected void sequence_EntityMockObjectFill(EObject context, EntityMockObjectFill semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME) == ValueTransient.YES)
+	protected void sequence_EntityMockObjectFill(ISerializationContext context, EntityMockObjectFill semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockObjectFillAccess().getNameQualifiedNameParserRuleCall_1_0(), semanticObject.getName());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockObjectFillAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
 		feeder.accept(grammarAccess.getEntityMockObjectFillAccess().getFillerTypePropertyFillerTypeParserRuleCall_3_0(), semanticObject.getFillerType());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockObjectFunctionParameter returns EntityMockObjectFunctionParameter
+	 *
 	 * Constraint:
 	 *     (parameterType=JvmTypeReference name=[IEntityMockObjectUsable|ID])
 	 */
-	protected void sequence_EntityMockObjectFunctionParameter(EObject context, EntityMockObjectFunctionParameter semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE) == ValueTransient.YES)
+	protected void sequence_EntityMockObjectFunctionParameter(ISerializationContext context, EntityMockObjectFunctionParameter semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getEntityMockObjectFunctionParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0(), semanticObject.getParameterType());
-		feeder.accept(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1(), semanticObject.getName());
+		feeder.accept(grammarAccess.getEntityMockObjectFunctionParameterAccess().getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME, false));
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectUsable returns EntityMockObjectFunction
+	 *     EntityMockObjectFunction returns EntityMockObjectFunction
+	 *
 	 * Constraint:
 	 *     (
-	 *         name=QualifiedName 
+	 *         name=ID 
 	 *         oftype=JvmParameterizedTypeReference 
 	 *         (params+=EntityMockObjectFunctionParameter params+=EntityMockObjectFunctionParameter*)? 
 	 *         body=XBlockExpression
 	 *     )
 	 */
-	protected void sequence_EntityMockObjectFunction(EObject context, EntityMockObjectFunction semanticObject) {
+	protected void sequence_EntityMockObjectFunction(ISerializationContext context, EntityMockObjectFunction semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockObjectItemValue returns EntityMockObjectItemValue
+	 *
 	 * Constraint:
 	 *     (datarow=[LEnumLiteral|ID] values+=STRING*)
 	 */
-	protected void sequence_EntityMockObjectItemValue(EObject context, EntityMockObjectItemValue semanticObject) {
+	protected void sequence_EntityMockObjectItemValue(ISerializationContext context, EntityMockObjectItemValue semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectUsable returns EntityMockObjectPlainValue
+	 *     IEntityMockObjectAttribute returns EntityMockObjectPlainValue
+	 *     EntityMockObjectPlainValue returns EntityMockObjectPlainValue
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName values+=STRING*)
+	 *     (name=ID values+=STRING*)
 	 */
-	protected void sequence_EntityMockObjectPlainValue(EObject context, EntityMockObjectPlainValue semanticObject) {
+	protected void sequence_EntityMockObjectPlainValue(ISerializationContext context, EntityMockObjectPlainValue semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     IEntityMockObjectAttribute returns EntityMockObjectResourceValue
+	 *     EntityMockObjectResourceValue returns EntityMockObjectResourceValue
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName resourceEnum=[EntityMockObjectEnum|ID] resourceAttribute=[EntityMockResourceAttribute|ID]?)
+	 *     (name=ID resourceEnum=[EntityMockObjectEnum|ID] resourceAttribute=[EntityMockResourceAttribute|ID]?)
 	 */
-	protected void sequence_EntityMockObjectResourceValue(EObject context, EntityMockObjectResourceValue semanticObject) {
+	protected void sequence_EntityMockObjectResourceValue(ISerializationContext context, EntityMockObjectResourceValue semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockObject returns EntityMockObject
+	 *
 	 * Constraint:
-	 *     (name=QualifiedName enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute* calculations+=EntityMockObjectFunction*)
+	 *     (name=ID enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute* calculations+=EntityMockObjectFunction*)
 	 */
-	protected void sequence_EntityMockObject(EObject context, EntityMockObject semanticObject) {
+	protected void sequence_EntityMockObject(ISerializationContext context, EntityMockObject semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockObjects returns EntityMockObjects
+	 *
 	 * Constraint:
-	 *     (objects+=EntityMockObject*)
+	 *     objects+=EntityMockObject*
 	 */
-	protected void sequence_EntityMockObjects(EObject context, EntityMockObjects semanticObject) {
+	protected void sequence_EntityMockObjects(ISerializationContext context, EntityMockObjects semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     EntityMockPackage returns EntityMockPackage
+	 *
+	 * Constraint:
+	 *     (name=QualifiedName mocks+=EntityMock*)
+	 */
+	protected void sequence_EntityMockPackage(ISerializationContext context, EntityMockPackage semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockReferencedObjectAttribute returns EntityMockReferencedObjectAttribute
+	 *
+	 * Constraint:
+	 *     (template=[EntityMockTemplate|ID] embedded+=[EntityMockObjectEmbed|ID]* attribute=[IEntityMockObjectUsable|ID])
+	 */
+	protected void sequence_EntityMockReferencedObjectAttribute(ISerializationContext context, EntityMockReferencedObjectAttribute semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockResourceAttribute returns EntityMockResourceAttribute
+	 *
+	 * Constraint:
+	 *     name=ID
+	 */
+	protected void sequence_EntityMockResourceAttribute(ISerializationContext context, EntityMockResourceAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, OSBPTypesPackage.Literals.LTYPE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, OSBPTypesPackage.Literals.LTYPE__NAME));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockResourceAttributeAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockResourceDataRow returns EntityMockResourceDataRow
+	 *
+	 * Constraint:
+	 *     (name=ID values+=STRING*)
+	 */
+	protected void sequence_EntityMockResourceDataRow(ISerializationContext context, EntityMockResourceDataRow semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockResource returns EntityMockResource
+	 *
+	 * Constraint:
+	 *     (name=ID attributes+=EntityMockResourceAttribute* datarows+=EntityMockResourceDataRow*)
+	 */
+	protected void sequence_EntityMockResource(ISerializationContext context, EntityMockResource semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockResources returns EntityMockResources
+	 *
+	 * Constraint:
+	 *     resources+=EntityMockResource*
+	 */
+	protected void sequence_EntityMockResources(ISerializationContext context, EntityMockResources semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMockTemplate returns EntityMockTemplate
+	 *
+	 * Constraint:
+	 *     (name=ID object=[EntityMockObject|ID])
+	 */
+	protected void sequence_EntityMockTemplate(ISerializationContext context, EntityMockTemplate semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE__NAME));
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE__OBJECT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE__OBJECT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEntityMockTemplateAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getEntityMockTemplateAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPLATE__OBJECT, false));
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EntityMock returns EntityMock
+	 *
 	 * Constraint:
 	 *     (
-	 *         imports+=EntityModelImport 
-	 *         runPriority=INT? 
-	 *         imports+=EntityModelImport* 
-	 *         datainterchanges=RunningDataInterchanges? 
-	 *         resources=EntityMockResources? 
-	 *         objects=EntityMockObjects? 
-	 *         datatypes=EntityMockDataTypes? 
-	 *         entities=EntityMockEntities
+	 *         name=ID 
+	 *         (description?='describedBy' descriptionValue=STRING)? 
+	 *         (runPriority=INT | datainterchanges=RunningDataInterchanges | resources=EntityMockResources | objects=EntityMockObjects | entities=EntityMockEntities)*
 	 *     )
 	 */
-	protected void sequence_EntityMockPackage(EObject context, EntityMockPackage semanticObject) {
+	protected void sequence_EntityMock(ISerializationContext context, EntityMock semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
-	 * Constraint:
-	 *     (temporary=[EntityMockTemporary|ID] embedded+=[EntityMockObjectEmbed|ID]* attribute=[IEntityMockObjectUsable|ID])
-	 */
-	protected void sequence_EntityMockReferencedObjectAttribute(EObject context, EntityMockReferencedObjectAttribute semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     name=QualifiedName
-	 */
-	protected void sequence_EntityMockResourceAttribute(EObject context, EntityMockResourceAttribute semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (name=QualifiedName values+=STRING*)
-	 */
-	protected void sequence_EntityMockResourceDataRow(EObject context, EntityMockResourceDataRow semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (name=QualifiedName attributes+=EntityMockResourceAttribute* datarows+=EntityMockResourceDataRow*)
-	 */
-	protected void sequence_EntityMockResource(EObject context, EntityMockResource semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (resources+=EntityMockResource*)
-	 */
-	protected void sequence_EntityMockResources(EObject context, EntityMockResources semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     (name=QualifiedName object=[EntityMockObject|ID])
-	 */
-	protected void sequence_EntityMockTemporary(EObject context, EntityMockTemporary semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPORARY__NAME) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPORARY__NAME));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPORARY__OBJECT) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.ENTITY_MOCK_TEMPORARY__OBJECT));
-		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityMockTemporaryAccess().getNameQualifiedNameParserRuleCall_1_0(), semanticObject.getName());
-		feeder.accept(grammarAccess.getEntityMockTemporaryAccess().getObjectEntityMockObjectIDTerminalRuleCall_3_0_1(), semanticObject.getObject());
-		feeder.finish();
-	}
-	
-	
-	/**
-	 * Constraint:
-	 *     importedNamespace=EntityMockQualifiedNameWithWildCard
-	 */
-	protected void sequence_EntityModelImport(EObject context, LImport semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, OSBPTypesPackage.Literals.LIMPORT__IMPORTED_NAMESPACE) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, OSBPTypesPackage.Literals.LIMPORT__IMPORTED_NAMESPACE));
-		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getEntityModelImportAccess().getImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0(), semanticObject.getImportedNamespace());
-		feeder.finish();
-	}
-	
-	
-	/**
+	 * Contexts:
+	 *     IIterate returns IntegerIterate
+	 *     IntegerIterate returns IntegerIterate
+	 *
 	 * Constraint:
 	 *     (from=SINT until=SINT step=INT)
 	 */
-	protected void sequence_IntegerIterate(EObject context, IntegerIterate semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__FROM) == ValueTransient.YES)
+	protected void sequence_IntegerIterate(ISerializationContext context, IntegerIterate semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__FROM) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__FROM));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__UNTIL) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__UNTIL) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__UNTIL));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__STEP) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__STEP) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.INTEGER_ITERATE__STEP));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getIntegerIterateAccess().getFromSINTParserRuleCall_1_0(), semanticObject.getFrom());
 		feeder.accept(grammarAccess.getIntegerIterateAccess().getUntilSINTParserRuleCall_3_0(), semanticObject.getUntil());
 		feeder.accept(grammarAccess.getIntegerIterateAccess().getStepINTTerminalRuleCall_5_0(), semanticObject.getStep());
@@ -2178,75 +1142,96 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerBoolean
+	 *     PropertyFillerBoolean returns PropertyFillerBoolean
+	 *
 	 * Constraint:
 	 *     {PropertyFillerBoolean}
 	 */
-	protected void sequence_PropertyFillerBoolean(EObject context, PropertyFillerBoolean semanticObject) {
+	protected void sequence_PropertyFillerBoolean(ISerializationContext context, PropertyFillerBoolean semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerDateFuture
+	 *     PropertyFillerDateFuture returns PropertyFillerDateFuture
+	 *
 	 * Constraint:
 	 *     dateFutureYears=INT
 	 */
-	protected void sequence_PropertyFillerDateFuture(EObject context, PropertyFillerDateFuture semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS) == ValueTransient.YES)
+	protected void sequence_PropertyFillerDateFuture(ISerializationContext context, PropertyFillerDateFuture semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyFillerDateFutureAccess().getDateFutureYearsINTTerminalRuleCall_1_0(), semanticObject.getDateFutureYears());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerDatePast
+	 *     PropertyFillerDatePast returns PropertyFillerDatePast
+	 *
 	 * Constraint:
 	 *     datePastYears=INT
 	 */
-	protected void sequence_PropertyFillerDatePast(EObject context, PropertyFillerDatePast semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS) == ValueTransient.YES)
+	protected void sequence_PropertyFillerDatePast(ISerializationContext context, PropertyFillerDatePast semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyFillerDatePastAccess().getDatePastYearsINTTerminalRuleCall_1_0(), semanticObject.getDatePastYears());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerDateRange
+	 *     PropertyFillerDateRange returns PropertyFillerDateRange
+	 *
 	 * Constraint:
 	 *     (dateBeginYears=SINT dateEndYears=SINT)
 	 */
-	protected void sequence_PropertyFillerDateRange(EObject context, PropertyFillerDateRange semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS) == ValueTransient.YES)
+	protected void sequence_PropertyFillerDateRange(ISerializationContext context, PropertyFillerDateRange semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_1_0(), semanticObject.getDateBeginYears());
-		feeder.accept(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_3_0(), semanticObject.getDateEndYears());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getPropertyFillerDateRangeAccess().getDateBeginYearsSINTParserRuleCall_2_0(), semanticObject.getDateBeginYears());
+		feeder.accept(grammarAccess.getPropertyFillerDateRangeAccess().getDateEndYearsSINTParserRuleCall_4_0(), semanticObject.getDateEndYears());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerSignedDoubleRandom
+	 *     PropertyFillerSignedDoubleRandom returns PropertyFillerSignedDoubleRandom
+	 *
 	 * Constraint:
 	 *     items+=SignedNumber+
 	 */
-	protected void sequence_PropertyFillerSignedDoubleRandom(EObject context, PropertyFillerSignedDoubleRandom semanticObject) {
+	protected void sequence_PropertyFillerSignedDoubleRandom(ISerializationContext context, PropertyFillerSignedDoubleRandom semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerSignedDoubleRange
+	 *     PropertyFillerSignedDoubleRange returns PropertyFillerSignedDoubleRange
+	 *
 	 * Constraint:
 	 *     (
 	 *         ((beginRange=SignedNumber | beginRangeRef=[LEntityAttribute|ID])? (endRange=SignedNumber | endRangeRef=[LEntityAttribute|ID]))? 
@@ -2254,75 +1239,107 @@
 	 *         rounded=UnsignedNumber?
 	 *     )
 	 */
-	protected void sequence_PropertyFillerSignedDoubleRange(EObject context, PropertyFillerSignedDoubleRange semanticObject) {
+	protected void sequence_PropertyFillerSignedDoubleRange(ISerializationContext context, PropertyFillerSignedDoubleRange semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerSignedIntegerRandom
+	 *     PropertyFillerSignedIntegerRandom returns PropertyFillerSignedIntegerRandom
+	 *
 	 * Constraint:
 	 *     items+=SINT+
 	 */
-	protected void sequence_PropertyFillerSignedIntegerRandom(EObject context, PropertyFillerSignedIntegerRandom semanticObject) {
+	protected void sequence_PropertyFillerSignedIntegerRandom(ISerializationContext context, PropertyFillerSignedIntegerRandom semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerSignedIntegerRange
+	 *     PropertyFillerSignedIntegerRange returns PropertyFillerSignedIntegerRange
+	 *
 	 * Constraint:
 	 *     (((beginRange=SINT | beginRangeRef=[LEntityAttribute|ID])? (endRange=SINT | endRangeRef=[LEntityAttribute|ID]))? rounded=INT?)
 	 */
-	protected void sequence_PropertyFillerSignedIntegerRange(EObject context, PropertyFillerSignedIntegerRange semanticObject) {
+	protected void sequence_PropertyFillerSignedIntegerRange(ISerializationContext context, PropertyFillerSignedIntegerRange semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerTextParagraphs
+	 *     PropertyFillerTextParagraphs returns PropertyFillerTextParagraphs
+	 *
 	 * Constraint:
-	 *     (count=INT?)
+	 *     count=INT?
 	 */
-	protected void sequence_PropertyFillerTextParagraphs(EObject context, PropertyFillerTextParagraphs semanticObject) {
+	protected void sequence_PropertyFillerTextParagraphs(ISerializationContext context, PropertyFillerTextParagraphs semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerTextRandom
+	 *     PropertyFillerTextRandom returns PropertyFillerTextRandom
+	 *
 	 * Constraint:
 	 *     items+=STRING+
 	 */
-	protected void sequence_PropertyFillerTextRandom(EObject context, PropertyFillerTextRandom semanticObject) {
+	protected void sequence_PropertyFillerTextRandom(ISerializationContext context, PropertyFillerTextRandom semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerTextSentences
+	 *     PropertyFillerTextSentences returns PropertyFillerTextSentences
+	 *
 	 * Constraint:
-	 *     (count=INT?)
+	 *     count=INT?
 	 */
-	protected void sequence_PropertyFillerTextSentences(EObject context, PropertyFillerTextSentences semanticObject) {
+	protected void sequence_PropertyFillerTextSentences(ISerializationContext context, PropertyFillerTextSentences semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerTextWords
+	 *     PropertyFillerTextWords returns PropertyFillerTextWords
+	 *
 	 * Constraint:
-	 *     (count=INT?)
+	 *     count=INT?
 	 */
-	protected void sequence_PropertyFillerTextWords(EObject context, PropertyFillerTextWords semanticObject) {
+	protected void sequence_PropertyFillerTextWords(ISerializationContext context, PropertyFillerTextWords semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerUnsignedDoubleRandom
+	 *     PropertyFillerUnsignedDoubleRandom returns PropertyFillerUnsignedDoubleRandom
+	 *
 	 * Constraint:
 	 *     items+=UnsignedNumber+
 	 */
-	protected void sequence_PropertyFillerUnsignedDoubleRandom(EObject context, PropertyFillerUnsignedDoubleRandom semanticObject) {
+	protected void sequence_PropertyFillerUnsignedDoubleRandom(ISerializationContext context, PropertyFillerUnsignedDoubleRandom semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerUnsignedDoubleRange
+	 *     PropertyFillerUnsignedDoubleRange returns PropertyFillerUnsignedDoubleRange
+	 *
 	 * Constraint:
 	 *     (
 	 *         ((beginRange=UnsignedNumber | beginRangeRef=[LEntityAttribute|ID])? (endRange=UnsignedNumber | endRangeRef=[LEntityAttribute|ID]))? 
@@ -2330,53 +1347,68 @@
 	 *         rounded=UnsignedNumber?
 	 *     )
 	 */
-	protected void sequence_PropertyFillerUnsignedDoubleRange(EObject context, PropertyFillerUnsignedDoubleRange semanticObject) {
+	protected void sequence_PropertyFillerUnsignedDoubleRange(ISerializationContext context, PropertyFillerUnsignedDoubleRange semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerUnsignedIntegerRandom
+	 *     PropertyFillerUnsignedIntegerRandom returns PropertyFillerUnsignedIntegerRandom
+	 *
 	 * Constraint:
 	 *     items+=INT+
 	 */
-	protected void sequence_PropertyFillerUnsignedIntegerRandom(EObject context, PropertyFillerUnsignedIntegerRandom semanticObject) {
+	protected void sequence_PropertyFillerUnsignedIntegerRandom(ISerializationContext context, PropertyFillerUnsignedIntegerRandom semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyFillerType returns PropertyFillerUnsignedIntegerRange
+	 *     PropertyFillerUnsignedIntegerRange returns PropertyFillerUnsignedIntegerRange
+	 *
 	 * Constraint:
 	 *     (((beginRange=INT | beginRangeRef=[LEntityAttribute|ID])? (endRange=INT | endRangeRef=[LEntityAttribute|ID]))? rounded=INT?)
 	 */
-	protected void sequence_PropertyFillerUnsignedIntegerRange(EObject context, PropertyFillerUnsignedIntegerRange semanticObject) {
+	protected void sequence_PropertyFillerUnsignedIntegerRange(ISerializationContext context, PropertyFillerUnsignedIntegerRange semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     RunningDataInterchange returns RunningDataInterchange
+	 *
 	 * Constraint:
 	 *     (datainterchangeRef=[DataInterchange|ID] fileURL=STRING)
 	 */
-	protected void sequence_RunningDataInterchange(EObject context, RunningDataInterchange semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF) == ValueTransient.YES)
+	protected void sequence_RunningDataInterchange(ISerializationContext context, RunningDataInterchange semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF));
-			if(transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__FILE_URL) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__FILE_URL) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__FILE_URL));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1(), semanticObject.getDatainterchangeRef());
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getRunningDataInterchangeAccess().getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1(), semanticObject.eGet(EntityMockDSLPackage.Literals.RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF, false));
 		feeder.accept(grammarAccess.getRunningDataInterchangeAccess().getFileURLSTRINGTerminalRuleCall_4_0(), semanticObject.getFileURL());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     RunningDataInterchanges returns RunningDataInterchanges
+	 *
 	 * Constraint:
-	 *     (datainterchanges+=RunningDataInterchange*)
+	 *     datainterchanges+=RunningDataInterchange*
 	 */
-	protected void sequence_RunningDataInterchanges(EObject context, RunningDataInterchanges semanticObject) {
+	protected void sequence_RunningDataInterchanges(ISerializationContext context, RunningDataInterchanges semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
+	
+	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSyntacticSequencer.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSyntacticSequencer.java
index 5ab1036..56f3ff4 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSyntacticSequencer.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/serializer/EntityMockDSLSyntacticSequencer.java
@@ -10,6 +10,8 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.serializer;
@@ -32,47 +34,49 @@
 public class EntityMockDSLSyntacticSequencer extends AbstractSyntacticSequencer {
 
 	protected EntityMockDSLGrammarAccess grammarAccess;
-	protected AbstractElementAlias match_EntityMockEntityFunctionParameter_FullStopKeyword_1_1_0_q;
 	protected AbstractElementAlias match_EntityMockObjectItemValue_CommaKeyword_3_1_q;
 	protected AbstractElementAlias match_EntityMockObjectPlainValue_CommaKeyword_3_1_q;
+	protected AbstractElementAlias match_EntityMockPackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q;
 	protected AbstractElementAlias match_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q;
 	protected AbstractElementAlias match_EntityMockResourceDataRow_CommaKeyword_2_1_1_q;
 	protected AbstractElementAlias match_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q;
 	protected AbstractElementAlias match_EntityMockResource_CommaKeyword_3_2_1_q;
 	protected AbstractElementAlias match_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q;
+	protected AbstractElementAlias match_EntityMock___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_2__q;
 	protected AbstractElementAlias match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q;
 	protected AbstractElementAlias match_XBlockExpression_SemicolonKeyword_2_1_q;
 	protected AbstractElementAlias match_XExpressionInClosure_SemicolonKeyword_1_1_q;
 	protected AbstractElementAlias match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q;
-	protected AbstractElementAlias match_XImportDeclaration_SemicolonKeyword_2_q;
+	protected AbstractElementAlias match_XImportDeclaration_SemicolonKeyword_3_q;
 	protected AbstractElementAlias match_XParenthesizedExpression_LeftParenthesisKeyword_0_a;
 	protected AbstractElementAlias match_XParenthesizedExpression_LeftParenthesisKeyword_0_p;
 	
 	@Inject
 	protected void init(IGrammarAccess access) {
 		grammarAccess = (EntityMockDSLGrammarAccess) access;
-		match_EntityMockEntityFunctionParameter_FullStopKeyword_1_1_0_q = new TokenAlias(false, true, grammarAccess.getEntityMockEntityFunctionParameterAccess().getFullStopKeyword_1_1_0());
 		match_EntityMockObjectItemValue_CommaKeyword_3_1_q = new TokenAlias(false, true, grammarAccess.getEntityMockObjectItemValueAccess().getCommaKeyword_3_1());
 		match_EntityMockObjectPlainValue_CommaKeyword_3_1_q = new TokenAlias(false, true, grammarAccess.getEntityMockObjectPlainValueAccess().getCommaKeyword_3_1());
+		match_EntityMockPackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getEntityMockPackageAccess().getLeftCurlyBracketKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getEntityMockPackageAccess().getRightCurlyBracketKeyword_3_2()));
 		match_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q = new TokenAlias(false, true, grammarAccess.getEntityMockReferencedObjectAttributeAccess().getFullStopKeyword_2_0());
 		match_EntityMockResourceDataRow_CommaKeyword_2_1_1_q = new TokenAlias(false, true, grammarAccess.getEntityMockResourceDataRowAccess().getCommaKeyword_2_1_1());
 		match_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getEntityMockResourceDataRowAccess().getLeftParenthesisKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getEntityMockResourceDataRowAccess().getRightParenthesisKeyword_2_2()));
 		match_EntityMockResource_CommaKeyword_3_2_1_q = new TokenAlias(false, true, grammarAccess.getEntityMockResourceAccess().getCommaKeyword_3_2_1());
 		match_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getEntityMockResourceAccess().getAttributesKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getEntityMockResourceAccess().getLeftParenthesisKeyword_3_1()), new TokenAlias(false, false, grammarAccess.getEntityMockResourceAccess().getRightParenthesisKeyword_3_3()));
+		match_EntityMock___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getEntityMockAccess().getLeftCurlyBracketKeyword_4_0()), new TokenAlias(false, false, grammarAccess.getEntityMockAccess().getRightCurlyBracketKeyword_4_2()));
 		match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()));
 		match_XBlockExpression_SemicolonKeyword_2_1_q = new TokenAlias(false, true, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
 		match_XExpressionInClosure_SemicolonKeyword_1_1_q = new TokenAlias(false, true, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
 		match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()), new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()));
-		match_XImportDeclaration_SemicolonKeyword_2_q = new TokenAlias(false, true, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+		match_XImportDeclaration_SemicolonKeyword_3_q = new TokenAlias(false, true, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
 		match_XParenthesizedExpression_LeftParenthesisKeyword_0_a = new TokenAlias(true, true, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
 		match_XParenthesizedExpression_LeftParenthesisKeyword_0_p = new TokenAlias(true, false, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
 	}
 	
 	@Override
 	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
-		if(ruleCall.getRule() == grammarAccess.getArrayBracketsRule())
+		if (ruleCall.getRule() == grammarAccess.getArrayBracketsRule())
 			return getArrayBracketsToken(semanticObject, ruleCall, node);
-		else if(ruleCall.getRule() == grammarAccess.getOpSingleAssignRule())
+		else if (ruleCall.getRule() == grammarAccess.getOpSingleAssignRule())
 			return getOpSingleAssignToken(semanticObject, ruleCall, node);
 		return "";
 	}
@@ -105,155 +109,310 @@
 		List<INode> transitionNodes = collectNodes(fromNode, toNode);
 		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
 			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
-			if(match_EntityMockEntityFunctionParameter_FullStopKeyword_1_1_0_q.equals(syntax))
-				emit_EntityMockEntityFunctionParameter_FullStopKeyword_1_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockObjectItemValue_CommaKeyword_3_1_q.equals(syntax))
+			if (match_EntityMockObjectItemValue_CommaKeyword_3_1_q.equals(syntax))
 				emit_EntityMockObjectItemValue_CommaKeyword_3_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockObjectPlainValue_CommaKeyword_3_1_q.equals(syntax))
+			else if (match_EntityMockObjectPlainValue_CommaKeyword_3_1_q.equals(syntax))
 				emit_EntityMockObjectPlainValue_CommaKeyword_3_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q.equals(syntax))
+			else if (match_EntityMockPackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q.equals(syntax))
+				emit_EntityMockPackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q.equals(syntax))
 				emit_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockResourceDataRow_CommaKeyword_2_1_1_q.equals(syntax))
+			else if (match_EntityMockResourceDataRow_CommaKeyword_2_1_1_q.equals(syntax))
 				emit_EntityMockResourceDataRow_CommaKeyword_2_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
+			else if (match_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q.equals(syntax))
 				emit_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockResource_CommaKeyword_3_2_1_q.equals(syntax))
+			else if (match_EntityMockResource_CommaKeyword_3_2_1_q.equals(syntax))
 				emit_EntityMockResource_CommaKeyword_3_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q.equals(syntax))
+			else if (match_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q.equals(syntax))
 				emit_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q.equals(syntax))
+			else if (match_EntityMock___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_2__q.equals(syntax))
+				emit_EntityMock___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q.equals(syntax))
 				emit_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XBlockExpression_SemicolonKeyword_2_1_q.equals(syntax))
+			else if (match_XBlockExpression_SemicolonKeyword_2_1_q.equals(syntax))
 				emit_XBlockExpression_SemicolonKeyword_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XExpressionInClosure_SemicolonKeyword_1_1_q.equals(syntax))
+			else if (match_XExpressionInClosure_SemicolonKeyword_1_1_q.equals(syntax))
 				emit_XExpressionInClosure_SemicolonKeyword_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q.equals(syntax))
+			else if (match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q.equals(syntax))
 				emit_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XImportDeclaration_SemicolonKeyword_2_q.equals(syntax))
-				emit_XImportDeclaration_SemicolonKeyword_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XParenthesizedExpression_LeftParenthesisKeyword_0_a.equals(syntax))
+			else if (match_XImportDeclaration_SemicolonKeyword_3_q.equals(syntax))
+				emit_XImportDeclaration_SemicolonKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_XParenthesizedExpression_LeftParenthesisKeyword_0_a.equals(syntax))
 				emit_XParenthesizedExpression_LeftParenthesisKeyword_0_a(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if(match_XParenthesizedExpression_LeftParenthesisKeyword_0_p.equals(syntax))
+			else if (match_XParenthesizedExpression_LeftParenthesisKeyword_0_p.equals(syntax))
 				emit_XParenthesizedExpression_LeftParenthesisKeyword_0_p(semanticObject, getLastNavigableState(), syntaxNodes);
 			else acceptNodes(getLastNavigableState(), syntaxNodes);
 		}
 	}
 
 	/**
-	 * Syntax:
-	 *     '.'?
-	 */
-	protected void emit_EntityMockEntityFunctionParameter_FullStopKeyword_1_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
-		acceptNodes(transition, nodes);
-	}
-	
-	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ','?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     values+=STRING (ambiguity) ')' (rule end)
+	 *     values+=STRING (ambiguity) values+=STRING
 	 */
 	protected void emit_EntityMockObjectItemValue_CommaKeyword_3_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ','?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     values+=STRING (ambiguity) ')' (rule end)
+	 *     values+=STRING (ambiguity) values+=STRING
 	 */
 	protected void emit_EntityMockObjectPlainValue_CommaKeyword_3_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
+	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=QualifiedName (ambiguity) (rule end)
+	 */
+	protected void emit_EntityMockPackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
 	 *     '.'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     embedded+=[EntityMockObjectEmbed|ID] (ambiguity) embedded+=[EntityMockObjectEmbed|ID]
+	 *     template=[EntityMockTemplate|ID] (ambiguity) embedded+=[EntityMockObjectEmbed|ID]
 	 */
 	protected void emit_EntityMockReferencedObjectAttribute_FullStopKeyword_2_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ','?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     values+=STRING (ambiguity) ')' (rule end)
+	 *     values+=STRING (ambiguity) values+=STRING
 	 */
 	protected void emit_EntityMockResourceDataRow_CommaKeyword_2_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ID (ambiguity) (rule end)
 	 */
 	protected void emit_EntityMockResourceDataRow___LeftParenthesisKeyword_2_0_RightParenthesisKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ','?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     attributes+=EntityMockResourceAttribute (ambiguity) ')' 'items' '{' '}' '}' (rule end)
+	 *     attributes+=EntityMockResourceAttribute (ambiguity) ')' 'items' '{' datarows+=EntityMockResourceDataRow
+	 *     attributes+=EntityMockResourceAttribute (ambiguity) attributes+=EntityMockResourceAttribute
 	 */
 	protected void emit_EntityMockResource_CommaKeyword_3_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('attributes' '(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ID '{' (ambiguity) 'items' '{' '}' '}' (rule end)
+	 *     name=ID '{' (ambiguity) 'items' '{' datarows+=EntityMockResourceDataRow
 	 */
 	protected void emit_EntityMockResource___AttributesKeyword_3_0_LeftParenthesisKeyword_3_1_RightParenthesisKeyword_3_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
+	 *     ('{' '}')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     descriptionValue=STRING (ambiguity) (rule end)
+	 *     name=ID (ambiguity) (rule end)
+	 */
+	protected void emit_EntityMock___LeftCurlyBracketKeyword_4_0_RightCurlyBracketKeyword_4_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     annotationType=[JvmAnnotationType|QualifiedName] (ambiguity) (rule end)
 	 */
 	protected void emit_XAnnotation___LeftParenthesisKeyword_3_0_RightParenthesisKeyword_3_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     expressions+=XExpressionOrVarDeclaration (ambiguity) '}' ')' (rule end)
+	 *     expressions+=XExpressionOrVarDeclaration (ambiguity) '}' (rule end)
+	 *     expressions+=XExpressionOrVarDeclaration (ambiguity) expressions+=XExpressionOrVarDeclaration
 	 */
 	protected void emit_XBlockExpression_SemicolonKeyword_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     expressions+=XExpressionOrVarDeclaration (ambiguity) (rule end)
+	 *     expressions+=XExpressionOrVarDeclaration (ambiguity) expressions+=XExpressionOrVarDeclaration
 	 */
 	protected void emit_XExpressionInClosure_SemicolonKeyword_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '=>' returnType=JvmTypeReference
 	 */
 	protected void emit_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     importedFullyQualifiedName=QualifiedName (ambiguity) (rule end)
+	 *     importedNamespace=QualifiedNameWithWildcard (ambiguity) (rule end)
+	 *     importedType=[JvmDeclaredType|QualifiedName] (ambiguity) (rule end)
+	 *     memberName=ValidID (ambiguity) (rule end)
+	 *     wildcard?='*' (ambiguity) (rule end)
 	 */
-	protected void emit_XImportDeclaration_SemicolonKeyword_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_XImportDeclaration_SemicolonKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     '('*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '#' '[' ']' (rule start)
+	 *     (rule start) (ambiguity) '#' '[' elements+=XExpression
+	 *     (rule start) (ambiguity) '#' '{' '}' (rule start)
+	 *     (rule start) (ambiguity) '#' '{' elements+=XExpression
+	 *     (rule start) (ambiguity) '<' typeArguments+=JvmArgumentTypeReference
+	 *     (rule start) (ambiguity) '[' declaredFormalParameters+=JvmFormalParameter
+	 *     (rule start) (ambiguity) '[' explicitSyntax?='|'
+	 *     (rule start) (ambiguity) '[' expression=XExpressionInClosure
+	 *     (rule start) (ambiguity) 'do' body=XExpression
+	 *     (rule start) (ambiguity) 'false' (rule start)
+	 *     (rule start) (ambiguity) 'for' '(' ';' ';' ')' eachExpression=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' ';' ';' updateExpressions+=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' ';' expression=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'for' '(' initExpressions+=XExpressionOrVarDeclaration
+	 *     (rule start) (ambiguity) 'if' '(' if=XExpression
+	 *     (rule start) (ambiguity) 'new' constructor=[JvmConstructor|QualifiedName]
+	 *     (rule start) (ambiguity) 'null' (rule start)
+	 *     (rule start) (ambiguity) 'return' (rule start)
+	 *     (rule start) (ambiguity) 'return' expression=XExpression
+	 *     (rule start) (ambiguity) 'switch' '(' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'switch' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'switch' switch=XExpression
+	 *     (rule start) (ambiguity) 'synchronized' '(' param=XExpression
+	 *     (rule start) (ambiguity) 'throw' expression=XExpression
+	 *     (rule start) (ambiguity) 'try' expression=XExpression
+	 *     (rule start) (ambiguity) 'typeof' '(' type=[JvmType|QualifiedName]
+	 *     (rule start) (ambiguity) 'while' '(' predicate=XExpression
+	 *     (rule start) (ambiguity) '{' '}' (rule start)
+	 *     (rule start) (ambiguity) '{' expressions+=XExpressionOrVarDeclaration
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|FeatureCallID]
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|IdOrSuper]
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|OpUnary]
+	 *     (rule start) (ambiguity) isTrue?='true'
+	 *     (rule start) (ambiguity) value=Number
+	 *     (rule start) (ambiguity) value=STRING
+	 *     (rule start) (ambiguity) {XAssignment.assignable=}
+	 *     (rule start) (ambiguity) {XBinaryOperation.leftOperand=}
+	 *     (rule start) (ambiguity) {XCastedExpression.target=}
+	 *     (rule start) (ambiguity) {XInstanceOfExpression.expression=}
+	 *     (rule start) (ambiguity) {XMemberFeatureCall.memberCallTarget=}
+	 *     (rule start) (ambiguity) {XPostfixOperation.operand=}
 	 */
 	protected void emit_XParenthesizedExpression_LeftParenthesisKeyword_0_a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
 	/**
-	 * Syntax:
+	 * Ambiguous syntax:
 	 *     '('+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '#' '[' ']' ')' (rule start)
+	 *     (rule start) (ambiguity) '#' '[' elements+=XExpression
+	 *     (rule start) (ambiguity) '#' '{' '}' ')' (rule start)
+	 *     (rule start) (ambiguity) '#' '{' elements+=XExpression
+	 *     (rule start) (ambiguity) '<' typeArguments+=JvmArgumentTypeReference
+	 *     (rule start) (ambiguity) '[' declaredFormalParameters+=JvmFormalParameter
+	 *     (rule start) (ambiguity) '[' explicitSyntax?='|'
+	 *     (rule start) (ambiguity) '[' expression=XExpressionInClosure
+	 *     (rule start) (ambiguity) 'do' body=XExpression
+	 *     (rule start) (ambiguity) 'false' ')' (rule start)
+	 *     (rule start) (ambiguity) 'for' '(' ';' ';' ')' eachExpression=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' ';' ';' updateExpressions+=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' ';' expression=XExpression
+	 *     (rule start) (ambiguity) 'for' '(' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'for' '(' initExpressions+=XExpressionOrVarDeclaration
+	 *     (rule start) (ambiguity) 'if' '(' if=XExpression
+	 *     (rule start) (ambiguity) 'new' constructor=[JvmConstructor|QualifiedName]
+	 *     (rule start) (ambiguity) 'null' ')' (rule start)
+	 *     (rule start) (ambiguity) 'return' ')' (rule start)
+	 *     (rule start) (ambiguity) 'return' expression=XExpression
+	 *     (rule start) (ambiguity) 'switch' '(' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'switch' declaredParam=JvmFormalParameter
+	 *     (rule start) (ambiguity) 'switch' switch=XExpression
+	 *     (rule start) (ambiguity) 'synchronized' '(' param=XExpression
+	 *     (rule start) (ambiguity) 'throw' expression=XExpression
+	 *     (rule start) (ambiguity) 'try' expression=XExpression
+	 *     (rule start) (ambiguity) 'typeof' '(' type=[JvmType|QualifiedName]
+	 *     (rule start) (ambiguity) 'while' '(' predicate=XExpression
+	 *     (rule start) (ambiguity) '{' '}' ')' (rule start)
+	 *     (rule start) (ambiguity) '{' expressions+=XExpressionOrVarDeclaration
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|FeatureCallID]
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|IdOrSuper]
+	 *     (rule start) (ambiguity) feature=[JvmIdentifiableElement|OpUnary]
+	 *     (rule start) (ambiguity) isTrue?='true'
+	 *     (rule start) (ambiguity) value=Number
+	 *     (rule start) (ambiguity) value=STRING
+	 *     (rule start) (ambiguity) {XAssignment.assignable=}
+	 *     (rule start) (ambiguity) {XBinaryOperation.leftOperand=}
+	 *     (rule start) (ambiguity) {XCastedExpression.target=}
+	 *     (rule start) (ambiguity) {XInstanceOfExpression.expression=}
+	 *     (rule start) (ambiguity) {XMemberFeatureCall.memberCallTarget=}
+	 *     (rule start) (ambiguity) {XPostfixOperation.operand=}
 	 */
 	protected void emit_XParenthesizedExpression_LeftParenthesisKeyword_0_p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/services/EntityMockDSLGrammarAccess.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/services/EntityMockDSLGrammarAccess.java
index dff1055..987ef9a 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/services/EntityMockDSLGrammarAccess.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/services/EntityMockDSLGrammarAccess.java
@@ -10,19 +10,33 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.services;
 
-import com.google.inject.Singleton;
 import com.google.inject.Inject;
-
+import com.google.inject.Singleton;
 import java.util.List;
-
-import org.eclipse.xtext.*;
+import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.EnumLiteralDeclaration;
+import org.eclipse.xtext.EnumRule;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.UnorderedGroup;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractEnumRuleElementFinder;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
 import org.eclipse.xtext.service.GrammarProvider;
-import org.eclipse.xtext.service.AbstractElementFinder.*;
-
 import org.eclipse.xtext.xbase.annotations.services.XbaseWithAnnotationsGrammarAccess;
 import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
 import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;
@@ -30,177 +44,202 @@
 @Singleton
 public class EntityMockDSLGrammarAccess extends AbstractGrammarElementFinder {
 	
-	
 	public class EntityMockModelElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockModel");
-		private final Assignment cPackagesAssignment = (Assignment)rule.eContents().get(1);
-		private final RuleCall cPackagesEntityMockPackageParserRuleCall_0 = (RuleCall)cPackagesAssignment.eContents().get(0);
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockModel");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
+		private final Assignment cPackagesAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cPackagesEntityMockPackageParserRuleCall_1_0 = (RuleCall)cPackagesAssignment_1.eContents().get(0);
 		
 		//EntityMockModel:
+		//	importSection=XImportSection?
 		//	packages+=EntityMockPackage*;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
+		//importSection=XImportSection? packages+=EntityMockPackage*
+		public Group getGroup() { return cGroup; }
+		
+		//importSection=XImportSection?
+		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
+		
+		//XImportSection
+		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
+		
 		//packages+=EntityMockPackage*
-		public Assignment getPackagesAssignment() { return cPackagesAssignment; }
-
+		public Assignment getPackagesAssignment_1() { return cPackagesAssignment_1; }
+		
 		//EntityMockPackage
-		public RuleCall getPackagesEntityMockPackageParserRuleCall_0() { return cPackagesEntityMockPackageParserRuleCall_0; }
+		public RuleCall getPackagesEntityMockPackageParserRuleCall_1_0() { return cPackagesEntityMockPackageParserRuleCall_1_0; }
 	}
-
 	public class EntityMockPackageElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockPackage");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockPackage");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cMockEntitymodelForKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Assignment cImportsAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cImportsEntityModelImportParserRuleCall_1_0 = (RuleCall)cImportsAssignment_1.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Action cEntityMockPackageAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cPackageKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
-		private final Keyword cRunWithPriorityKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
-		private final Assignment cRunPriorityAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cRunPriorityINTTerminalRuleCall_3_1_0 = (RuleCall)cRunPriorityAssignment_3_1.eContents().get(0);
-		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
-		private final Keyword cImportKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
-		private final Assignment cImportsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
-		private final RuleCall cImportsEntityModelImportParserRuleCall_4_1_0 = (RuleCall)cImportsAssignment_4_1.eContents().get(0);
-		private final Assignment cDatainterchangesAssignment_5 = (Assignment)cGroup.eContents().get(5);
-		private final RuleCall cDatainterchangesRunningDataInterchangesParserRuleCall_5_0 = (RuleCall)cDatainterchangesAssignment_5.eContents().get(0);
-		private final Assignment cResourcesAssignment_6 = (Assignment)cGroup.eContents().get(6);
-		private final RuleCall cResourcesEntityMockResourcesParserRuleCall_6_0 = (RuleCall)cResourcesAssignment_6.eContents().get(0);
-		private final Assignment cObjectsAssignment_7 = (Assignment)cGroup.eContents().get(7);
-		private final RuleCall cObjectsEntityMockObjectsParserRuleCall_7_0 = (RuleCall)cObjectsAssignment_7.eContents().get(0);
-		private final Assignment cDatatypesAssignment_8 = (Assignment)cGroup.eContents().get(8);
-		private final RuleCall cDatatypesEntityMockDataTypesParserRuleCall_8_0 = (RuleCall)cDatatypesAssignment_8.eContents().get(0);
-		private final Assignment cEntitiesAssignment_9 = (Assignment)cGroup.eContents().get(9);
-		private final RuleCall cEntitiesEntityMockEntitiesParserRuleCall_9_0 = (RuleCall)cEntitiesAssignment_9.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
+		private final Keyword cLeftCurlyBracketKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cMocksAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cMocksEntityMockParserRuleCall_3_1_0 = (RuleCall)cMocksAssignment_3_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
 		
 		//EntityMockPackage:
-		//	"mock entitymodel for" imports+=EntityModelImport "{" ("run with priority" runPriority=INT)? ("import"
-		//	imports+=EntityModelImport)* datainterchanges=RunningDataInterchanges? resources=EntityMockResources?
-		//	objects=EntityMockObjects? datatypes=EntityMockDataTypes? entities=EntityMockEntities "}";
-		public ParserRule getRule() { return rule; }
-
-		//"mock entitymodel for" imports+=EntityModelImport "{" ("run with priority" runPriority=INT)? ("import"
-		//imports+=EntityModelImport)* datainterchanges=RunningDataInterchanges? resources=EntityMockResources?
-		//objects=EntityMockObjects? datatypes=EntityMockDataTypes? entities=EntityMockEntities "}"
-		public Group getGroup() { return cGroup; }
-
-		//"mock entitymodel for"
-		public Keyword getMockEntitymodelForKeyword_0() { return cMockEntitymodelForKeyword_0; }
-
-		//imports+=EntityModelImport
-		public Assignment getImportsAssignment_1() { return cImportsAssignment_1; }
-
-		//EntityModelImport
-		public RuleCall getImportsEntityModelImportParserRuleCall_1_0() { return cImportsEntityModelImportParserRuleCall_1_0; }
-
-		//"{"
-		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//("run with priority" runPriority=INT)?
-		public Group getGroup_3() { return cGroup_3; }
-
-		//"run with priority"
-		public Keyword getRunWithPriorityKeyword_3_0() { return cRunWithPriorityKeyword_3_0; }
-
-		//runPriority=INT
-		public Assignment getRunPriorityAssignment_3_1() { return cRunPriorityAssignment_3_1; }
-
-		//INT
-		public RuleCall getRunPriorityINTTerminalRuleCall_3_1_0() { return cRunPriorityINTTerminalRuleCall_3_1_0; }
-
-		//("import" imports+=EntityModelImport)*
-		public Group getGroup_4() { return cGroup_4; }
-
-		//"import"
-		public Keyword getImportKeyword_4_0() { return cImportKeyword_4_0; }
-
-		//imports+=EntityModelImport
-		public Assignment getImportsAssignment_4_1() { return cImportsAssignment_4_1; }
-
-		//EntityModelImport
-		public RuleCall getImportsEntityModelImportParserRuleCall_4_1_0() { return cImportsEntityModelImportParserRuleCall_4_1_0; }
-
-		//datainterchanges=RunningDataInterchanges?
-		public Assignment getDatainterchangesAssignment_5() { return cDatainterchangesAssignment_5; }
-
-		//RunningDataInterchanges
-		public RuleCall getDatainterchangesRunningDataInterchangesParserRuleCall_5_0() { return cDatainterchangesRunningDataInterchangesParserRuleCall_5_0; }
-
-		//resources=EntityMockResources?
-		public Assignment getResourcesAssignment_6() { return cResourcesAssignment_6; }
-
-		//EntityMockResources
-		public RuleCall getResourcesEntityMockResourcesParserRuleCall_6_0() { return cResourcesEntityMockResourcesParserRuleCall_6_0; }
-
-		//objects=EntityMockObjects?
-		public Assignment getObjectsAssignment_7() { return cObjectsAssignment_7; }
-
-		//EntityMockObjects
-		public RuleCall getObjectsEntityMockObjectsParserRuleCall_7_0() { return cObjectsEntityMockObjectsParserRuleCall_7_0; }
-
-		//datatypes=EntityMockDataTypes?
-		public Assignment getDatatypesAssignment_8() { return cDatatypesAssignment_8; }
-
-		//EntityMockDataTypes
-		public RuleCall getDatatypesEntityMockDataTypesParserRuleCall_8_0() { return cDatatypesEntityMockDataTypesParserRuleCall_8_0; }
-
-		//entities=EntityMockEntities
-		public Assignment getEntitiesAssignment_9() { return cEntitiesAssignment_9; }
-
-		//EntityMockEntities
-		public RuleCall getEntitiesEntityMockEntitiesParserRuleCall_9_0() { return cEntitiesEntityMockEntitiesParserRuleCall_9_0; }
-
-		//"}"
-		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
-	}
-
-	public class EntityModelImportElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityModelImport");
-		private final Assignment cImportedNamespaceAssignment = (Assignment)rule.eContents().get(1);
-		private final RuleCall cImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0 = (RuleCall)cImportedNamespaceAssignment.eContents().get(0);
+		//	{EntityMockPackage} 'package' name=QualifiedName ('{'
+		//	mocks+=EntityMock* '}')?;
+		@Override public ParserRule getRule() { return rule; }
 		
-		//EntityModelImport returns types::LImport:
-		//	importedNamespace=EntityMockQualifiedNameWithWildCard;
-		public ParserRule getRule() { return rule; }
-
-		//importedNamespace=EntityMockQualifiedNameWithWildCard
-		public Assignment getImportedNamespaceAssignment() { return cImportedNamespaceAssignment; }
-
-		//EntityMockQualifiedNameWithWildCard
-		public RuleCall getImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0() { return cImportedNamespaceEntityMockQualifiedNameWithWildCardParserRuleCall_0; }
-	}
-
-	public class EntityMockQualifiedNameWithWildCardElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockQualifiedNameWithWildCard");
-		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final RuleCall cQualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
-		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
-		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
-		private final Keyword cAsteriskKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
-		
-		//EntityMockQualifiedNameWithWildCard:
-		//	QualifiedName ("." "*")?;
-		public ParserRule getRule() { return rule; }
-
-		//QualifiedName ("." "*")?
+		//{EntityMockPackage} 'package' name=QualifiedName ('{' mocks+=EntityMock* '}')?
 		public Group getGroup() { return cGroup; }
-
+		
+		//{EntityMockPackage}
+		public Action getEntityMockPackageAction_0() { return cEntityMockPackageAction_0; }
+		
+		//'package'
+		public Keyword getPackageKeyword_1() { return cPackageKeyword_1; }
+		
+		//name=QualifiedName
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
 		//QualifiedName
-		public RuleCall getQualifiedNameParserRuleCall_0() { return cQualifiedNameParserRuleCall_0; }
-
-		//("." "*")?
-		public Group getGroup_1() { return cGroup_1; }
-
-		//"."
-		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
-		//"*"
-		public Keyword getAsteriskKeyword_1_1() { return cAsteriskKeyword_1_1; }
+		public RuleCall getNameQualifiedNameParserRuleCall_2_0() { return cNameQualifiedNameParserRuleCall_2_0; }
+		
+		//('{' mocks+=EntityMock* '}')?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
+		
+		//mocks+=EntityMock*
+		public Assignment getMocksAssignment_3_1() { return cMocksAssignment_3_1; }
+		
+		//EntityMock
+		public RuleCall getMocksEntityMockParserRuleCall_3_1_0() { return cMocksEntityMockParserRuleCall_3_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_2() { return cRightCurlyBracketKeyword_3_2; }
 	}
-
+	public class EntityMockElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMock");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cEntityMockAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cMockKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Assignment cDescriptionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
+		private final Keyword cDescriptionDescribedByKeyword_3_0_0 = (Keyword)cDescriptionAssignment_3_0.eContents().get(0);
+		private final Assignment cDescriptionValueAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cDescriptionValueSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cDescriptionValueAssignment_3_1.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
+		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
+		private final Keyword cPriorityKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
+		private final Assignment cRunPriorityAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
+		private final RuleCall cRunPriorityINTTerminalRuleCall_4_1_0_1_0 = (RuleCall)cRunPriorityAssignment_4_1_0_1.eContents().get(0);
+		private final Assignment cDatainterchangesAssignment_4_1_1 = (Assignment)cUnorderedGroup_4_1.eContents().get(1);
+		private final RuleCall cDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0 = (RuleCall)cDatainterchangesAssignment_4_1_1.eContents().get(0);
+		private final Assignment cResourcesAssignment_4_1_2 = (Assignment)cUnorderedGroup_4_1.eContents().get(2);
+		private final RuleCall cResourcesEntityMockResourcesParserRuleCall_4_1_2_0 = (RuleCall)cResourcesAssignment_4_1_2.eContents().get(0);
+		private final Assignment cObjectsAssignment_4_1_3 = (Assignment)cUnorderedGroup_4_1.eContents().get(3);
+		private final RuleCall cObjectsEntityMockObjectsParserRuleCall_4_1_3_0 = (RuleCall)cObjectsAssignment_4_1_3.eContents().get(0);
+		private final Assignment cEntitiesAssignment_4_1_4 = (Assignment)cUnorderedGroup_4_1.eContents().get(4);
+		private final RuleCall cEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0 = (RuleCall)cEntitiesAssignment_4_1_4.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
+		
+		//EntityMock:
+		//	{EntityMock} 'mock' name=ID (description?='describedBy' descriptionValue=STRING)? ('{' (('priority' runPriority=INT)?
+		//	& datainterchanges=RunningDataInterchanges? & resources=EntityMockResources? & objects=EntityMockObjects? &
+		//	entities=EntityMockEntities)
+		//	'}')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMock} 'mock' name=ID (description?='describedBy' descriptionValue=STRING)? ('{' (('priority' runPriority=INT)? &
+		//datainterchanges=RunningDataInterchanges? & resources=EntityMockResources? & objects=EntityMockObjects? &
+		//entities=EntityMockEntities) '}')?
+		public Group getGroup() { return cGroup; }
+		
+		//{EntityMock}
+		public Action getEntityMockAction_0() { return cEntityMockAction_0; }
+		
+		//'mock'
+		public Keyword getMockKeyword_1() { return cMockKeyword_1; }
+		
+		//name=ID
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
+		
+		//(description?='describedBy' descriptionValue=STRING)?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//description?='describedBy'
+		public Assignment getDescriptionAssignment_3_0() { return cDescriptionAssignment_3_0; }
+		
+		//'describedBy'
+		public Keyword getDescriptionDescribedByKeyword_3_0_0() { return cDescriptionDescribedByKeyword_3_0_0; }
+		
+		//descriptionValue=STRING
+		public Assignment getDescriptionValueAssignment_3_1() { return cDescriptionValueAssignment_3_1; }
+		
+		//STRING
+		public RuleCall getDescriptionValueSTRINGTerminalRuleCall_3_1_0() { return cDescriptionValueSTRINGTerminalRuleCall_3_1_0; }
+		
+		//('{' (('priority' runPriority=INT)? & datainterchanges=RunningDataInterchanges? & resources=EntityMockResources? &
+		//objects=EntityMockObjects? & entities=EntityMockEntities) '}')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
+		
+		//('priority' runPriority=INT)? & datainterchanges=RunningDataInterchanges? & resources=EntityMockResources? &
+		//objects=EntityMockObjects? & entities=EntityMockEntities
+		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
+		
+		//('priority' runPriority=INT)?
+		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
+		
+		//'priority'
+		public Keyword getPriorityKeyword_4_1_0_0() { return cPriorityKeyword_4_1_0_0; }
+		
+		//runPriority=INT
+		public Assignment getRunPriorityAssignment_4_1_0_1() { return cRunPriorityAssignment_4_1_0_1; }
+		
+		//INT
+		public RuleCall getRunPriorityINTTerminalRuleCall_4_1_0_1_0() { return cRunPriorityINTTerminalRuleCall_4_1_0_1_0; }
+		
+		//datainterchanges=RunningDataInterchanges?
+		public Assignment getDatainterchangesAssignment_4_1_1() { return cDatainterchangesAssignment_4_1_1; }
+		
+		//RunningDataInterchanges
+		public RuleCall getDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0() { return cDatainterchangesRunningDataInterchangesParserRuleCall_4_1_1_0; }
+		
+		//resources=EntityMockResources?
+		public Assignment getResourcesAssignment_4_1_2() { return cResourcesAssignment_4_1_2; }
+		
+		//EntityMockResources
+		public RuleCall getResourcesEntityMockResourcesParserRuleCall_4_1_2_0() { return cResourcesEntityMockResourcesParserRuleCall_4_1_2_0; }
+		
+		//objects=EntityMockObjects?
+		public Assignment getObjectsAssignment_4_1_3() { return cObjectsAssignment_4_1_3; }
+		
+		//EntityMockObjects
+		public RuleCall getObjectsEntityMockObjectsParserRuleCall_4_1_3_0() { return cObjectsEntityMockObjectsParserRuleCall_4_1_3_0; }
+		
+		//entities=EntityMockEntities
+		public Assignment getEntitiesAssignment_4_1_4() { return cEntitiesAssignment_4_1_4; }
+		
+		//EntityMockEntities
+		public RuleCall getEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0() { return cEntitiesEntityMockEntitiesParserRuleCall_4_1_4_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
+	}
 	public class RunningDataInterchangesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RunningDataInterchanges");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchanges");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cRunningDataInterchangesAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDatainterchangesKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -210,79 +249,78 @@
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//RunningDataInterchanges:
-		//	{RunningDataInterchanges} "datainterchanges" "{" datainterchanges+=RunningDataInterchange* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{RunningDataInterchanges} "datainterchanges" "{" datainterchanges+=RunningDataInterchange* "}"
+		//	{RunningDataInterchanges} 'datainterchanges' '{'
+		//	datainterchanges+=RunningDataInterchange*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{RunningDataInterchanges} 'datainterchanges' '{' datainterchanges+=RunningDataInterchange* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{RunningDataInterchanges}
 		public Action getRunningDataInterchangesAction_0() { return cRunningDataInterchangesAction_0; }
-
-		//"datainterchanges"
+		
+		//'datainterchanges'
 		public Keyword getDatainterchangesKeyword_1() { return cDatainterchangesKeyword_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//datainterchanges+=RunningDataInterchange*
 		public Assignment getDatainterchangesAssignment_3() { return cDatainterchangesAssignment_3; }
-
+		
 		//RunningDataInterchange
 		public RuleCall getDatainterchangesRunningDataInterchangeParserRuleCall_3_0() { return cDatainterchangesRunningDataInterchangeParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class RunningDataInterchangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "RunningDataInterchange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.RunningDataInterchange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cRunningDataInterchangeAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cDatainterchangeImportKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cDatainterchangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cDatainterchangeRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final CrossReference cDatainterchangeRefDataInterchangeCrossReference_2_0 = (CrossReference)cDatainterchangeRefAssignment_2.eContents().get(0);
 		private final RuleCall cDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1 = (RuleCall)cDatainterchangeRefDataInterchangeCrossReference_2_0.eContents().get(1);
-		private final Keyword cFromFileKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cFileKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		private final Assignment cFileURLAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final RuleCall cFileURLSTRINGTerminalRuleCall_4_0 = (RuleCall)cFileURLAssignment_4.eContents().get(0);
 		
 		//RunningDataInterchange:
-		//	{RunningDataInterchange} "datainterchange import" datainterchangeRef=[datainterchange::DataInterchange] "from file"
+		//	{RunningDataInterchange} 'datainterchange' datainterchangeRef=[datainterchange::DataInterchange] 'file'
 		//	fileURL=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//{RunningDataInterchange} "datainterchange import" datainterchangeRef=[datainterchange::DataInterchange] "from file"
-		//fileURL=STRING
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{RunningDataInterchange} 'datainterchange' datainterchangeRef=[datainterchange::DataInterchange] 'file' fileURL=STRING
 		public Group getGroup() { return cGroup; }
-
+		
 		//{RunningDataInterchange}
 		public Action getRunningDataInterchangeAction_0() { return cRunningDataInterchangeAction_0; }
-
-		//"datainterchange import"
-		public Keyword getDatainterchangeImportKeyword_1() { return cDatainterchangeImportKeyword_1; }
-
+		
+		//'datainterchange'
+		public Keyword getDatainterchangeKeyword_1() { return cDatainterchangeKeyword_1; }
+		
 		//datainterchangeRef=[datainterchange::DataInterchange]
 		public Assignment getDatainterchangeRefAssignment_2() { return cDatainterchangeRefAssignment_2; }
-
+		
 		//[datainterchange::DataInterchange]
 		public CrossReference getDatainterchangeRefDataInterchangeCrossReference_2_0() { return cDatainterchangeRefDataInterchangeCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1() { return cDatainterchangeRefDataInterchangeIDTerminalRuleCall_2_0_1; }
-
-		//"from file"
-		public Keyword getFromFileKeyword_3() { return cFromFileKeyword_3; }
-
+		
+		//'file'
+		public Keyword getFileKeyword_3() { return cFileKeyword_3; }
+		
 		//fileURL=STRING
 		public Assignment getFileURLAssignment_4() { return cFileURLAssignment_4; }
-
+		
 		//STRING
 		public RuleCall getFileURLSTRINGTerminalRuleCall_4_0() { return cFileURLSTRINGTerminalRuleCall_4_0; }
 	}
-
 	public class EntityMockResourcesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockResources");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResources");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockResourcesAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cResourcesKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -292,37 +330,38 @@
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//EntityMockResources:
-		//	{EntityMockResources} "resources" "{" resources+=EntityMockResource* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockResources} "resources" "{" resources+=EntityMockResource* "}"
+		//	{EntityMockResources} 'resources' '{'
+		//	resources+=EntityMockResource*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockResources} 'resources' '{' resources+=EntityMockResource* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockResources}
 		public Action getEntityMockResourcesAction_0() { return cEntityMockResourcesAction_0; }
-
-		//"resources"
+		
+		//'resources'
 		public Keyword getResourcesKeyword_1() { return cResourcesKeyword_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//resources+=EntityMockResource*
 		public Assignment getResourcesAssignment_3() { return cResourcesAssignment_3; }
-
+		
 		//EntityMockResource
 		public RuleCall getResourcesEntityMockResourceParserRuleCall_3_0() { return cResourcesEntityMockResourceParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class EntityMockResourceElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockResource");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResource");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cResourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
 		private final Keyword cAttributesKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
@@ -340,99 +379,98 @@
 		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
 		
 		//EntityMockResource:
-		//	"resource" name=QualifiedName "{" ("attributes" "(" (attributes+=EntityMockResourceAttribute ","?)* ")")? "items" "{"
-		//	datarows+=EntityMockResourceDataRow* "}" "}";
-		public ParserRule getRule() { return rule; }
-
-		//"resource" name=QualifiedName "{" ("attributes" "(" (attributes+=EntityMockResourceAttribute ","?)* ")")? "items" "{"
-		//datarows+=EntityMockResourceDataRow* "}" "}"
+		//	'resource' name=ID '{' ('attributes' '(' (attributes+=EntityMockResourceAttribute ','?)* ')')?
+		//	'items' '{' datarows+=EntityMockResourceDataRow* '}'
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'resource' name=ID '{' ('attributes' '(' (attributes+=EntityMockResourceAttribute ','?)* ')')? 'items' '{'
+		//datarows+=EntityMockResourceDataRow* '}' '}'
 		public Group getGroup() { return cGroup; }
-
-		//"resource"
+		
+		//'resource'
 		public Keyword getResourceKeyword_0() { return cResourceKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"{"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//("attributes" "(" (attributes+=EntityMockResourceAttribute ","?)* ")")?
+		
+		//('attributes' '(' (attributes+=EntityMockResourceAttribute ','?)* ')')?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"attributes"
+		
+		//'attributes'
 		public Keyword getAttributesKeyword_3_0() { return cAttributesKeyword_3_0; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3_1() { return cLeftParenthesisKeyword_3_1; }
-
-		//(attributes+=EntityMockResourceAttribute ","?)*
+		
+		//(attributes+=EntityMockResourceAttribute ','?)*
 		public Group getGroup_3_2() { return cGroup_3_2; }
-
+		
 		//attributes+=EntityMockResourceAttribute
 		public Assignment getAttributesAssignment_3_2_0() { return cAttributesAssignment_3_2_0; }
-
+		
 		//EntityMockResourceAttribute
 		public RuleCall getAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0() { return cAttributesEntityMockResourceAttributeParserRuleCall_3_2_0_0; }
-
-		//","?
+		
+		//','?
 		public Keyword getCommaKeyword_3_2_1() { return cCommaKeyword_3_2_1; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3_3() { return cRightParenthesisKeyword_3_3; }
-
-		//"items"
+		
+		//'items'
 		public Keyword getItemsKeyword_4() { return cItemsKeyword_4; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
-
+		
 		//datarows+=EntityMockResourceDataRow*
 		public Assignment getDatarowsAssignment_6() { return cDatarowsAssignment_6; }
-
+		
 		//EntityMockResourceDataRow
 		public RuleCall getDatarowsEntityMockResourceDataRowParserRuleCall_6_0() { return cDatarowsEntityMockResourceDataRowParserRuleCall_6_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
 	}
-
 	public class EntityMockResourceAttributeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockResourceAttribute");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceAttribute");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockResourceAttributeAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		
 		//EntityMockResourceAttribute:
-		//	{EntityMockResourceAttribute} name=QualifiedName;
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockResourceAttribute} name=QualifiedName
+		//	{EntityMockResourceAttribute} name=ID;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockResourceAttribute} name=ID
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockResourceAttribute}
 		public Action getEntityMockResourceAttributeAction_0() { return cEntityMockResourceAttributeAction_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
 	}
-
 	public class EntityMockResourceDataRowElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockResourceDataRow");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockResourceDataRow");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockResourceDataRowAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
 		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
 		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
@@ -442,45 +480,44 @@
 		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
 		
 		//EntityMockResourceDataRow:
-		//	{EntityMockResourceDataRow} name=QualifiedName ("(" (values+=STRING ","?)* ")")?;
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockResourceDataRow} name=QualifiedName ("(" (values+=STRING ","?)* ")")?
+		//	{EntityMockResourceDataRow} name=ID ('(' (values+=STRING ','?)* ')')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockResourceDataRow} name=ID ('(' (values+=STRING ','?)* ')')?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockResourceDataRow}
 		public Action getEntityMockResourceDataRowAction_0() { return cEntityMockResourceDataRowAction_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//("(" (values+=STRING ","?)* ")")?
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//('(' (values+=STRING ','?)* ')')?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
-
-		//(values+=STRING ","?)*
+		
+		//(values+=STRING ','?)*
 		public Group getGroup_2_1() { return cGroup_2_1; }
-
+		
 		//values+=STRING
 		public Assignment getValuesAssignment_2_1_0() { return cValuesAssignment_2_1_0; }
-
+		
 		//STRING
 		public RuleCall getValuesSTRINGTerminalRuleCall_2_1_0_0() { return cValuesSTRINGTerminalRuleCall_2_1_0_0; }
-
-		//","?
+		
+		//','?
 		public Keyword getCommaKeyword_2_1_1() { return cCommaKeyword_2_1_1; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
 	}
-
 	public class EntityMockObjectsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjects");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjects");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockObjectsAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cObjectsKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -490,37 +527,38 @@
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//EntityMockObjects:
-		//	{EntityMockObjects} "objects" "{" objects+=EntityMockObject* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockObjects} "objects" "{" objects+=EntityMockObject* "}"
+		//	{EntityMockObjects} 'objects' '{'
+		//	objects+=EntityMockObject*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockObjects} 'objects' '{' objects+=EntityMockObject* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockObjects}
 		public Action getEntityMockObjectsAction_0() { return cEntityMockObjectsAction_0; }
-
-		//"objects"
+		
+		//'objects'
 		public Keyword getObjectsKeyword_1() { return cObjectsKeyword_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//objects+=EntityMockObject*
 		public Assignment getObjectsAssignment_3() { return cObjectsAssignment_3; }
-
+		
 		//EntityMockObject
 		public RuleCall getObjectsEntityMockObjectParserRuleCall_3_0() { return cObjectsEntityMockObjectParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class EntityMockObjectElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObject");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObject");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cObjectKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cEnumerationsAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cEnumerationsEntityMockObjectEnumParserRuleCall_3_0 = (RuleCall)cEnumerationsAssignment_3.eContents().get(0);
@@ -531,126 +569,91 @@
 		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
 		
 		//EntityMockObject:
-		//	"object" name=QualifiedName "{" enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute*
-		//	calculations+=EntityMockObjectFunction* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"object" name=QualifiedName "{" enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute*
-		//calculations+=EntityMockObjectFunction* "}"
+		//	'object' name=ID '{'
+		//	enumerations+=EntityMockObjectEnum*
+		//	attributes+=IEntityMockObjectAttribute*
+		//	calculations+=EntityMockObjectFunction*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'object' name=ID '{' enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute*
+		//calculations+=EntityMockObjectFunction* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"object"
+		
+		//'object'
 		public Keyword getObjectKeyword_0() { return cObjectKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"{"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//enumerations+=EntityMockObjectEnum*
 		public Assignment getEnumerationsAssignment_3() { return cEnumerationsAssignment_3; }
-
+		
 		//EntityMockObjectEnum
 		public RuleCall getEnumerationsEntityMockObjectEnumParserRuleCall_3_0() { return cEnumerationsEntityMockObjectEnumParserRuleCall_3_0; }
-
+		
 		//attributes+=IEntityMockObjectAttribute*
 		public Assignment getAttributesAssignment_4() { return cAttributesAssignment_4; }
-
+		
 		//IEntityMockObjectAttribute
 		public RuleCall getAttributesIEntityMockObjectAttributeParserRuleCall_4_0() { return cAttributesIEntityMockObjectAttributeParserRuleCall_4_0; }
-
+		
 		//calculations+=EntityMockObjectFunction*
 		public Assignment getCalculationsAssignment_5() { return cCalculationsAssignment_5; }
-
+		
 		//EntityMockObjectFunction
 		public RuleCall getCalculationsEntityMockObjectFunctionParserRuleCall_5_0() { return cCalculationsEntityMockObjectFunctionParserRuleCall_5_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
 	}
-
 	public class EntityMockObjectEnumElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectEnum");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectEnum");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cByEnumKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cUsingResourceAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final CrossReference cUsingResourceLEnumCrossReference_3_0 = (CrossReference)cUsingResourceAssignment_3.eContents().get(0);
 		private final RuleCall cUsingResourceLEnumIDTerminalRuleCall_3_0_1 = (RuleCall)cUsingResourceLEnumCrossReference_3_0.eContents().get(1);
 		
 		//EntityMockObjectEnum:
-		//	"var" name=QualifiedName "by enum" usingResource=[types::LEnum];
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "by enum" usingResource=[types::LEnum]
+		//	'var' name=ID 'byEnum' usingResource=[types::LEnum];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID 'byEnum' usingResource=[types::LEnum]
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"by enum"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'byEnum'
 		public Keyword getByEnumKeyword_2() { return cByEnumKeyword_2; }
-
+		
 		//usingResource=[types::LEnum]
 		public Assignment getUsingResourceAssignment_3() { return cUsingResourceAssignment_3; }
-
+		
 		//[types::LEnum]
 		public CrossReference getUsingResourceLEnumCrossReference_3_0() { return cUsingResourceLEnumCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getUsingResourceLEnumIDTerminalRuleCall_3_0_1() { return cUsingResourceLEnumIDTerminalRuleCall_3_0_1; }
 	}
-
-	public class EntityMockDataTypesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockDataTypes");
-		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Action cEntityMockDataTypesAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cDatatypesKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		private final Assignment cDatatypesAssignment_3 = (Assignment)cGroup.eContents().get(3);
-		private final RuleCall cDatatypesEntityMockDataTypeParserRuleCall_3_0 = (RuleCall)cDatatypesAssignment_3.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
-		
-		//EntityMockDataTypes:
-		//	{EntityMockDataTypes} "datatypes" "{" datatypes+=EntityMockDataType* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockDataTypes} "datatypes" "{" datatypes+=EntityMockDataType* "}"
-		public Group getGroup() { return cGroup; }
-
-		//{EntityMockDataTypes}
-		public Action getEntityMockDataTypesAction_0() { return cEntityMockDataTypesAction_0; }
-
-		//"datatypes"
-		public Keyword getDatatypesKeyword_1() { return cDatatypesKeyword_1; }
-
-		//"{"
-		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//datatypes+=EntityMockDataType*
-		public Assignment getDatatypesAssignment_3() { return cDatatypesAssignment_3; }
-
-		//EntityMockDataType
-		public RuleCall getDatatypesEntityMockDataTypeParserRuleCall_3_0() { return cDatatypesEntityMockDataTypeParserRuleCall_3_0; }
-
-		//"}"
-		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
-	}
-
 	public class IEntityMockObjectUsableElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IEntityMockObjectUsable");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockObjectUsable");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cEntityMockObjectFunctionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cEntityMockObjectEnumParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -662,33 +665,32 @@
 		//IEntityMockObjectUsable:
 		//	EntityMockObjectFunction | EntityMockObjectEnum | EntityMockObjectPlainValue | EntityMockObjectArrayValue |
 		//	EntityMockObjectEmbed | EntityMockObjectFill;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//EntityMockObjectFunction | EntityMockObjectEnum | EntityMockObjectPlainValue | EntityMockObjectArrayValue |
 		//EntityMockObjectEmbed | EntityMockObjectFill
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//EntityMockObjectFunction
 		public RuleCall getEntityMockObjectFunctionParserRuleCall_0() { return cEntityMockObjectFunctionParserRuleCall_0; }
-
+		
 		//EntityMockObjectEnum
 		public RuleCall getEntityMockObjectEnumParserRuleCall_1() { return cEntityMockObjectEnumParserRuleCall_1; }
-
+		
 		//EntityMockObjectPlainValue
 		public RuleCall getEntityMockObjectPlainValueParserRuleCall_2() { return cEntityMockObjectPlainValueParserRuleCall_2; }
-
+		
 		//EntityMockObjectArrayValue
 		public RuleCall getEntityMockObjectArrayValueParserRuleCall_3() { return cEntityMockObjectArrayValueParserRuleCall_3; }
-
+		
 		//EntityMockObjectEmbed
 		public RuleCall getEntityMockObjectEmbedParserRuleCall_4() { return cEntityMockObjectEmbedParserRuleCall_4; }
-
+		
 		//EntityMockObjectFill
 		public RuleCall getEntityMockObjectFillParserRuleCall_5() { return cEntityMockObjectFillParserRuleCall_5; }
 	}
-
 	public class IEntityMockObjectAttributeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IEntityMockObjectAttribute");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockObjectAttribute");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cEntityMockObjectResourceValueParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cEntityMockObjectPlainValueParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -699,34 +701,33 @@
 		//IEntityMockObjectAttribute:
 		//	EntityMockObjectResourceValue | EntityMockObjectPlainValue | EntityMockObjectArrayValue | EntityMockObjectEmbed |
 		//	EntityMockObjectFill;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//EntityMockObjectResourceValue | EntityMockObjectPlainValue | EntityMockObjectArrayValue | EntityMockObjectEmbed |
 		//EntityMockObjectFill
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//EntityMockObjectResourceValue
 		public RuleCall getEntityMockObjectResourceValueParserRuleCall_0() { return cEntityMockObjectResourceValueParserRuleCall_0; }
-
+		
 		//EntityMockObjectPlainValue
 		public RuleCall getEntityMockObjectPlainValueParserRuleCall_1() { return cEntityMockObjectPlainValueParserRuleCall_1; }
-
+		
 		//EntityMockObjectArrayValue
 		public RuleCall getEntityMockObjectArrayValueParserRuleCall_2() { return cEntityMockObjectArrayValueParserRuleCall_2; }
-
+		
 		//EntityMockObjectEmbed
 		public RuleCall getEntityMockObjectEmbedParserRuleCall_3() { return cEntityMockObjectEmbedParserRuleCall_3; }
-
+		
 		//EntityMockObjectFill
 		public RuleCall getEntityMockObjectFillParserRuleCall_4() { return cEntityMockObjectFillParserRuleCall_4; }
 	}
-
 	public class EntityMockObjectPlainValueElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectPlainValue");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectPlainValue");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
 		private final Assignment cValuesAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
@@ -735,46 +736,45 @@
 		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//EntityMockObjectPlainValue:
-		//	"var" name=QualifiedName "(" (values+=STRING ","?)* ")";
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "(" (values+=STRING ","?)* ")"
+		//	'var' name=ID '(' (values+=STRING ','?)* ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID '(' (values+=STRING ','?)* ')'
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"("
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
-
-		//(values+=STRING ","?)*
+		
+		//(values+=STRING ','?)*
 		public Group getGroup_3() { return cGroup_3; }
-
+		
 		//values+=STRING
 		public Assignment getValuesAssignment_3_0() { return cValuesAssignment_3_0; }
-
+		
 		//STRING
 		public RuleCall getValuesSTRINGTerminalRuleCall_3_0_0() { return cValuesSTRINGTerminalRuleCall_3_0_0; }
-
-		//","?
+		
+		//','?
 		public Keyword getCommaKeyword_3_1() { return cCommaKeyword_3_1; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
 	}
-
 	public class EntityMockObjectResourceValueElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectResourceValue");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectResourceValue");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cWithKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cResourceEnumAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final CrossReference cResourceEnumEntityMockObjectEnumCrossReference_3_0 = (CrossReference)cResourceEnumAssignment_3.eContents().get(0);
@@ -786,57 +786,54 @@
 		private final RuleCall cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1 = (RuleCall)cResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0.eContents().get(1);
 		
 		//EntityMockObjectResourceValue:
-		//	"var" name=QualifiedName "with" resourceEnum=[EntityMockObjectEnum] ("."
-		//	resourceAttribute=[EntityMockResourceAttribute])?;
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "with" resourceEnum=[EntityMockObjectEnum] ("."
-		//resourceAttribute=[EntityMockResourceAttribute])?
+		//	'var' name=ID 'with' resourceEnum=[EntityMockObjectEnum] ('.' resourceAttribute=[EntityMockResourceAttribute])?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID 'with' resourceEnum=[EntityMockObjectEnum] ('.' resourceAttribute=[EntityMockResourceAttribute])?
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"with"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'with'
 		public Keyword getWithKeyword_2() { return cWithKeyword_2; }
-
+		
 		//resourceEnum=[EntityMockObjectEnum]
 		public Assignment getResourceEnumAssignment_3() { return cResourceEnumAssignment_3; }
-
+		
 		//[EntityMockObjectEnum]
 		public CrossReference getResourceEnumEntityMockObjectEnumCrossReference_3_0() { return cResourceEnumEntityMockObjectEnumCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1() { return cResourceEnumEntityMockObjectEnumIDTerminalRuleCall_3_0_1; }
-
-		//("." resourceAttribute=[EntityMockResourceAttribute])?
+		
+		//('.' resourceAttribute=[EntityMockResourceAttribute])?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_4_0() { return cFullStopKeyword_4_0; }
-
+		
 		//resourceAttribute=[EntityMockResourceAttribute]
 		public Assignment getResourceAttributeAssignment_4_1() { return cResourceAttributeAssignment_4_1; }
-
+		
 		//[EntityMockResourceAttribute]
 		public CrossReference getResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0() { return cResourceAttributeEntityMockResourceAttributeCrossReference_4_1_0; }
-
+		
 		//ID
 		public RuleCall getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1() { return cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_1_0_1; }
 	}
-
 	public class EntityMockObjectArrayValueElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectArrayValue");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectArrayValue");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cSwitchOnKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cEnumerationAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final CrossReference cEnumerationEntityMockObjectEnumCrossReference_3_0 = (CrossReference)cEnumerationAssignment_3.eContents().get(0);
@@ -847,48 +844,47 @@
 		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
 		
 		//EntityMockObjectArrayValue:
-		//	"var" name=QualifiedName "switch on" enumeration=[EntityMockObjectEnum] "{" items+=EntityMockObjectItemValue* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "switch on" enumeration=[EntityMockObjectEnum] "{" items+=EntityMockObjectItemValue* "}"
+		//	'var' name=ID 'switchOn' enumeration=[EntityMockObjectEnum] '{' items+=EntityMockObjectItemValue* '}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID 'switchOn' enumeration=[EntityMockObjectEnum] '{' items+=EntityMockObjectItemValue* '}'
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"switch on"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'switchOn'
 		public Keyword getSwitchOnKeyword_2() { return cSwitchOnKeyword_2; }
-
+		
 		//enumeration=[EntityMockObjectEnum]
 		public Assignment getEnumerationAssignment_3() { return cEnumerationAssignment_3; }
-
+		
 		//[EntityMockObjectEnum]
 		public CrossReference getEnumerationEntityMockObjectEnumCrossReference_3_0() { return cEnumerationEntityMockObjectEnumCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1() { return cEnumerationEntityMockObjectEnumIDTerminalRuleCall_3_0_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
+		
 		//items+=EntityMockObjectItemValue*
 		public Assignment getItemsAssignment_5() { return cItemsAssignment_5; }
-
+		
 		//EntityMockObjectItemValue
 		public RuleCall getItemsEntityMockObjectItemValueParserRuleCall_5_0() { return cItemsEntityMockObjectItemValueParserRuleCall_5_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
 	}
-
 	public class EntityMockObjectItemValueElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectItemValue");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectItemValue");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cWhenKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cDatarowAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -902,93 +898,91 @@
 		private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//EntityMockObjectItemValue:
-		//	"when" datarow=[types::LEnumLiteral] "(" (values+=STRING ","?)* ")";
-		public ParserRule getRule() { return rule; }
-
-		//"when" datarow=[types::LEnumLiteral] "(" (values+=STRING ","?)* ")"
+		//	'when' datarow=[types::LEnumLiteral] '(' (values+=STRING ','?)* ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'when' datarow=[types::LEnumLiteral] '(' (values+=STRING ','?)* ')'
 		public Group getGroup() { return cGroup; }
-
-		//"when"
+		
+		//'when'
 		public Keyword getWhenKeyword_0() { return cWhenKeyword_0; }
-
+		
 		//datarow=[types::LEnumLiteral]
 		public Assignment getDatarowAssignment_1() { return cDatarowAssignment_1; }
-
+		
 		//[types::LEnumLiteral]
 		public CrossReference getDatarowLEnumLiteralCrossReference_1_0() { return cDatarowLEnumLiteralCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getDatarowLEnumLiteralIDTerminalRuleCall_1_0_1() { return cDatarowLEnumLiteralIDTerminalRuleCall_1_0_1; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
-
-		//(values+=STRING ","?)*
+		
+		//(values+=STRING ','?)*
 		public Group getGroup_3() { return cGroup_3; }
-
+		
 		//values+=STRING
 		public Assignment getValuesAssignment_3_0() { return cValuesAssignment_3_0; }
-
+		
 		//STRING
 		public RuleCall getValuesSTRINGTerminalRuleCall_3_0_0() { return cValuesSTRINGTerminalRuleCall_3_0_0; }
-
-		//","?
+		
+		//','?
 		public Keyword getCommaKeyword_3_1() { return cCommaKeyword_3_1; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
 	}
-
 	public class EntityMockObjectEmbedElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectEmbed");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectEmbed");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockObjectEmbedAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cEmbedKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
 		private final Keyword cDefinedAsKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		private final Assignment cObjectAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final CrossReference cObjectEntityMockObjectCrossReference_4_0 = (CrossReference)cObjectAssignment_4.eContents().get(0);
 		private final RuleCall cObjectEntityMockObjectIDTerminalRuleCall_4_0_1 = (RuleCall)cObjectEntityMockObjectCrossReference_4_0.eContents().get(1);
 		
 		//EntityMockObjectEmbed:
-		//	{EntityMockObjectEmbed} "embed" name=QualifiedName "defined as" object=[EntityMockObject];
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockObjectEmbed} "embed" name=QualifiedName "defined as" object=[EntityMockObject]
+		//	{EntityMockObjectEmbed} 'embed' name=ID 'definedAs' object=[EntityMockObject];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockObjectEmbed} 'embed' name=ID 'definedAs' object=[EntityMockObject]
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockObjectEmbed}
 		public Action getEntityMockObjectEmbedAction_0() { return cEntityMockObjectEmbedAction_0; }
-
-		//"embed"
+		
+		//'embed'
 		public Keyword getEmbedKeyword_1() { return cEmbedKeyword_1; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_2_0() { return cNameQualifiedNameParserRuleCall_2_0; }
-
-		//"defined as"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
+		
+		//'definedAs'
 		public Keyword getDefinedAsKeyword_3() { return cDefinedAsKeyword_3; }
-
+		
 		//object=[EntityMockObject]
 		public Assignment getObjectAssignment_4() { return cObjectAssignment_4; }
-
+		
 		//[EntityMockObject]
 		public CrossReference getObjectEntityMockObjectCrossReference_4_0() { return cObjectEntityMockObjectCrossReference_4_0; }
-
+		
 		//ID
 		public RuleCall getObjectEntityMockObjectIDTerminalRuleCall_4_0_1() { return cObjectEntityMockObjectIDTerminalRuleCall_4_0_1; }
 	}
-
 	public class EntityMockObjectFunctionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectFunction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunction");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cCalculateAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cOftypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0 = (RuleCall)cOftypeAssignment_3.eContents().get(0);
@@ -1006,73 +1000,71 @@
 		private final RuleCall cBodyXBlockExpressionParserRuleCall_8_0 = (RuleCall)cBodyAssignment_8.eContents().get(0);
 		
 		//EntityMockObjectFunction:
-		//	"var" name=QualifiedName "calculate as" oftype=JvmParameterizedTypeReference "based on" "("
-		//	(params+=EntityMockObjectFunctionParameter ("," params+=EntityMockObjectFunctionParameter)*)? ")"
+		//	'var' name=ID 'calculateAs' oftype=JvmParameterizedTypeReference
+		//	'basedOn' '(' (params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)*)? ')'
 		//	body=XBlockExpression;
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "calculate as" oftype=JvmParameterizedTypeReference "based on" "("
-		//(params+=EntityMockObjectFunctionParameter ("," params+=EntityMockObjectFunctionParameter)*)? ")"
-		//body=XBlockExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID 'calculateAs' oftype=JvmParameterizedTypeReference 'basedOn' '('
+		//(params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)*)? ')' body=XBlockExpression
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"calculate as"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'calculateAs'
 		public Keyword getCalculateAsKeyword_2() { return cCalculateAsKeyword_2; }
-
+		
 		//oftype=JvmParameterizedTypeReference
 		public Assignment getOftypeAssignment_3() { return cOftypeAssignment_3; }
-
+		
 		//JvmParameterizedTypeReference
 		public RuleCall getOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0() { return cOftypeJvmParameterizedTypeReferenceParserRuleCall_3_0; }
-
-		//"based on"
+		
+		//'basedOn'
 		public Keyword getBasedOnKeyword_4() { return cBasedOnKeyword_4; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_5() { return cLeftParenthesisKeyword_5; }
-
-		//(params+=EntityMockObjectFunctionParameter ("," params+=EntityMockObjectFunctionParameter)*)?
+		
+		//(params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)*)?
 		public Group getGroup_6() { return cGroup_6; }
-
+		
 		//params+=EntityMockObjectFunctionParameter
 		public Assignment getParamsAssignment_6_0() { return cParamsAssignment_6_0; }
-
+		
 		//EntityMockObjectFunctionParameter
 		public RuleCall getParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0() { return cParamsEntityMockObjectFunctionParameterParserRuleCall_6_0_0; }
-
-		//("," params+=EntityMockObjectFunctionParameter)*
+		
+		//(',' params+=EntityMockObjectFunctionParameter)*
 		public Group getGroup_6_1() { return cGroup_6_1; }
-
-		//","
+		
+		//','
 		public Keyword getCommaKeyword_6_1_0() { return cCommaKeyword_6_1_0; }
-
+		
 		//params+=EntityMockObjectFunctionParameter
 		public Assignment getParamsAssignment_6_1_1() { return cParamsAssignment_6_1_1; }
-
+		
 		//EntityMockObjectFunctionParameter
 		public RuleCall getParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0() { return cParamsEntityMockObjectFunctionParameterParserRuleCall_6_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_7() { return cRightParenthesisKeyword_7; }
-
+		
 		//body=XBlockExpression
 		public Assignment getBodyAssignment_8() { return cBodyAssignment_8; }
-
+		
 		//XBlockExpression
 		public RuleCall getBodyXBlockExpressionParserRuleCall_8_0() { return cBodyXBlockExpressionParserRuleCall_8_0; }
 	}
-
 	public class EntityMockObjectFunctionParameterElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectFunctionParameter");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFunctionParameter");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cParameterTypeAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final RuleCall cParameterTypeJvmTypeReferenceParserRuleCall_0_0 = (RuleCall)cParameterTypeAssignment_0.eContents().get(0);
@@ -1082,65 +1074,63 @@
 		
 		//EntityMockObjectFunctionParameter:
 		//	parameterType=JvmTypeReference name=[IEntityMockObjectUsable];
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//parameterType=JvmTypeReference name=[IEntityMockObjectUsable]
 		public Group getGroup() { return cGroup; }
-
+		
 		//parameterType=JvmTypeReference
 		public Assignment getParameterTypeAssignment_0() { return cParameterTypeAssignment_0; }
-
+		
 		//JvmTypeReference
 		public RuleCall getParameterTypeJvmTypeReferenceParserRuleCall_0_0() { return cParameterTypeJvmTypeReferenceParserRuleCall_0_0; }
-
+		
 		//name=[IEntityMockObjectUsable]
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
+		
 		//[IEntityMockObjectUsable]
 		public CrossReference getNameIEntityMockObjectUsableCrossReference_1_0() { return cNameIEntityMockObjectUsableCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1() { return cNameIEntityMockObjectUsableIDTerminalRuleCall_1_0_1; }
 	}
-
 	public class EntityMockObjectFillElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockObjectFill");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockObjectFill");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cRandomizeKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cFillerTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cFillerTypePropertyFillerTypeParserRuleCall_3_0 = (RuleCall)cFillerTypeAssignment_3.eContents().get(0);
 		
 		//EntityMockObjectFill:
-		//	"var" name=QualifiedName "randomize" fillerType=PropertyFillerType;
-		public ParserRule getRule() { return rule; }
-
-		//"var" name=QualifiedName "randomize" fillerType=PropertyFillerType
+		//	'var' name=ID 'randomize' fillerType=PropertyFillerType;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' name=ID 'randomize' fillerType=PropertyFillerType
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"randomize"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'randomize'
 		public Keyword getRandomizeKeyword_2() { return cRandomizeKeyword_2; }
-
+		
 		//fillerType=PropertyFillerType
 		public Assignment getFillerTypeAssignment_3() { return cFillerTypeAssignment_3; }
-
+		
 		//PropertyFillerType
 		public RuleCall getFillerTypePropertyFillerTypeParserRuleCall_3_0() { return cFillerTypePropertyFillerTypeParserRuleCall_3_0; }
 	}
-
 	public class PropertyFillerTypeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerType");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerType");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cPropertyFillerDateFutureParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cPropertyFillerDatePastParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -1160,517 +1150,521 @@
 		private final RuleCall cPropertyFillerUnsignedIntegerRandomParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
 		
 		//PropertyFillerType:
-		//	PropertyFillerDateFuture | PropertyFillerDatePast | PropertyFillerDateRange | PropertyFillerBoolean |
-		//	PropertyFillerSignedDoubleRange | PropertyFillerSignedDoubleRandom | PropertyFillerSignedIntegerRange |
-		//	PropertyFillerSignedIntegerRandom | PropertyFillerTextRandom | PropertyFillerTextParagraphs |
-		//	PropertyFillerTextSentences | PropertyFillerTextWords | PropertyFillerUnsignedDoubleRange |
-		//	PropertyFillerUnsignedDoubleRandom | PropertyFillerUnsignedIntegerRange | PropertyFillerUnsignedIntegerRandom;
-		public ParserRule getRule() { return rule; }
-
+		//	PropertyFillerDateFuture | PropertyFillerDatePast
+		//	| PropertyFillerDateRange
+		//	| PropertyFillerBoolean
+		//	| PropertyFillerSignedDoubleRange | PropertyFillerSignedDoubleRandom
+		//	| PropertyFillerSignedIntegerRange | PropertyFillerSignedIntegerRandom
+		//	| PropertyFillerTextRandom
+		//	| PropertyFillerTextParagraphs | PropertyFillerTextSentences | PropertyFillerTextWords
+		//	| PropertyFillerUnsignedDoubleRange | PropertyFillerUnsignedDoubleRandom
+		//	| PropertyFillerUnsignedIntegerRange | PropertyFillerUnsignedIntegerRandom;
+		@Override public ParserRule getRule() { return rule; }
+		
 		//PropertyFillerDateFuture | PropertyFillerDatePast | PropertyFillerDateRange | PropertyFillerBoolean |
 		//PropertyFillerSignedDoubleRange | PropertyFillerSignedDoubleRandom | PropertyFillerSignedIntegerRange |
 		//PropertyFillerSignedIntegerRandom | PropertyFillerTextRandom | PropertyFillerTextParagraphs |
 		//PropertyFillerTextSentences | PropertyFillerTextWords | PropertyFillerUnsignedDoubleRange |
 		//PropertyFillerUnsignedDoubleRandom | PropertyFillerUnsignedIntegerRange | PropertyFillerUnsignedIntegerRandom
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//PropertyFillerDateFuture
 		public RuleCall getPropertyFillerDateFutureParserRuleCall_0() { return cPropertyFillerDateFutureParserRuleCall_0; }
-
+		
 		//PropertyFillerDatePast
 		public RuleCall getPropertyFillerDatePastParserRuleCall_1() { return cPropertyFillerDatePastParserRuleCall_1; }
-
+		
 		//PropertyFillerDateRange
 		public RuleCall getPropertyFillerDateRangeParserRuleCall_2() { return cPropertyFillerDateRangeParserRuleCall_2; }
-
+		
 		//PropertyFillerBoolean
 		public RuleCall getPropertyFillerBooleanParserRuleCall_3() { return cPropertyFillerBooleanParserRuleCall_3; }
-
+		
 		//PropertyFillerSignedDoubleRange
 		public RuleCall getPropertyFillerSignedDoubleRangeParserRuleCall_4() { return cPropertyFillerSignedDoubleRangeParserRuleCall_4; }
-
+		
 		//PropertyFillerSignedDoubleRandom
 		public RuleCall getPropertyFillerSignedDoubleRandomParserRuleCall_5() { return cPropertyFillerSignedDoubleRandomParserRuleCall_5; }
-
+		
 		//PropertyFillerSignedIntegerRange
 		public RuleCall getPropertyFillerSignedIntegerRangeParserRuleCall_6() { return cPropertyFillerSignedIntegerRangeParserRuleCall_6; }
-
+		
 		//PropertyFillerSignedIntegerRandom
 		public RuleCall getPropertyFillerSignedIntegerRandomParserRuleCall_7() { return cPropertyFillerSignedIntegerRandomParserRuleCall_7; }
-
+		
 		//PropertyFillerTextRandom
 		public RuleCall getPropertyFillerTextRandomParserRuleCall_8() { return cPropertyFillerTextRandomParserRuleCall_8; }
-
+		
 		//PropertyFillerTextParagraphs
 		public RuleCall getPropertyFillerTextParagraphsParserRuleCall_9() { return cPropertyFillerTextParagraphsParserRuleCall_9; }
-
+		
 		//PropertyFillerTextSentences
 		public RuleCall getPropertyFillerTextSentencesParserRuleCall_10() { return cPropertyFillerTextSentencesParserRuleCall_10; }
-
+		
 		//PropertyFillerTextWords
 		public RuleCall getPropertyFillerTextWordsParserRuleCall_11() { return cPropertyFillerTextWordsParserRuleCall_11; }
-
+		
 		//PropertyFillerUnsignedDoubleRange
 		public RuleCall getPropertyFillerUnsignedDoubleRangeParserRuleCall_12() { return cPropertyFillerUnsignedDoubleRangeParserRuleCall_12; }
-
+		
 		//PropertyFillerUnsignedDoubleRandom
 		public RuleCall getPropertyFillerUnsignedDoubleRandomParserRuleCall_13() { return cPropertyFillerUnsignedDoubleRandomParserRuleCall_13; }
-
+		
 		//PropertyFillerUnsignedIntegerRange
 		public RuleCall getPropertyFillerUnsignedIntegerRangeParserRuleCall_14() { return cPropertyFillerUnsignedIntegerRangeParserRuleCall_14; }
-
+		
 		//PropertyFillerUnsignedIntegerRandom
 		public RuleCall getPropertyFillerUnsignedIntegerRandomParserRuleCall_15() { return cPropertyFillerUnsignedIntegerRandomParserRuleCall_15; }
 	}
-
 	public class PropertyFillerDateFutureElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerDateFuture");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerDateFuture");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cFutureDateKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFutureKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cDateFutureYearsAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cDateFutureYearsINTTerminalRuleCall_1_0 = (RuleCall)cDateFutureYearsAssignment_1.eContents().get(0);
 		private final Keyword cYearsKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		
 		//PropertyFillerDateFuture:
-		//	"future date" dateFutureYears=INT "years";
-		public ParserRule getRule() { return rule; }
-
-		//"future date" dateFutureYears=INT "years"
+		//	'future' dateFutureYears=INT 'years';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'future' dateFutureYears=INT 'years'
 		public Group getGroup() { return cGroup; }
-
-		//"future date"
-		public Keyword getFutureDateKeyword_0() { return cFutureDateKeyword_0; }
-
+		
+		//'future'
+		public Keyword getFutureKeyword_0() { return cFutureKeyword_0; }
+		
 		//dateFutureYears=INT
 		public Assignment getDateFutureYearsAssignment_1() { return cDateFutureYearsAssignment_1; }
-
+		
 		//INT
 		public RuleCall getDateFutureYearsINTTerminalRuleCall_1_0() { return cDateFutureYearsINTTerminalRuleCall_1_0; }
-
-		//"years"
+		
+		//'years'
 		public Keyword getYearsKeyword_2() { return cYearsKeyword_2; }
 	}
-
 	public class PropertyFillerDatePastElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerDatePast");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerDatePast");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cPastDateKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cPastKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cDatePastYearsAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cDatePastYearsINTTerminalRuleCall_1_0 = (RuleCall)cDatePastYearsAssignment_1.eContents().get(0);
 		private final Keyword cYearsKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		
 		//PropertyFillerDatePast:
-		//	"past date" datePastYears=INT "years";
-		public ParserRule getRule() { return rule; }
-
-		//"past date" datePastYears=INT "years"
+		//	'past' datePastYears=INT 'years';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'past' datePastYears=INT 'years'
 		public Group getGroup() { return cGroup; }
-
-		//"past date"
-		public Keyword getPastDateKeyword_0() { return cPastDateKeyword_0; }
-
+		
+		//'past'
+		public Keyword getPastKeyword_0() { return cPastKeyword_0; }
+		
 		//datePastYears=INT
 		public Assignment getDatePastYearsAssignment_1() { return cDatePastYearsAssignment_1; }
-
+		
 		//INT
 		public RuleCall getDatePastYearsINTTerminalRuleCall_1_0() { return cDatePastYearsINTTerminalRuleCall_1_0; }
-
-		//"years"
+		
+		//'years'
 		public Keyword getYearsKeyword_2() { return cYearsKeyword_2; }
 	}
-
 	public class PropertyFillerBooleanElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerBoolean");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerBoolean");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerBooleanAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cBooleanKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		
 		//PropertyFillerBoolean:
-		//	{PropertyFillerBoolean} "boolean";
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerBoolean} "boolean"
+		//	{PropertyFillerBoolean} 'boolean';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerBoolean} 'boolean'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerBoolean}
 		public Action getPropertyFillerBooleanAction_0() { return cPropertyFillerBooleanAction_0; }
-
-		//"boolean"
+		
+		//'boolean'
 		public Keyword getBooleanKeyword_1() { return cBooleanKeyword_1; }
 	}
-
 	public class PropertyFillerDateRangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerDateRange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerDateRange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cDateInRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Assignment cDateBeginYearsAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cDateBeginYearsSINTParserRuleCall_1_0 = (RuleCall)cDateBeginYearsAssignment_1.eContents().get(0);
-		private final Keyword cUpToAndIncludingKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		private final Assignment cDateEndYearsAssignment_3 = (Assignment)cGroup.eContents().get(3);
-		private final RuleCall cDateEndYearsSINTParserRuleCall_3_0 = (RuleCall)cDateEndYearsAssignment_3.eContents().get(0);
-		private final Keyword cYearsKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Keyword cDateRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFromKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDateBeginYearsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cDateBeginYearsSINTParserRuleCall_2_0 = (RuleCall)cDateBeginYearsAssignment_2.eContents().get(0);
+		private final Keyword cUntilKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDateEndYearsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cDateEndYearsSINTParserRuleCall_4_0 = (RuleCall)cDateEndYearsAssignment_4.eContents().get(0);
+		private final Keyword cYearsKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
 		//PropertyFillerDateRange:
-		//	"date in range" dateBeginYears=SINT "up to and including" dateEndYears=SINT "years";
-		public ParserRule getRule() { return rule; }
-
-		//"date in range" dateBeginYears=SINT "up to and including" dateEndYears=SINT "years"
+		//	'dateRange' 'from' dateBeginYears=SINT 'until' dateEndYears=SINT 'years';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'dateRange' 'from' dateBeginYears=SINT 'until' dateEndYears=SINT 'years'
 		public Group getGroup() { return cGroup; }
-
-		//"date in range"
-		public Keyword getDateInRangeKeyword_0() { return cDateInRangeKeyword_0; }
-
+		
+		//'dateRange'
+		public Keyword getDateRangeKeyword_0() { return cDateRangeKeyword_0; }
+		
+		//'from'
+		public Keyword getFromKeyword_1() { return cFromKeyword_1; }
+		
 		//dateBeginYears=SINT
-		public Assignment getDateBeginYearsAssignment_1() { return cDateBeginYearsAssignment_1; }
-
+		public Assignment getDateBeginYearsAssignment_2() { return cDateBeginYearsAssignment_2; }
+		
 		//SINT
-		public RuleCall getDateBeginYearsSINTParserRuleCall_1_0() { return cDateBeginYearsSINTParserRuleCall_1_0; }
-
-		//"up to and including"
-		public Keyword getUpToAndIncludingKeyword_2() { return cUpToAndIncludingKeyword_2; }
-
+		public RuleCall getDateBeginYearsSINTParserRuleCall_2_0() { return cDateBeginYearsSINTParserRuleCall_2_0; }
+		
+		//'until'
+		public Keyword getUntilKeyword_3() { return cUntilKeyword_3; }
+		
 		//dateEndYears=SINT
-		public Assignment getDateEndYearsAssignment_3() { return cDateEndYearsAssignment_3; }
-
+		public Assignment getDateEndYearsAssignment_4() { return cDateEndYearsAssignment_4; }
+		
 		//SINT
-		public RuleCall getDateEndYearsSINTParserRuleCall_3_0() { return cDateEndYearsSINTParserRuleCall_3_0; }
-
-		//"years"
-		public Keyword getYearsKeyword_4() { return cYearsKeyword_4; }
+		public RuleCall getDateEndYearsSINTParserRuleCall_4_0() { return cDateEndYearsSINTParserRuleCall_4_0; }
+		
+		//'years'
+		public Keyword getYearsKeyword_5() { return cYearsKeyword_5; }
 	}
-
 	public class PropertyFillerSignedDoubleRangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerSignedDoubleRange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerSignedDoubleRange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cSignedDoubleInRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
-		private final Alternatives cAlternatives_1_0 = (Alternatives)cGroup_1.eContents().get(0);
-		private final Assignment cBeginRangeAssignment_1_0_0 = (Assignment)cAlternatives_1_0.eContents().get(0);
-		private final RuleCall cBeginRangeSignedNumberParserRuleCall_1_0_0_0 = (RuleCall)cBeginRangeAssignment_1_0_0.eContents().get(0);
-		private final Assignment cBeginRangeRefAssignment_1_0_1 = (Assignment)cAlternatives_1_0.eContents().get(1);
-		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0 = (CrossReference)cBeginRangeRefAssignment_1_0_1.eContents().get(0);
-		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0.eContents().get(1);
-		private final Keyword cUpToAndIncludingKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
-		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
-		private final Assignment cEndRangeAssignment_1_2_0 = (Assignment)cAlternatives_1_2.eContents().get(0);
-		private final RuleCall cEndRangeSignedNumberParserRuleCall_1_2_0_0 = (RuleCall)cEndRangeAssignment_1_2_0.eContents().get(0);
-		private final Assignment cEndRangeRefAssignment_1_2_1 = (Assignment)cAlternatives_1_2.eContents().get(1);
-		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_1_2_1_0 = (CrossReference)cEndRangeRefAssignment_1_2_1.eContents().get(0);
-		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_1_2_1_0.eContents().get(1);
-		private final Keyword cWithKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		private final Assignment cDecimalsAssignment_3 = (Assignment)cGroup.eContents().get(3);
-		private final RuleCall cDecimalsINTTerminalRuleCall_3_0 = (RuleCall)cDecimalsAssignment_3.eContents().get(0);
-		private final Keyword cDecimalsKeyword_4 = (Keyword)cGroup.eContents().get(4);
-		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
-		private final Keyword cRoundToKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
-		private final Assignment cRoundedAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
-		private final RuleCall cRoundedUnsignedNumberParserRuleCall_5_1_0 = (RuleCall)cRoundedAssignment_5_1.eContents().get(0);
+		private final Keyword cNumberRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFromKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Alternatives cAlternatives_2_0 = (Alternatives)cGroup_2.eContents().get(0);
+		private final Assignment cBeginRangeAssignment_2_0_0 = (Assignment)cAlternatives_2_0.eContents().get(0);
+		private final RuleCall cBeginRangeSignedNumberParserRuleCall_2_0_0_0 = (RuleCall)cBeginRangeAssignment_2_0_0.eContents().get(0);
+		private final Assignment cBeginRangeRefAssignment_2_0_1 = (Assignment)cAlternatives_2_0.eContents().get(1);
+		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0 = (CrossReference)cBeginRangeRefAssignment_2_0_1.eContents().get(0);
+		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0.eContents().get(1);
+		private final Keyword cUntilKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
+		private final Assignment cEndRangeAssignment_2_2_0 = (Assignment)cAlternatives_2_2.eContents().get(0);
+		private final RuleCall cEndRangeSignedNumberParserRuleCall_2_2_0_0 = (RuleCall)cEndRangeAssignment_2_2_0.eContents().get(0);
+		private final Assignment cEndRangeRefAssignment_2_2_1 = (Assignment)cAlternatives_2_2.eContents().get(1);
+		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_2_2_1_0 = (CrossReference)cEndRangeRefAssignment_2_2_1.eContents().get(0);
+		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_2_2_1_0.eContents().get(1);
+		private final Keyword cWithKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDecimalsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cDecimalsINTTerminalRuleCall_4_0 = (RuleCall)cDecimalsAssignment_4.eContents().get(0);
+		private final Keyword cDecimalsKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cRoundToKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cRoundedAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cRoundedUnsignedNumberParserRuleCall_6_1_0 = (RuleCall)cRoundedAssignment_6_1.eContents().get(0);
 		
 		//PropertyFillerSignedDoubleRange:
-		//	"signed double in range" ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? "up to and including"
-		//	(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT "decimals" ("round to"
-		//	rounded=UnsignedNumber)?;
-		public ParserRule getRule() { return rule; }
-
-		//"signed double in range" ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? "up to and including"
-		//(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT "decimals" ("round to"
+		//	'numberRange' 'from' ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+		//	(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))?
+		//	'with' decimals=INT 'decimals' ('roundTo' rounded=UnsignedNumber)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'numberRange' 'from' ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+		//(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))? 'with' decimals=INT 'decimals' ('roundTo'
 		//rounded=UnsignedNumber)?
 		public Group getGroup() { return cGroup; }
-
-		//"signed double in range"
-		public Keyword getSignedDoubleInRangeKeyword_0() { return cSignedDoubleInRangeKeyword_0; }
-
-		//((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=SignedNumber |
+		
+		//'numberRange'
+		public Keyword getNumberRangeKeyword_0() { return cNumberRangeKeyword_0; }
+		
+		//'from'
+		public Keyword getFromKeyword_1() { return cFromKeyword_1; }
+		
+		//((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SignedNumber |
 		//endRangeRef=[entity::LEntityAttribute]))?
-		public Group getGroup_1() { return cGroup_1; }
-
+		public Group getGroup_2() { return cGroup_2; }
+		
 		//(beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])?
-		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
-
+		public Alternatives getAlternatives_2_0() { return cAlternatives_2_0; }
+		
 		//beginRange=SignedNumber
-		public Assignment getBeginRangeAssignment_1_0_0() { return cBeginRangeAssignment_1_0_0; }
-
+		public Assignment getBeginRangeAssignment_2_0_0() { return cBeginRangeAssignment_2_0_0; }
+		
 		//SignedNumber
-		public RuleCall getBeginRangeSignedNumberParserRuleCall_1_0_0_0() { return cBeginRangeSignedNumberParserRuleCall_1_0_0_0; }
-
+		public RuleCall getBeginRangeSignedNumberParserRuleCall_2_0_0_0() { return cBeginRangeSignedNumberParserRuleCall_2_0_0_0; }
+		
 		//beginRangeRef=[entity::LEntityAttribute]
-		public Assignment getBeginRangeRefAssignment_1_0_1() { return cBeginRangeRefAssignment_1_0_1; }
-
+		public Assignment getBeginRangeRefAssignment_2_0_1() { return cBeginRangeRefAssignment_2_0_1; }
+		
 		//[entity::LEntityAttribute]
-		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0; }
-
+		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0; }
+		
 		//ID
-		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1; }
-
-		//"up to and including"
-		public Keyword getUpToAndIncludingKeyword_1_1() { return cUpToAndIncludingKeyword_1_1; }
-
+		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1; }
+		
+		//'until'
+		public Keyword getUntilKeyword_2_1() { return cUntilKeyword_2_1; }
+		
 		//endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]
-		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
-
+		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
+		
 		//endRange=SignedNumber
-		public Assignment getEndRangeAssignment_1_2_0() { return cEndRangeAssignment_1_2_0; }
-
+		public Assignment getEndRangeAssignment_2_2_0() { return cEndRangeAssignment_2_2_0; }
+		
 		//SignedNumber
-		public RuleCall getEndRangeSignedNumberParserRuleCall_1_2_0_0() { return cEndRangeSignedNumberParserRuleCall_1_2_0_0; }
-
+		public RuleCall getEndRangeSignedNumberParserRuleCall_2_2_0_0() { return cEndRangeSignedNumberParserRuleCall_2_2_0_0; }
+		
 		//endRangeRef=[entity::LEntityAttribute]
-		public Assignment getEndRangeRefAssignment_1_2_1() { return cEndRangeRefAssignment_1_2_1; }
-
+		public Assignment getEndRangeRefAssignment_2_2_1() { return cEndRangeRefAssignment_2_2_1; }
+		
 		//[entity::LEntityAttribute]
-		public CrossReference getEndRangeRefLEntityAttributeCrossReference_1_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_1_2_1_0; }
-
+		public CrossReference getEndRangeRefLEntityAttributeCrossReference_2_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_2_2_1_0; }
+		
 		//ID
-		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1; }
-
-		//"with"
-		public Keyword getWithKeyword_2() { return cWithKeyword_2; }
-
+		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1; }
+		
+		//'with'
+		public Keyword getWithKeyword_3() { return cWithKeyword_3; }
+		
 		//decimals=INT
-		public Assignment getDecimalsAssignment_3() { return cDecimalsAssignment_3; }
-
+		public Assignment getDecimalsAssignment_4() { return cDecimalsAssignment_4; }
+		
 		//INT
-		public RuleCall getDecimalsINTTerminalRuleCall_3_0() { return cDecimalsINTTerminalRuleCall_3_0; }
-
-		//"decimals"
-		public Keyword getDecimalsKeyword_4() { return cDecimalsKeyword_4; }
-
-		//("round to" rounded=UnsignedNumber)?
-		public Group getGroup_5() { return cGroup_5; }
-
-		//"round to"
-		public Keyword getRoundToKeyword_5_0() { return cRoundToKeyword_5_0; }
-
+		public RuleCall getDecimalsINTTerminalRuleCall_4_0() { return cDecimalsINTTerminalRuleCall_4_0; }
+		
+		//'decimals'
+		public Keyword getDecimalsKeyword_5() { return cDecimalsKeyword_5; }
+		
+		//('roundTo' rounded=UnsignedNumber)?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'roundTo'
+		public Keyword getRoundToKeyword_6_0() { return cRoundToKeyword_6_0; }
+		
 		//rounded=UnsignedNumber
-		public Assignment getRoundedAssignment_5_1() { return cRoundedAssignment_5_1; }
-
+		public Assignment getRoundedAssignment_6_1() { return cRoundedAssignment_6_1; }
+		
 		//UnsignedNumber
-		public RuleCall getRoundedUnsignedNumberParserRuleCall_5_1_0() { return cRoundedUnsignedNumberParserRuleCall_5_1_0; }
+		public RuleCall getRoundedUnsignedNumberParserRuleCall_6_1_0() { return cRoundedUnsignedNumberParserRuleCall_6_1_0; }
 	}
-
 	public class PropertyFillerSignedDoubleRandomElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerSignedDoubleRandom");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerSignedDoubleRandom");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cSignedDoubleFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cNumberPickKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cItemsAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cItemsSignedNumberParserRuleCall_2_0 = (RuleCall)cItemsAssignment_2.eContents().get(0);
 		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//PropertyFillerSignedDoubleRandom:
-		//	"signed double from" "(" items+=SignedNumber+ ")";
-		public ParserRule getRule() { return rule; }
-
-		//"signed double from" "(" items+=SignedNumber+ ")"
+		//	'numberPick' '(' items+=SignedNumber+ ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'numberPick' '(' items+=SignedNumber+ ')'
 		public Group getGroup() { return cGroup; }
-
-		//"signed double from"
-		public Keyword getSignedDoubleFromKeyword_0() { return cSignedDoubleFromKeyword_0; }
-
-		//"("
+		
+		//'numberPick'
+		public Keyword getNumberPickKeyword_0() { return cNumberPickKeyword_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
-
+		
 		//items+=SignedNumber+
 		public Assignment getItemsAssignment_2() { return cItemsAssignment_2; }
-
+		
 		//SignedNumber
 		public RuleCall getItemsSignedNumberParserRuleCall_2_0() { return cItemsSignedNumberParserRuleCall_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
 	}
-
 	public class PropertyFillerSignedIntegerRangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerSignedIntegerRange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerSignedIntegerRange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerSignedIntegerRangeAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cSignedIntegerInRangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
-		private final Alternatives cAlternatives_2_0 = (Alternatives)cGroup_2.eContents().get(0);
-		private final Assignment cBeginRangeAssignment_2_0_0 = (Assignment)cAlternatives_2_0.eContents().get(0);
-		private final RuleCall cBeginRangeSINTParserRuleCall_2_0_0_0 = (RuleCall)cBeginRangeAssignment_2_0_0.eContents().get(0);
-		private final Assignment cBeginRangeRefAssignment_2_0_1 = (Assignment)cAlternatives_2_0.eContents().get(1);
-		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0 = (CrossReference)cBeginRangeRefAssignment_2_0_1.eContents().get(0);
-		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0.eContents().get(1);
-		private final Keyword cUpToAndIncludingKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
-		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
-		private final Assignment cEndRangeAssignment_2_2_0 = (Assignment)cAlternatives_2_2.eContents().get(0);
-		private final RuleCall cEndRangeSINTParserRuleCall_2_2_0_0 = (RuleCall)cEndRangeAssignment_2_2_0.eContents().get(0);
-		private final Assignment cEndRangeRefAssignment_2_2_1 = (Assignment)cAlternatives_2_2.eContents().get(1);
-		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_2_2_1_0 = (CrossReference)cEndRangeRefAssignment_2_2_1.eContents().get(0);
-		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_2_2_1_0.eContents().get(1);
+		private final Keyword cIntegerRangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cFromKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
-		private final Keyword cRoundToKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
-		private final Assignment cRoundedAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cRoundedINTTerminalRuleCall_3_1_0 = (RuleCall)cRoundedAssignment_3_1.eContents().get(0);
+		private final Alternatives cAlternatives_3_0 = (Alternatives)cGroup_3.eContents().get(0);
+		private final Assignment cBeginRangeAssignment_3_0_0 = (Assignment)cAlternatives_3_0.eContents().get(0);
+		private final RuleCall cBeginRangeSINTParserRuleCall_3_0_0_0 = (RuleCall)cBeginRangeAssignment_3_0_0.eContents().get(0);
+		private final Assignment cBeginRangeRefAssignment_3_0_1 = (Assignment)cAlternatives_3_0.eContents().get(1);
+		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0 = (CrossReference)cBeginRangeRefAssignment_3_0_1.eContents().get(0);
+		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0.eContents().get(1);
+		private final Keyword cUntilKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_3_2 = (Alternatives)cGroup_3.eContents().get(2);
+		private final Assignment cEndRangeAssignment_3_2_0 = (Assignment)cAlternatives_3_2.eContents().get(0);
+		private final RuleCall cEndRangeSINTParserRuleCall_3_2_0_0 = (RuleCall)cEndRangeAssignment_3_2_0.eContents().get(0);
+		private final Assignment cEndRangeRefAssignment_3_2_1 = (Assignment)cAlternatives_3_2.eContents().get(1);
+		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_3_2_1_0 = (CrossReference)cEndRangeRefAssignment_3_2_1.eContents().get(0);
+		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_3_2_1_0.eContents().get(1);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cRoundToKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cRoundedAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cRoundedINTTerminalRuleCall_4_1_0 = (RuleCall)cRoundedAssignment_4_1.eContents().get(0);
 		
 		//PropertyFillerSignedIntegerRange:
-		//	{PropertyFillerSignedIntegerRange} "signed integer in range" ((beginRange=SINT |
-		//	beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=SINT |
-		//	endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?;
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerSignedIntegerRange} "signed integer in range" ((beginRange=SINT |
-		//beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=SINT |
-		//endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?
+		//	{PropertyFillerSignedIntegerRange} 'integerRange' 'from' ((beginRange=SINT |
+		//	beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SINT | endRangeRef=[entity::LEntityAttribute]))?
+		//	('roundTo' rounded=INT)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerSignedIntegerRange} 'integerRange' 'from' ((beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])?
+		//'until' (endRange=SINT | endRangeRef=[entity::LEntityAttribute]))? ('roundTo' rounded=INT)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerSignedIntegerRange}
 		public Action getPropertyFillerSignedIntegerRangeAction_0() { return cPropertyFillerSignedIntegerRangeAction_0; }
-
-		//"signed integer in range"
-		public Keyword getSignedIntegerInRangeKeyword_1() { return cSignedIntegerInRangeKeyword_1; }
-
-		//((beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=SINT |
+		
+		//'integerRange'
+		public Keyword getIntegerRangeKeyword_1() { return cIntegerRangeKeyword_1; }
+		
+		//'from'
+		public Keyword getFromKeyword_2() { return cFromKeyword_2; }
+		
+		//((beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SINT |
 		//endRangeRef=[entity::LEntityAttribute]))?
-		public Group getGroup_2() { return cGroup_2; }
-
-		//(beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])?
-		public Alternatives getAlternatives_2_0() { return cAlternatives_2_0; }
-
-		//beginRange=SINT
-		public Assignment getBeginRangeAssignment_2_0_0() { return cBeginRangeAssignment_2_0_0; }
-
-		//SINT
-		public RuleCall getBeginRangeSINTParserRuleCall_2_0_0_0() { return cBeginRangeSINTParserRuleCall_2_0_0_0; }
-
-		//beginRangeRef=[entity::LEntityAttribute]
-		public Assignment getBeginRangeRefAssignment_2_0_1() { return cBeginRangeRefAssignment_2_0_1; }
-
-		//[entity::LEntityAttribute]
-		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0; }
-
-		//ID
-		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1; }
-
-		//"up to and including"
-		public Keyword getUpToAndIncludingKeyword_2_1() { return cUpToAndIncludingKeyword_2_1; }
-
-		//endRange=SINT | endRangeRef=[entity::LEntityAttribute]
-		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
-
-		//endRange=SINT
-		public Assignment getEndRangeAssignment_2_2_0() { return cEndRangeAssignment_2_2_0; }
-
-		//SINT
-		public RuleCall getEndRangeSINTParserRuleCall_2_2_0_0() { return cEndRangeSINTParserRuleCall_2_2_0_0; }
-
-		//endRangeRef=[entity::LEntityAttribute]
-		public Assignment getEndRangeRefAssignment_2_2_1() { return cEndRangeRefAssignment_2_2_1; }
-
-		//[entity::LEntityAttribute]
-		public CrossReference getEndRangeRefLEntityAttributeCrossReference_2_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_2_2_1_0; }
-
-		//ID
-		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1; }
-
-		//("round to" rounded=INT)?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"round to"
-		public Keyword getRoundToKeyword_3_0() { return cRoundToKeyword_3_0; }
-
+		
+		//(beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])?
+		public Alternatives getAlternatives_3_0() { return cAlternatives_3_0; }
+		
+		//beginRange=SINT
+		public Assignment getBeginRangeAssignment_3_0_0() { return cBeginRangeAssignment_3_0_0; }
+		
+		//SINT
+		public RuleCall getBeginRangeSINTParserRuleCall_3_0_0_0() { return cBeginRangeSINTParserRuleCall_3_0_0_0; }
+		
+		//beginRangeRef=[entity::LEntityAttribute]
+		public Assignment getBeginRangeRefAssignment_3_0_1() { return cBeginRangeRefAssignment_3_0_1; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0; }
+		
+		//ID
+		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1; }
+		
+		//'until'
+		public Keyword getUntilKeyword_3_1() { return cUntilKeyword_3_1; }
+		
+		//endRange=SINT | endRangeRef=[entity::LEntityAttribute]
+		public Alternatives getAlternatives_3_2() { return cAlternatives_3_2; }
+		
+		//endRange=SINT
+		public Assignment getEndRangeAssignment_3_2_0() { return cEndRangeAssignment_3_2_0; }
+		
+		//SINT
+		public RuleCall getEndRangeSINTParserRuleCall_3_2_0_0() { return cEndRangeSINTParserRuleCall_3_2_0_0; }
+		
+		//endRangeRef=[entity::LEntityAttribute]
+		public Assignment getEndRangeRefAssignment_3_2_1() { return cEndRangeRefAssignment_3_2_1; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getEndRangeRefLEntityAttributeCrossReference_3_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_3_2_1_0; }
+		
+		//ID
+		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1; }
+		
+		//('roundTo' rounded=INT)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'roundTo'
+		public Keyword getRoundToKeyword_4_0() { return cRoundToKeyword_4_0; }
+		
 		//rounded=INT
-		public Assignment getRoundedAssignment_3_1() { return cRoundedAssignment_3_1; }
-
+		public Assignment getRoundedAssignment_4_1() { return cRoundedAssignment_4_1; }
+		
 		//INT
-		public RuleCall getRoundedINTTerminalRuleCall_3_1_0() { return cRoundedINTTerminalRuleCall_3_1_0; }
+		public RuleCall getRoundedINTTerminalRuleCall_4_1_0() { return cRoundedINTTerminalRuleCall_4_1_0; }
 	}
-
 	public class PropertyFillerSignedIntegerRandomElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerSignedIntegerRandom");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerSignedIntegerRandom");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cSignedIntegerFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cIntegerPickKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cItemsAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cItemsSINTParserRuleCall_2_0 = (RuleCall)cItemsAssignment_2.eContents().get(0);
 		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//PropertyFillerSignedIntegerRandom:
-		//	"signed integer from" "(" items+=SINT+ ")";
-		public ParserRule getRule() { return rule; }
-
-		//"signed integer from" "(" items+=SINT+ ")"
+		//	'integerPick' '(' items+=SINT+ ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'integerPick' '(' items+=SINT+ ')'
 		public Group getGroup() { return cGroup; }
-
-		//"signed integer from"
-		public Keyword getSignedIntegerFromKeyword_0() { return cSignedIntegerFromKeyword_0; }
-
-		//"("
+		
+		//'integerPick'
+		public Keyword getIntegerPickKeyword_0() { return cIntegerPickKeyword_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
-
+		
 		//items+=SINT+
 		public Assignment getItemsAssignment_2() { return cItemsAssignment_2; }
-
+		
 		//SINT
 		public RuleCall getItemsSINTParserRuleCall_2_0() { return cItemsSINTParserRuleCall_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
 	}
-
 	public class PropertyFillerTextRandomElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerTextRandom");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerTextRandom");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cTextFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTextPickKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cItemsAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cItemsSTRINGTerminalRuleCall_2_0 = (RuleCall)cItemsAssignment_2.eContents().get(0);
 		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//PropertyFillerTextRandom:
-		//	"text from" "(" items+=STRING+ ")";
-		public ParserRule getRule() { return rule; }
-
-		//"text from" "(" items+=STRING+ ")"
+		//	'textPick' '(' items+=STRING+ ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'textPick' '(' items+=STRING+ ')'
 		public Group getGroup() { return cGroup; }
-
-		//"text from"
-		public Keyword getTextFromKeyword_0() { return cTextFromKeyword_0; }
-
-		//"("
+		
+		//'textPick'
+		public Keyword getTextPickKeyword_0() { return cTextPickKeyword_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
-
+		
 		//items+=STRING+
 		public Assignment getItemsAssignment_2() { return cItemsAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getItemsSTRINGTerminalRuleCall_2_0() { return cItemsSTRINGTerminalRuleCall_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
 	}
-
 	public class PropertyFillerTextParagraphsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerTextParagraphs");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerTextParagraphs");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerTextParagraphsAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cParagrapsKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cParagraphsKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cCountAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cCountINTTerminalRuleCall_2_0 = (RuleCall)cCountAssignment_2.eContents().get(0);
 		
 		//PropertyFillerTextParagraphs:
-		//	{PropertyFillerTextParagraphs} "paragraps" count=INT?;
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerTextParagraphs} "paragraps" count=INT?
+		//	{PropertyFillerTextParagraphs} 'paragraphs' count=INT?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerTextParagraphs} 'paragraphs' count=INT?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerTextParagraphs}
 		public Action getPropertyFillerTextParagraphsAction_0() { return cPropertyFillerTextParagraphsAction_0; }
-
-		//"paragraps"
-		public Keyword getParagrapsKeyword_1() { return cParagrapsKeyword_1; }
-
+		
+		//'paragraphs'
+		public Keyword getParagraphsKeyword_1() { return cParagraphsKeyword_1; }
+		
 		//count=INT?
 		public Assignment getCountAssignment_2() { return cCountAssignment_2; }
-
+		
 		//INT
 		public RuleCall getCountINTTerminalRuleCall_2_0() { return cCountINTTerminalRuleCall_2_0; }
 	}
-
 	public class PropertyFillerTextSentencesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerTextSentences");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerTextSentences");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerTextSentencesAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cSentencesKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1678,27 +1672,26 @@
 		private final RuleCall cCountINTTerminalRuleCall_2_0 = (RuleCall)cCountAssignment_2.eContents().get(0);
 		
 		//PropertyFillerTextSentences:
-		//	{PropertyFillerTextSentences} "sentences" count=INT?;
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerTextSentences} "sentences" count=INT?
+		//	{PropertyFillerTextSentences} 'sentences' count=INT?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerTextSentences} 'sentences' count=INT?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerTextSentences}
 		public Action getPropertyFillerTextSentencesAction_0() { return cPropertyFillerTextSentencesAction_0; }
-
-		//"sentences"
+		
+		//'sentences'
 		public Keyword getSentencesKeyword_1() { return cSentencesKeyword_1; }
-
+		
 		//count=INT?
 		public Assignment getCountAssignment_2() { return cCountAssignment_2; }
-
+		
 		//INT
 		public RuleCall getCountINTTerminalRuleCall_2_0() { return cCountINTTerminalRuleCall_2_0; }
 	}
-
 	public class PropertyFillerTextWordsElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerTextWords");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerTextWords");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerTextWordsAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cWordsKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -1706,370 +1699,342 @@
 		private final RuleCall cCountINTTerminalRuleCall_2_0 = (RuleCall)cCountAssignment_2.eContents().get(0);
 		
 		//PropertyFillerTextWords:
-		//	{PropertyFillerTextWords} "words" count=INT?;
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerTextWords} "words" count=INT?
+		//	{PropertyFillerTextWords} 'words' count=INT?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerTextWords} 'words' count=INT?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerTextWords}
 		public Action getPropertyFillerTextWordsAction_0() { return cPropertyFillerTextWordsAction_0; }
-
-		//"words"
+		
+		//'words'
 		public Keyword getWordsKeyword_1() { return cWordsKeyword_1; }
-
+		
 		//count=INT?
 		public Assignment getCountAssignment_2() { return cCountAssignment_2; }
-
+		
 		//INT
 		public RuleCall getCountINTTerminalRuleCall_2_0() { return cCountINTTerminalRuleCall_2_0; }
 	}
-
 	public class PropertyFillerUnsignedDoubleRangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerUnsignedDoubleRange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerUnsignedDoubleRange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cUnsignedDoubleInRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
-		private final Alternatives cAlternatives_1_0 = (Alternatives)cGroup_1.eContents().get(0);
-		private final Assignment cBeginRangeAssignment_1_0_0 = (Assignment)cAlternatives_1_0.eContents().get(0);
-		private final RuleCall cBeginRangeUnsignedNumberParserRuleCall_1_0_0_0 = (RuleCall)cBeginRangeAssignment_1_0_0.eContents().get(0);
-		private final Assignment cBeginRangeRefAssignment_1_0_1 = (Assignment)cAlternatives_1_0.eContents().get(1);
-		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0 = (CrossReference)cBeginRangeRefAssignment_1_0_1.eContents().get(0);
-		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0.eContents().get(1);
-		private final Keyword cUpToAndIncludingKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
-		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
-		private final Assignment cEndRangeAssignment_1_2_0 = (Assignment)cAlternatives_1_2.eContents().get(0);
-		private final RuleCall cEndRangeUnsignedNumberParserRuleCall_1_2_0_0 = (RuleCall)cEndRangeAssignment_1_2_0.eContents().get(0);
-		private final Assignment cEndRangeRefAssignment_1_2_1 = (Assignment)cAlternatives_1_2.eContents().get(1);
-		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_1_2_1_0 = (CrossReference)cEndRangeRefAssignment_1_2_1.eContents().get(0);
-		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_1_2_1_0.eContents().get(1);
-		private final Keyword cWithKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		private final Assignment cDecimalsAssignment_3 = (Assignment)cGroup.eContents().get(3);
-		private final RuleCall cDecimalsINTTerminalRuleCall_3_0 = (RuleCall)cDecimalsAssignment_3.eContents().get(0);
-		private final Keyword cDecimalsKeyword_4 = (Keyword)cGroup.eContents().get(4);
-		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
-		private final Keyword cRoundToKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
-		private final Assignment cRoundedAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
-		private final RuleCall cRoundedUnsignedNumberParserRuleCall_5_1_0 = (RuleCall)cRoundedAssignment_5_1.eContents().get(0);
+		private final Keyword cUnsignedNumberRangeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cFromKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Alternatives cAlternatives_2_0 = (Alternatives)cGroup_2.eContents().get(0);
+		private final Assignment cBeginRangeAssignment_2_0_0 = (Assignment)cAlternatives_2_0.eContents().get(0);
+		private final RuleCall cBeginRangeUnsignedNumberParserRuleCall_2_0_0_0 = (RuleCall)cBeginRangeAssignment_2_0_0.eContents().get(0);
+		private final Assignment cBeginRangeRefAssignment_2_0_1 = (Assignment)cAlternatives_2_0.eContents().get(1);
+		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0 = (CrossReference)cBeginRangeRefAssignment_2_0_1.eContents().get(0);
+		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0.eContents().get(1);
+		private final Keyword cUntilKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
+		private final Assignment cEndRangeAssignment_2_2_0 = (Assignment)cAlternatives_2_2.eContents().get(0);
+		private final RuleCall cEndRangeUnsignedNumberParserRuleCall_2_2_0_0 = (RuleCall)cEndRangeAssignment_2_2_0.eContents().get(0);
+		private final Assignment cEndRangeRefAssignment_2_2_1 = (Assignment)cAlternatives_2_2.eContents().get(1);
+		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_2_2_1_0 = (CrossReference)cEndRangeRefAssignment_2_2_1.eContents().get(0);
+		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_2_2_1_0.eContents().get(1);
+		private final Keyword cWithKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cDecimalsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cDecimalsINTTerminalRuleCall_4_0 = (RuleCall)cDecimalsAssignment_4.eContents().get(0);
+		private final Keyword cDecimalsKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cRoundToKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cRoundedAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cRoundedUnsignedNumberParserRuleCall_6_1_0 = (RuleCall)cRoundedAssignment_6_1.eContents().get(0);
 		
 		//PropertyFillerUnsignedDoubleRange:
-		//	"unsigned double in range" ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])?
-		//	"up to and including" (endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT
-		//	"decimals" ("round to" rounded=UnsignedNumber)?;
-		public ParserRule getRule() { return rule; }
-
-		//"unsigned double in range" ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])?
-		//"up to and including" (endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT
-		//"decimals" ("round to" rounded=UnsignedNumber)?
+		//	'unsignedNumberRange' 'from' ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+		//	(endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))?
+		//	'with' decimals=INT 'decimals' ('roundTo' rounded=UnsignedNumber)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'unsignedNumberRange' 'from' ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+		//(endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))? 'with' decimals=INT 'decimals' ('roundTo'
+		//rounded=UnsignedNumber)?
 		public Group getGroup() { return cGroup; }
-
-		//"unsigned double in range"
-		public Keyword getUnsignedDoubleInRangeKeyword_0() { return cUnsignedDoubleInRangeKeyword_0; }
-
-		//((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=UnsignedNumber
-		//| endRangeRef=[entity::LEntityAttribute]))?
-		public Group getGroup_1() { return cGroup_1; }
-
+		
+		//'unsignedNumberRange'
+		public Keyword getUnsignedNumberRangeKeyword_0() { return cUnsignedNumberRangeKeyword_0; }
+		
+		//'from'
+		public Keyword getFromKeyword_1() { return cFromKeyword_1; }
+		
+		//((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=UnsignedNumber |
+		//endRangeRef=[entity::LEntityAttribute]))?
+		public Group getGroup_2() { return cGroup_2; }
+		
 		//(beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])?
-		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
-
+		public Alternatives getAlternatives_2_0() { return cAlternatives_2_0; }
+		
 		//beginRange=UnsignedNumber
-		public Assignment getBeginRangeAssignment_1_0_0() { return cBeginRangeAssignment_1_0_0; }
-
+		public Assignment getBeginRangeAssignment_2_0_0() { return cBeginRangeAssignment_2_0_0; }
+		
 		//UnsignedNumber
-		public RuleCall getBeginRangeUnsignedNumberParserRuleCall_1_0_0_0() { return cBeginRangeUnsignedNumberParserRuleCall_1_0_0_0; }
-
+		public RuleCall getBeginRangeUnsignedNumberParserRuleCall_2_0_0_0() { return cBeginRangeUnsignedNumberParserRuleCall_2_0_0_0; }
+		
 		//beginRangeRef=[entity::LEntityAttribute]
-		public Assignment getBeginRangeRefAssignment_1_0_1() { return cBeginRangeRefAssignment_1_0_1; }
-
+		public Assignment getBeginRangeRefAssignment_2_0_1() { return cBeginRangeRefAssignment_2_0_1; }
+		
 		//[entity::LEntityAttribute]
-		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_1_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_1_0_1_0; }
-
+		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0; }
+		
 		//ID
-		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_1_0_1_0_1; }
-
-		//"up to and including"
-		public Keyword getUpToAndIncludingKeyword_1_1() { return cUpToAndIncludingKeyword_1_1; }
-
+		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1; }
+		
+		//'until'
+		public Keyword getUntilKeyword_2_1() { return cUntilKeyword_2_1; }
+		
 		//endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]
-		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
-
+		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
+		
 		//endRange=UnsignedNumber
-		public Assignment getEndRangeAssignment_1_2_0() { return cEndRangeAssignment_1_2_0; }
-
+		public Assignment getEndRangeAssignment_2_2_0() { return cEndRangeAssignment_2_2_0; }
+		
 		//UnsignedNumber
-		public RuleCall getEndRangeUnsignedNumberParserRuleCall_1_2_0_0() { return cEndRangeUnsignedNumberParserRuleCall_1_2_0_0; }
-
+		public RuleCall getEndRangeUnsignedNumberParserRuleCall_2_2_0_0() { return cEndRangeUnsignedNumberParserRuleCall_2_2_0_0; }
+		
 		//endRangeRef=[entity::LEntityAttribute]
-		public Assignment getEndRangeRefAssignment_1_2_1() { return cEndRangeRefAssignment_1_2_1; }
-
+		public Assignment getEndRangeRefAssignment_2_2_1() { return cEndRangeRefAssignment_2_2_1; }
+		
 		//[entity::LEntityAttribute]
-		public CrossReference getEndRangeRefLEntityAttributeCrossReference_1_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_1_2_1_0; }
-
+		public CrossReference getEndRangeRefLEntityAttributeCrossReference_2_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_2_2_1_0; }
+		
 		//ID
-		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_1_2_1_0_1; }
-
-		//"with"
-		public Keyword getWithKeyword_2() { return cWithKeyword_2; }
-
+		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1; }
+		
+		//'with'
+		public Keyword getWithKeyword_3() { return cWithKeyword_3; }
+		
 		//decimals=INT
-		public Assignment getDecimalsAssignment_3() { return cDecimalsAssignment_3; }
-
+		public Assignment getDecimalsAssignment_4() { return cDecimalsAssignment_4; }
+		
 		//INT
-		public RuleCall getDecimalsINTTerminalRuleCall_3_0() { return cDecimalsINTTerminalRuleCall_3_0; }
-
-		//"decimals"
-		public Keyword getDecimalsKeyword_4() { return cDecimalsKeyword_4; }
-
-		//("round to" rounded=UnsignedNumber)?
-		public Group getGroup_5() { return cGroup_5; }
-
-		//"round to"
-		public Keyword getRoundToKeyword_5_0() { return cRoundToKeyword_5_0; }
-
+		public RuleCall getDecimalsINTTerminalRuleCall_4_0() { return cDecimalsINTTerminalRuleCall_4_0; }
+		
+		//'decimals'
+		public Keyword getDecimalsKeyword_5() { return cDecimalsKeyword_5; }
+		
+		//('roundTo' rounded=UnsignedNumber)?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'roundTo'
+		public Keyword getRoundToKeyword_6_0() { return cRoundToKeyword_6_0; }
+		
 		//rounded=UnsignedNumber
-		public Assignment getRoundedAssignment_5_1() { return cRoundedAssignment_5_1; }
-
+		public Assignment getRoundedAssignment_6_1() { return cRoundedAssignment_6_1; }
+		
 		//UnsignedNumber
-		public RuleCall getRoundedUnsignedNumberParserRuleCall_5_1_0() { return cRoundedUnsignedNumberParserRuleCall_5_1_0; }
+		public RuleCall getRoundedUnsignedNumberParserRuleCall_6_1_0() { return cRoundedUnsignedNumberParserRuleCall_6_1_0; }
 	}
-
 	public class PropertyFillerUnsignedDoubleRandomElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerUnsignedDoubleRandom");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerUnsignedDoubleRandom");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cUnsignedDoubleFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cUnsignedNumberPickKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cItemsAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cItemsUnsignedNumberParserRuleCall_2_0 = (RuleCall)cItemsAssignment_2.eContents().get(0);
 		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//PropertyFillerUnsignedDoubleRandom:
-		//	"unsigned double from" "(" items+=UnsignedNumber+ ")";
-		public ParserRule getRule() { return rule; }
-
-		//"unsigned double from" "(" items+=UnsignedNumber+ ")"
+		//	'unsignedNumberPick' '(' items+=UnsignedNumber+ ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'unsignedNumberPick' '(' items+=UnsignedNumber+ ')'
 		public Group getGroup() { return cGroup; }
-
-		//"unsigned double from"
-		public Keyword getUnsignedDoubleFromKeyword_0() { return cUnsignedDoubleFromKeyword_0; }
-
-		//"("
+		
+		//'unsignedNumberPick'
+		public Keyword getUnsignedNumberPickKeyword_0() { return cUnsignedNumberPickKeyword_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
-
+		
 		//items+=UnsignedNumber+
 		public Assignment getItemsAssignment_2() { return cItemsAssignment_2; }
-
+		
 		//UnsignedNumber
 		public RuleCall getItemsUnsignedNumberParserRuleCall_2_0() { return cItemsUnsignedNumberParserRuleCall_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
 	}
-
 	public class PropertyFillerUnsignedIntegerRangeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerUnsignedIntegerRange");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerUnsignedIntegerRange");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cPropertyFillerUnsignedIntegerRangeAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cUnsignedIntegerInRangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
-		private final Alternatives cAlternatives_2_0 = (Alternatives)cGroup_2.eContents().get(0);
-		private final Assignment cBeginRangeAssignment_2_0_0 = (Assignment)cAlternatives_2_0.eContents().get(0);
-		private final RuleCall cBeginRangeINTTerminalRuleCall_2_0_0_0 = (RuleCall)cBeginRangeAssignment_2_0_0.eContents().get(0);
-		private final Assignment cBeginRangeRefAssignment_2_0_1 = (Assignment)cAlternatives_2_0.eContents().get(1);
-		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0 = (CrossReference)cBeginRangeRefAssignment_2_0_1.eContents().get(0);
-		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0.eContents().get(1);
-		private final Keyword cUpToAndIncludingKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
-		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
-		private final Assignment cEndRangeAssignment_2_2_0 = (Assignment)cAlternatives_2_2.eContents().get(0);
-		private final RuleCall cEndRangeINTTerminalRuleCall_2_2_0_0 = (RuleCall)cEndRangeAssignment_2_2_0.eContents().get(0);
-		private final Assignment cEndRangeRefAssignment_2_2_1 = (Assignment)cAlternatives_2_2.eContents().get(1);
-		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_2_2_1_0 = (CrossReference)cEndRangeRefAssignment_2_2_1.eContents().get(0);
-		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_2_2_1_0.eContents().get(1);
+		private final Keyword cUnsignedIntegerRangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cFromKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
-		private final Keyword cRoundToKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
-		private final Assignment cRoundedAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cRoundedINTTerminalRuleCall_3_1_0 = (RuleCall)cRoundedAssignment_3_1.eContents().get(0);
+		private final Alternatives cAlternatives_3_0 = (Alternatives)cGroup_3.eContents().get(0);
+		private final Assignment cBeginRangeAssignment_3_0_0 = (Assignment)cAlternatives_3_0.eContents().get(0);
+		private final RuleCall cBeginRangeINTTerminalRuleCall_3_0_0_0 = (RuleCall)cBeginRangeAssignment_3_0_0.eContents().get(0);
+		private final Assignment cBeginRangeRefAssignment_3_0_1 = (Assignment)cAlternatives_3_0.eContents().get(1);
+		private final CrossReference cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0 = (CrossReference)cBeginRangeRefAssignment_3_0_1.eContents().get(0);
+		private final RuleCall cBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1 = (RuleCall)cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0.eContents().get(1);
+		private final Keyword cUntilKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_3_2 = (Alternatives)cGroup_3.eContents().get(2);
+		private final Assignment cEndRangeAssignment_3_2_0 = (Assignment)cAlternatives_3_2.eContents().get(0);
+		private final RuleCall cEndRangeINTTerminalRuleCall_3_2_0_0 = (RuleCall)cEndRangeAssignment_3_2_0.eContents().get(0);
+		private final Assignment cEndRangeRefAssignment_3_2_1 = (Assignment)cAlternatives_3_2.eContents().get(1);
+		private final CrossReference cEndRangeRefLEntityAttributeCrossReference_3_2_1_0 = (CrossReference)cEndRangeRefAssignment_3_2_1.eContents().get(0);
+		private final RuleCall cEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1 = (RuleCall)cEndRangeRefLEntityAttributeCrossReference_3_2_1_0.eContents().get(1);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cRoundToKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cRoundedAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cRoundedINTTerminalRuleCall_4_1_0 = (RuleCall)cRoundedAssignment_4_1.eContents().get(0);
 		
 		//PropertyFillerUnsignedIntegerRange:
-		//	{PropertyFillerUnsignedIntegerRange} "unsigned integer in range" ((beginRange=INT |
-		//	beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=INT |
-		//	endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?;
-		public ParserRule getRule() { return rule; }
-
-		//{PropertyFillerUnsignedIntegerRange} "unsigned integer in range" ((beginRange=INT |
-		//beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=INT |
-		//endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?
+		//	{PropertyFillerUnsignedIntegerRange} 'unsignedIntegerRange' 'from' ((beginRange=INT |
+		//	beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=INT | endRangeRef=[entity::LEntityAttribute]))?
+		//	('roundTo' rounded=INT)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{PropertyFillerUnsignedIntegerRange} 'unsignedIntegerRange' 'from' ((beginRange=INT |
+		//beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=INT | endRangeRef=[entity::LEntityAttribute]))? ('roundTo'
+		//rounded=INT)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{PropertyFillerUnsignedIntegerRange}
 		public Action getPropertyFillerUnsignedIntegerRangeAction_0() { return cPropertyFillerUnsignedIntegerRangeAction_0; }
-
-		//"unsigned integer in range"
-		public Keyword getUnsignedIntegerInRangeKeyword_1() { return cUnsignedIntegerInRangeKeyword_1; }
-
-		//((beginRange=INT | beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=INT |
+		
+		//'unsignedIntegerRange'
+		public Keyword getUnsignedIntegerRangeKeyword_1() { return cUnsignedIntegerRangeKeyword_1; }
+		
+		//'from'
+		public Keyword getFromKeyword_2() { return cFromKeyword_2; }
+		
+		//((beginRange=INT | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=INT |
 		//endRangeRef=[entity::LEntityAttribute]))?
-		public Group getGroup_2() { return cGroup_2; }
-
-		//(beginRange=INT | beginRangeRef=[entity::LEntityAttribute])?
-		public Alternatives getAlternatives_2_0() { return cAlternatives_2_0; }
-
-		//beginRange=INT
-		public Assignment getBeginRangeAssignment_2_0_0() { return cBeginRangeAssignment_2_0_0; }
-
-		//INT
-		public RuleCall getBeginRangeINTTerminalRuleCall_2_0_0_0() { return cBeginRangeINTTerminalRuleCall_2_0_0_0; }
-
-		//beginRangeRef=[entity::LEntityAttribute]
-		public Assignment getBeginRangeRefAssignment_2_0_1() { return cBeginRangeRefAssignment_2_0_1; }
-
-		//[entity::LEntityAttribute]
-		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_2_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_2_0_1_0; }
-
-		//ID
-		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_2_0_1_0_1; }
-
-		//"up to and including"
-		public Keyword getUpToAndIncludingKeyword_2_1() { return cUpToAndIncludingKeyword_2_1; }
-
-		//endRange=INT | endRangeRef=[entity::LEntityAttribute]
-		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
-
-		//endRange=INT
-		public Assignment getEndRangeAssignment_2_2_0() { return cEndRangeAssignment_2_2_0; }
-
-		//INT
-		public RuleCall getEndRangeINTTerminalRuleCall_2_2_0_0() { return cEndRangeINTTerminalRuleCall_2_2_0_0; }
-
-		//endRangeRef=[entity::LEntityAttribute]
-		public Assignment getEndRangeRefAssignment_2_2_1() { return cEndRangeRefAssignment_2_2_1; }
-
-		//[entity::LEntityAttribute]
-		public CrossReference getEndRangeRefLEntityAttributeCrossReference_2_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_2_2_1_0; }
-
-		//ID
-		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_2_2_1_0_1; }
-
-		//("round to" rounded=INT)?
 		public Group getGroup_3() { return cGroup_3; }
-
-		//"round to"
-		public Keyword getRoundToKeyword_3_0() { return cRoundToKeyword_3_0; }
-
-		//rounded=INT
-		public Assignment getRoundedAssignment_3_1() { return cRoundedAssignment_3_1; }
-
+		
+		//(beginRange=INT | beginRangeRef=[entity::LEntityAttribute])?
+		public Alternatives getAlternatives_3_0() { return cAlternatives_3_0; }
+		
+		//beginRange=INT
+		public Assignment getBeginRangeAssignment_3_0_0() { return cBeginRangeAssignment_3_0_0; }
+		
 		//INT
-		public RuleCall getRoundedINTTerminalRuleCall_3_1_0() { return cRoundedINTTerminalRuleCall_3_1_0; }
+		public RuleCall getBeginRangeINTTerminalRuleCall_3_0_0_0() { return cBeginRangeINTTerminalRuleCall_3_0_0_0; }
+		
+		//beginRangeRef=[entity::LEntityAttribute]
+		public Assignment getBeginRangeRefAssignment_3_0_1() { return cBeginRangeRefAssignment_3_0_1; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getBeginRangeRefLEntityAttributeCrossReference_3_0_1_0() { return cBeginRangeRefLEntityAttributeCrossReference_3_0_1_0; }
+		
+		//ID
+		public RuleCall getBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1() { return cBeginRangeRefLEntityAttributeIDTerminalRuleCall_3_0_1_0_1; }
+		
+		//'until'
+		public Keyword getUntilKeyword_3_1() { return cUntilKeyword_3_1; }
+		
+		//endRange=INT | endRangeRef=[entity::LEntityAttribute]
+		public Alternatives getAlternatives_3_2() { return cAlternatives_3_2; }
+		
+		//endRange=INT
+		public Assignment getEndRangeAssignment_3_2_0() { return cEndRangeAssignment_3_2_0; }
+		
+		//INT
+		public RuleCall getEndRangeINTTerminalRuleCall_3_2_0_0() { return cEndRangeINTTerminalRuleCall_3_2_0_0; }
+		
+		//endRangeRef=[entity::LEntityAttribute]
+		public Assignment getEndRangeRefAssignment_3_2_1() { return cEndRangeRefAssignment_3_2_1; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getEndRangeRefLEntityAttributeCrossReference_3_2_1_0() { return cEndRangeRefLEntityAttributeCrossReference_3_2_1_0; }
+		
+		//ID
+		public RuleCall getEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1() { return cEndRangeRefLEntityAttributeIDTerminalRuleCall_3_2_1_0_1; }
+		
+		//('roundTo' rounded=INT)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'roundTo'
+		public Keyword getRoundToKeyword_4_0() { return cRoundToKeyword_4_0; }
+		
+		//rounded=INT
+		public Assignment getRoundedAssignment_4_1() { return cRoundedAssignment_4_1; }
+		
+		//INT
+		public RuleCall getRoundedINTTerminalRuleCall_4_1_0() { return cRoundedINTTerminalRuleCall_4_1_0; }
 	}
-
 	public class PropertyFillerUnsignedIntegerRandomElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyFillerUnsignedIntegerRandom");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.PropertyFillerUnsignedIntegerRandom");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cUnsignedIntegerFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cUnsignedIntegerPickKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cItemsAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cItemsINTTerminalRuleCall_2_0 = (RuleCall)cItemsAssignment_2.eContents().get(0);
 		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		
 		//PropertyFillerUnsignedIntegerRandom:
-		//	"unsigned integer from" "(" items+=INT+ ")";
-		public ParserRule getRule() { return rule; }
-
-		//"unsigned integer from" "(" items+=INT+ ")"
+		//	'unsignedIntegerPick' '(' items+=INT+ ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'unsignedIntegerPick' '(' items+=INT+ ')'
 		public Group getGroup() { return cGroup; }
-
-		//"unsigned integer from"
-		public Keyword getUnsignedIntegerFromKeyword_0() { return cUnsignedIntegerFromKeyword_0; }
-
-		//"("
+		
+		//'unsignedIntegerPick'
+		public Keyword getUnsignedIntegerPickKeyword_0() { return cUnsignedIntegerPickKeyword_0; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
-
+		
 		//items+=INT+
 		public Assignment getItemsAssignment_2() { return cItemsAssignment_2; }
-
+		
 		//INT
 		public RuleCall getItemsINTTerminalRuleCall_2_0() { return cItemsINTTerminalRuleCall_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
 	}
-
-	public class EntityMockDataTypeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockDataType");
-		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cDatatypeKeyword_0 = (Keyword)cGroup.eContents().get(0);
-		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
-		private final Keyword cRightCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
-		
-		//EntityMockDataType:
-		//	"datatype" name=QualifiedName "{" "}";
-		public ParserRule getRule() { return rule; }
-
-		//"datatype" name=QualifiedName "{" "}"
-		public Group getGroup() { return cGroup; }
-
-		//"datatype"
-		public Keyword getDatatypeKeyword_0() { return cDatatypeKeyword_0; }
-
-		//name=QualifiedName
-		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"{"
-		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
-		//"}"
-		public Keyword getRightCurlyBracketKeyword_3() { return cRightCurlyBracketKeyword_3; }
-	}
-
 	public class EntityMockEntitiesElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockEntities");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntities");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockEntitiesAction_0 = (Action)cGroup.eContents().get(0);
-		private final Keyword cMockEntitiesKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cEntitiesKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cEntitiesAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cEntitiesEntityMockEntityParserRuleCall_3_0 = (RuleCall)cEntitiesAssignment_3.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//EntityMockEntities:
-		//	{EntityMockEntities} "mock entities" "{" entities+=EntityMockEntity* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockEntities} "mock entities" "{" entities+=EntityMockEntity* "}"
+		//	{EntityMockEntities} 'entities' '{'
+		//	entities+=EntityMockEntity*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockEntities} 'entities' '{' entities+=EntityMockEntity* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockEntities}
 		public Action getEntityMockEntitiesAction_0() { return cEntityMockEntitiesAction_0; }
-
-		//"mock entities"
-		public Keyword getMockEntitiesKeyword_1() { return cMockEntitiesKeyword_1; }
-
-		//"{"
+		
+		//'entities'
+		public Keyword getEntitiesKeyword_1() { return cEntitiesKeyword_1; }
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
-
+		
 		//entities+=EntityMockEntity*
 		public Assignment getEntitiesAssignment_3() { return cEntitiesAssignment_3; }
-
+		
 		//EntityMockEntity
 		public RuleCall getEntitiesEntityMockEntityParserRuleCall_3_0() { return cEntitiesEntityMockEntityParserRuleCall_3_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
 	}
-
 	public class EntityMockEntityElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockEntity");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntity");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cMockingKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
-		private final Keyword cForEntityKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cEntityKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cEntityRefAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final CrossReference cEntityRefLEntityCrossReference_3_0 = (CrossReference)cEntityRefAssignment_3.eContents().get(0);
 		private final RuleCall cEntityRefLEntityIDTerminalRuleCall_3_0_1 = (RuleCall)cEntityRefLEntityCrossReference_3_0.eContents().get(1);
@@ -2082,24 +2047,25 @@
 		private final Assignment cMaxRowsAssignment_4_0_3 = (Assignment)cGroup_4_0.eContents().get(3);
 		private final RuleCall cMaxRowsINTTerminalRuleCall_4_0_3_0 = (RuleCall)cMaxRowsAssignment_4_0_3.eContents().get(0);
 		private final Keyword cLeftCurlyBracketKeyword_4_0_4 = (Keyword)cGroup_4_0.eContents().get(4);
-		private final Assignment cTemporariesAssignment_4_0_5 = (Assignment)cGroup_4_0.eContents().get(5);
-		private final RuleCall cTemporariesEntityMockTemporaryParserRuleCall_4_0_5_0 = (RuleCall)cTemporariesAssignment_4_0_5.eContents().get(0);
+		private final Assignment cTemplatesAssignment_4_0_5 = (Assignment)cGroup_4_0.eContents().get(5);
+		private final RuleCall cTemplatesEntityMockTemplateParserRuleCall_4_0_5_0 = (RuleCall)cTemplatesAssignment_4_0_5.eContents().get(0);
 		private final Assignment cAttributesAssignment_4_0_6 = (Assignment)cGroup_4_0.eContents().get(6);
 		private final RuleCall cAttributesIEntityMockAttributeParserRuleCall_4_0_6_0 = (RuleCall)cAttributesAssignment_4_0_6.eContents().get(0);
 		private final Assignment cCalculationsAssignment_4_0_7 = (Assignment)cGroup_4_0.eContents().get(7);
 		private final RuleCall cCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0 = (RuleCall)cCalculationsAssignment_4_0_7.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_4_0_8 = (Keyword)cGroup_4_0.eContents().get(8);
 		private final Group cGroup_4_1 = (Group)cAlternatives_4.eContents().get(1);
-		private final Keyword cByResourceKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
+		private final Keyword cResourceKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
 		private final Assignment cByResourceAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
 		private final CrossReference cByResourceEntityMockResourceCrossReference_4_1_1_0 = (CrossReference)cByResourceAssignment_4_1_1.eContents().get(0);
 		private final RuleCall cByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1 = (RuleCall)cByResourceEntityMockResourceCrossReference_4_1_1_0.eContents().get(1);
 		private final Keyword cLeftCurlyBracketKeyword_4_1_2 = (Keyword)cGroup_4_1.eContents().get(2);
-		private final Assignment cByResourceAttributesAssignment_4_1_3 = (Assignment)cGroup_4_1.eContents().get(3);
-		private final RuleCall cByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0 = (RuleCall)cByResourceAttributesAssignment_4_1_3.eContents().get(0);
-		private final Assignment cCreateBlobMappingAssignment_4_1_4 = (Assignment)cGroup_4_1.eContents().get(4);
-		private final Keyword cCreateBlobMappingCreateBlobMappingKeyword_4_1_4_0 = (Keyword)cCreateBlobMappingAssignment_4_1_4.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_4_1_5 = (Keyword)cGroup_4_1.eContents().get(5);
+		private final UnorderedGroup cUnorderedGroup_4_1_3 = (UnorderedGroup)cGroup_4_1.eContents().get(3);
+		private final Assignment cByResourceAttributesAssignment_4_1_3_0 = (Assignment)cUnorderedGroup_4_1_3.eContents().get(0);
+		private final RuleCall cByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0 = (RuleCall)cByResourceAttributesAssignment_4_1_3_0.eContents().get(0);
+		private final Assignment cCreateBlobMappingAssignment_4_1_3_1 = (Assignment)cUnorderedGroup_4_1_3.eContents().get(1);
+		private final Keyword cCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0 = (Keyword)cCreateBlobMappingAssignment_4_1_3_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4_1_4 = (Keyword)cGroup_4_1.eContents().get(4);
 		private final Group cGroup_4_2 = (Group)cAlternatives_4.eContents().get(2);
 		private final Keyword cIterateKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
 		private final Assignment cIteratorAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
@@ -2109,8 +2075,8 @@
 		private final Assignment cIterateAssignment_4_2_3 = (Assignment)cGroup_4_2.eContents().get(3);
 		private final RuleCall cIterateIIterateParserRuleCall_4_2_3_0 = (RuleCall)cIterateAssignment_4_2_3.eContents().get(0);
 		private final Keyword cLeftCurlyBracketKeyword_4_2_4 = (Keyword)cGroup_4_2.eContents().get(4);
-		private final Assignment cTemporariesAssignment_4_2_5 = (Assignment)cGroup_4_2.eContents().get(5);
-		private final RuleCall cTemporariesEntityMockTemporaryParserRuleCall_4_2_5_0 = (RuleCall)cTemporariesAssignment_4_2_5.eContents().get(0);
+		private final Assignment cTemplatesAssignment_4_2_5 = (Assignment)cGroup_4_2.eContents().get(5);
+		private final RuleCall cTemplatesEntityMockTemplateParserRuleCall_4_2_5_0 = (RuleCall)cTemplatesAssignment_4_2_5.eContents().get(0);
 		private final Assignment cAttributesAssignment_4_2_6 = (Assignment)cGroup_4_2.eContents().get(6);
 		private final RuleCall cAttributesIEntityMockAttributeParserRuleCall_4_2_6_0 = (RuleCall)cAttributesAssignment_4_2_6.eContents().get(0);
 		private final Assignment cCalculationsAssignment_4_2_7 = (Assignment)cGroup_4_2.eContents().get(7);
@@ -2118,200 +2084,208 @@
 		private final Keyword cRightCurlyBracketKeyword_4_2_8 = (Keyword)cGroup_4_2.eContents().get(8);
 		
 		//EntityMockEntity:
-		//	"mocking" name=QualifiedName "for entity" entityRef=[entity::LEntity] ("rows" minRows=INT "to" maxRows=INT "{"
-		//	temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}" |
-		//	"by resource" byResource=[EntityMockResource] "{" byResourceAttributes+=EntityMockByResourceAttribute*
-		//	createBlobMapping?="createBlobMapping"? "}" | "iterate" iterator=[entity::LEntityAttribute] "with" iterate=IIterate
-		//	"{" temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}");
-		public ParserRule getRule() { return rule; }
-
-		//"mocking" name=QualifiedName "for entity" entityRef=[entity::LEntity] ("rows" minRows=INT "to" maxRows=INT "{"
-		//temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}" |
-		//"by resource" byResource=[EntityMockResource] "{" byResourceAttributes+=EntityMockByResourceAttribute*
-		//createBlobMapping?="createBlobMapping"? "}" | "iterate" iterator=[entity::LEntityAttribute] "with" iterate=IIterate
-		//"{" temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}")
+		//	'mocking' name=ID 'entity' entityRef=[entity::LEntity] ('rows' minRows=INT 'to' maxRows=INT '{'
+		//	templates+=EntityMockTemplate*
+		//	attributes+=IEntityMockAttribute*
+		//	calculations+=EntityMockEntityFunction*
+		//	'}' | 'resource' byResource=[EntityMockResource] '{' (byResourceAttributes+=EntityMockByResourceAttribute* &
+		//	createBlobMapping?='createBlobMapping'?)
+		//	'}' | 'iterate' iterator=[entity::LEntityAttribute]
+		//	'with' iterate=IIterate '{'
+		//	templates+=EntityMockTemplate*
+		//	attributes+=IEntityMockAttribute*
+		//	calculations+=EntityMockEntityFunction*
+		//	'}');
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'mocking' name=ID 'entity' entityRef=[entity::LEntity] ('rows' minRows=INT 'to' maxRows=INT '{'
+		//templates+=EntityMockTemplate* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* '}' |
+		//'resource' byResource=[EntityMockResource] '{' (byResourceAttributes+=EntityMockByResourceAttribute* &
+		//createBlobMapping?='createBlobMapping'?) '}' | 'iterate' iterator=[entity::LEntityAttribute] 'with' iterate=IIterate
+		//'{' templates+=EntityMockTemplate* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* '}')
 		public Group getGroup() { return cGroup; }
-
-		//"mocking"
+		
+		//'mocking'
 		public Keyword getMockingKeyword_0() { return cMockingKeyword_0; }
-
-		//name=QualifiedName
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"for entity"
-		public Keyword getForEntityKeyword_2() { return cForEntityKeyword_2; }
-
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'entity'
+		public Keyword getEntityKeyword_2() { return cEntityKeyword_2; }
+		
 		//entityRef=[entity::LEntity]
 		public Assignment getEntityRefAssignment_3() { return cEntityRefAssignment_3; }
-
+		
 		//[entity::LEntity]
 		public CrossReference getEntityRefLEntityCrossReference_3_0() { return cEntityRefLEntityCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getEntityRefLEntityIDTerminalRuleCall_3_0_1() { return cEntityRefLEntityIDTerminalRuleCall_3_0_1; }
-
-		//"rows" minRows=INT "to" maxRows=INT "{" temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute*
-		//calculations+=EntityMockEntityFunction* "}" | "by resource" byResource=[EntityMockResource] "{"
-		//byResourceAttributes+=EntityMockByResourceAttribute* createBlobMapping?="createBlobMapping"? "}" | "iterate"
-		//iterator=[entity::LEntityAttribute] "with" iterate=IIterate "{" temporaries+=EntityMockTemporary*
-		//attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}"
+		
+		//'rows' minRows=INT 'to' maxRows=INT '{' templates+=EntityMockTemplate* attributes+=IEntityMockAttribute*
+		//calculations+=EntityMockEntityFunction* '}' | 'resource' byResource=[EntityMockResource] '{'
+		//(byResourceAttributes+=EntityMockByResourceAttribute* & createBlobMapping?='createBlobMapping'?) '}' | 'iterate'
+		//iterator=[entity::LEntityAttribute] 'with' iterate=IIterate '{' templates+=EntityMockTemplate*
+		//attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* '}'
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
-
-		//"rows" minRows=INT "to" maxRows=INT "{" temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute*
-		//calculations+=EntityMockEntityFunction* "}"
+		
+		//'rows' minRows=INT 'to' maxRows=INT '{' templates+=EntityMockTemplate* attributes+=IEntityMockAttribute*
+		//calculations+=EntityMockEntityFunction* '}'
 		public Group getGroup_4_0() { return cGroup_4_0; }
-
-		//"rows"
+		
+		//'rows'
 		public Keyword getRowsKeyword_4_0_0() { return cRowsKeyword_4_0_0; }
-
+		
 		//minRows=INT
 		public Assignment getMinRowsAssignment_4_0_1() { return cMinRowsAssignment_4_0_1; }
-
+		
 		//INT
 		public RuleCall getMinRowsINTTerminalRuleCall_4_0_1_0() { return cMinRowsINTTerminalRuleCall_4_0_1_0; }
-
-		//"to"
+		
+		//'to'
 		public Keyword getToKeyword_4_0_2() { return cToKeyword_4_0_2; }
-
+		
 		//maxRows=INT
 		public Assignment getMaxRowsAssignment_4_0_3() { return cMaxRowsAssignment_4_0_3; }
-
+		
 		//INT
 		public RuleCall getMaxRowsINTTerminalRuleCall_4_0_3_0() { return cMaxRowsINTTerminalRuleCall_4_0_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_0_4() { return cLeftCurlyBracketKeyword_4_0_4; }
-
-		//temporaries+=EntityMockTemporary*
-		public Assignment getTemporariesAssignment_4_0_5() { return cTemporariesAssignment_4_0_5; }
-
-		//EntityMockTemporary
-		public RuleCall getTemporariesEntityMockTemporaryParserRuleCall_4_0_5_0() { return cTemporariesEntityMockTemporaryParserRuleCall_4_0_5_0; }
-
+		
+		//templates+=EntityMockTemplate*
+		public Assignment getTemplatesAssignment_4_0_5() { return cTemplatesAssignment_4_0_5; }
+		
+		//EntityMockTemplate
+		public RuleCall getTemplatesEntityMockTemplateParserRuleCall_4_0_5_0() { return cTemplatesEntityMockTemplateParserRuleCall_4_0_5_0; }
+		
 		//attributes+=IEntityMockAttribute*
 		public Assignment getAttributesAssignment_4_0_6() { return cAttributesAssignment_4_0_6; }
-
+		
 		//IEntityMockAttribute
 		public RuleCall getAttributesIEntityMockAttributeParserRuleCall_4_0_6_0() { return cAttributesIEntityMockAttributeParserRuleCall_4_0_6_0; }
-
+		
 		//calculations+=EntityMockEntityFunction*
 		public Assignment getCalculationsAssignment_4_0_7() { return cCalculationsAssignment_4_0_7; }
-
+		
 		//EntityMockEntityFunction
 		public RuleCall getCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0() { return cCalculationsEntityMockEntityFunctionParserRuleCall_4_0_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_0_8() { return cRightCurlyBracketKeyword_4_0_8; }
-
-		//"by resource" byResource=[EntityMockResource] "{" byResourceAttributes+=EntityMockByResourceAttribute*
-		//createBlobMapping?="createBlobMapping"? "}"
+		
+		//'resource' byResource=[EntityMockResource] '{' (byResourceAttributes+=EntityMockByResourceAttribute* &
+		//createBlobMapping?='createBlobMapping'?) '}'
 		public Group getGroup_4_1() { return cGroup_4_1; }
-
-		//"by resource"
-		public Keyword getByResourceKeyword_4_1_0() { return cByResourceKeyword_4_1_0; }
-
+		
+		//'resource'
+		public Keyword getResourceKeyword_4_1_0() { return cResourceKeyword_4_1_0; }
+		
 		//byResource=[EntityMockResource]
 		public Assignment getByResourceAssignment_4_1_1() { return cByResourceAssignment_4_1_1; }
-
+		
 		//[EntityMockResource]
 		public CrossReference getByResourceEntityMockResourceCrossReference_4_1_1_0() { return cByResourceEntityMockResourceCrossReference_4_1_1_0; }
-
+		
 		//ID
 		public RuleCall getByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1() { return cByResourceEntityMockResourceIDTerminalRuleCall_4_1_1_0_1; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_1_2() { return cLeftCurlyBracketKeyword_4_1_2; }
-
+		
+		//byResourceAttributes+=EntityMockByResourceAttribute* & createBlobMapping?='createBlobMapping'?
+		public UnorderedGroup getUnorderedGroup_4_1_3() { return cUnorderedGroup_4_1_3; }
+		
 		//byResourceAttributes+=EntityMockByResourceAttribute*
-		public Assignment getByResourceAttributesAssignment_4_1_3() { return cByResourceAttributesAssignment_4_1_3; }
-
+		public Assignment getByResourceAttributesAssignment_4_1_3_0() { return cByResourceAttributesAssignment_4_1_3_0; }
+		
 		//EntityMockByResourceAttribute
-		public RuleCall getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0() { return cByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0; }
-
-		//createBlobMapping?="createBlobMapping"?
-		public Assignment getCreateBlobMappingAssignment_4_1_4() { return cCreateBlobMappingAssignment_4_1_4; }
-
-		//"createBlobMapping"
-		public Keyword getCreateBlobMappingCreateBlobMappingKeyword_4_1_4_0() { return cCreateBlobMappingCreateBlobMappingKeyword_4_1_4_0; }
-
-		//"}"
-		public Keyword getRightCurlyBracketKeyword_4_1_5() { return cRightCurlyBracketKeyword_4_1_5; }
-
-		//"iterate" iterator=[entity::LEntityAttribute] "with" iterate=IIterate "{" temporaries+=EntityMockTemporary*
-		//attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}"
+		public RuleCall getByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0() { return cByResourceAttributesEntityMockByResourceAttributeParserRuleCall_4_1_3_0_0; }
+		
+		//createBlobMapping?='createBlobMapping'?
+		public Assignment getCreateBlobMappingAssignment_4_1_3_1() { return cCreateBlobMappingAssignment_4_1_3_1; }
+		
+		//'createBlobMapping'
+		public Keyword getCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0() { return cCreateBlobMappingCreateBlobMappingKeyword_4_1_3_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4_1_4() { return cRightCurlyBracketKeyword_4_1_4; }
+		
+		//'iterate' iterator=[entity::LEntityAttribute] 'with' iterate=IIterate '{' templates+=EntityMockTemplate*
+		//attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* '}'
 		public Group getGroup_4_2() { return cGroup_4_2; }
-
-		//"iterate"
+		
+		//'iterate'
 		public Keyword getIterateKeyword_4_2_0() { return cIterateKeyword_4_2_0; }
-
+		
 		//iterator=[entity::LEntityAttribute]
 		public Assignment getIteratorAssignment_4_2_1() { return cIteratorAssignment_4_2_1; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getIteratorLEntityAttributeCrossReference_4_2_1_0() { return cIteratorLEntityAttributeCrossReference_4_2_1_0; }
-
+		
 		//ID
 		public RuleCall getIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1() { return cIteratorLEntityAttributeIDTerminalRuleCall_4_2_1_0_1; }
-
-		//"with"
+		
+		//'with'
 		public Keyword getWithKeyword_4_2_2() { return cWithKeyword_4_2_2; }
-
+		
 		//iterate=IIterate
 		public Assignment getIterateAssignment_4_2_3() { return cIterateAssignment_4_2_3; }
-
+		
 		//IIterate
 		public RuleCall getIterateIIterateParserRuleCall_4_2_3_0() { return cIterateIIterateParserRuleCall_4_2_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4_2_4() { return cLeftCurlyBracketKeyword_4_2_4; }
-
-		//temporaries+=EntityMockTemporary*
-		public Assignment getTemporariesAssignment_4_2_5() { return cTemporariesAssignment_4_2_5; }
-
-		//EntityMockTemporary
-		public RuleCall getTemporariesEntityMockTemporaryParserRuleCall_4_2_5_0() { return cTemporariesEntityMockTemporaryParserRuleCall_4_2_5_0; }
-
+		
+		//templates+=EntityMockTemplate*
+		public Assignment getTemplatesAssignment_4_2_5() { return cTemplatesAssignment_4_2_5; }
+		
+		//EntityMockTemplate
+		public RuleCall getTemplatesEntityMockTemplateParserRuleCall_4_2_5_0() { return cTemplatesEntityMockTemplateParserRuleCall_4_2_5_0; }
+		
 		//attributes+=IEntityMockAttribute*
 		public Assignment getAttributesAssignment_4_2_6() { return cAttributesAssignment_4_2_6; }
-
+		
 		//IEntityMockAttribute
 		public RuleCall getAttributesIEntityMockAttributeParserRuleCall_4_2_6_0() { return cAttributesIEntityMockAttributeParserRuleCall_4_2_6_0; }
-
+		
 		//calculations+=EntityMockEntityFunction*
 		public Assignment getCalculationsAssignment_4_2_7() { return cCalculationsAssignment_4_2_7; }
-
+		
 		//EntityMockEntityFunction
 		public RuleCall getCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0() { return cCalculationsEntityMockEntityFunctionParserRuleCall_4_2_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_4_2_8() { return cRightCurlyBracketKeyword_4_2_8; }
 	}
-
 	public class IIterateElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IIterate");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IIterate");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cIntegerIterateParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cDateIterateParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
 		
 		//IIterate:
 		//	IntegerIterate | DateIterate;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//IntegerIterate | DateIterate
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//IntegerIterate
 		public RuleCall getIntegerIterateParserRuleCall_0() { return cIntegerIterateParserRuleCall_0; }
-
+		
 		//DateIterate
 		public RuleCall getDateIterateParserRuleCall_1() { return cDateIterateParserRuleCall_1; }
 	}
-
 	public class IntegerIterateElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IntegerIterate");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IntegerIterate");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cIntegerFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cFromAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -2324,42 +2298,41 @@
 		private final RuleCall cStepINTTerminalRuleCall_5_0 = (RuleCall)cStepAssignment_5.eContents().get(0);
 		
 		//IntegerIterate:
-		//	"integer from" from=SINT "until" until=SINT "step" step=INT;
-		public ParserRule getRule() { return rule; }
-
-		//"integer from" from=SINT "until" until=SINT "step" step=INT
+		//	'integerFrom' from=SINT 'until' until=SINT 'step' step=INT;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'integerFrom' from=SINT 'until' until=SINT 'step' step=INT
 		public Group getGroup() { return cGroup; }
-
-		//"integer from"
+		
+		//'integerFrom'
 		public Keyword getIntegerFromKeyword_0() { return cIntegerFromKeyword_0; }
-
+		
 		//from=SINT
 		public Assignment getFromAssignment_1() { return cFromAssignment_1; }
-
+		
 		//SINT
 		public RuleCall getFromSINTParserRuleCall_1_0() { return cFromSINTParserRuleCall_1_0; }
-
-		//"until"
+		
+		//'until'
 		public Keyword getUntilKeyword_2() { return cUntilKeyword_2; }
-
+		
 		//until=SINT
 		public Assignment getUntilAssignment_3() { return cUntilAssignment_3; }
-
+		
 		//SINT
 		public RuleCall getUntilSINTParserRuleCall_3_0() { return cUntilSINTParserRuleCall_3_0; }
-
-		//"step"
+		
+		//'step'
 		public Keyword getStepKeyword_4() { return cStepKeyword_4; }
-
+		
 		//step=INT
 		public Assignment getStepAssignment_5() { return cStepAssignment_5; }
-
+		
 		//INT
 		public RuleCall getStepINTTerminalRuleCall_5_0() { return cStepINTTerminalRuleCall_5_0; }
 	}
-
 	public class DateIterateElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "DateIterate");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.DateIterate");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cDateFromKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cFromAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -2374,48 +2347,47 @@
 		private final RuleCall cStepTypeEDateStepTypeEnumRuleCall_6_0 = (RuleCall)cStepTypeAssignment_6.eContents().get(0);
 		
 		//DateIterate:
-		//	"date from" from=Date "until" until=Date "every" stepCount=INT stepType=EDateStepType;
-		public ParserRule getRule() { return rule; }
-
-		//"date from" from=Date "until" until=Date "every" stepCount=INT stepType=EDateStepType
+		//	'dateFrom' from=Date 'until' until=Date 'every' stepCount=INT stepType=EDateStepType;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'dateFrom' from=Date 'until' until=Date 'every' stepCount=INT stepType=EDateStepType
 		public Group getGroup() { return cGroup; }
-
-		//"date from"
+		
+		//'dateFrom'
 		public Keyword getDateFromKeyword_0() { return cDateFromKeyword_0; }
-
+		
 		//from=Date
 		public Assignment getFromAssignment_1() { return cFromAssignment_1; }
-
+		
 		//Date
 		public RuleCall getFromDateParserRuleCall_1_0() { return cFromDateParserRuleCall_1_0; }
-
-		//"until"
+		
+		//'until'
 		public Keyword getUntilKeyword_2() { return cUntilKeyword_2; }
-
+		
 		//until=Date
 		public Assignment getUntilAssignment_3() { return cUntilAssignment_3; }
-
+		
 		//Date
 		public RuleCall getUntilDateParserRuleCall_3_0() { return cUntilDateParserRuleCall_3_0; }
-
-		//"every"
+		
+		//'every'
 		public Keyword getEveryKeyword_4() { return cEveryKeyword_4; }
-
+		
 		//stepCount=INT
 		public Assignment getStepCountAssignment_5() { return cStepCountAssignment_5; }
-
+		
 		//INT
 		public RuleCall getStepCountINTTerminalRuleCall_5_0() { return cStepCountINTTerminalRuleCall_5_0; }
-
+		
 		//stepType=EDateStepType
 		public Assignment getStepTypeAssignment_6() { return cStepTypeAssignment_6; }
-
+		
 		//EDateStepType
 		public RuleCall getStepTypeEDateStepTypeEnumRuleCall_6_0() { return cStepTypeEDateStepTypeEnumRuleCall_6_0; }
 	}
-
 	public class DateElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Date");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.Date");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final Assignment cYesterdayAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
 		private final Keyword cYesterdayYesterdayKeyword_0_0 = (Keyword)cYesterdayAssignment_0.eContents().get(0);
@@ -2434,60 +2406,59 @@
 		private final RuleCall cDayINTTerminalRuleCall_3_4_0 = (RuleCall)cDayAssignment_3_4.eContents().get(0);
 		
 		//Date:
-		//	yesterday?="yesterday" | today?="today" | tomorrow?="tomorrow" | year=INT "-" month=INT "-" day=INT;
-		public ParserRule getRule() { return rule; }
-
-		//yesterday?="yesterday" | today?="today" | tomorrow?="tomorrow" | year=INT "-" month=INT "-" day=INT
+		//	yesterday?='yesterday' | today?='today' | tomorrow?='tomorrow' | year=INT '-' month=INT '-' day=INT;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//yesterday?='yesterday' | today?='today' | tomorrow?='tomorrow' | year=INT '-' month=INT '-' day=INT
 		public Alternatives getAlternatives() { return cAlternatives; }
-
-		//yesterday?="yesterday"
+		
+		//yesterday?='yesterday'
 		public Assignment getYesterdayAssignment_0() { return cYesterdayAssignment_0; }
-
-		//"yesterday"
+		
+		//'yesterday'
 		public Keyword getYesterdayYesterdayKeyword_0_0() { return cYesterdayYesterdayKeyword_0_0; }
-
-		//today?="today"
+		
+		//today?='today'
 		public Assignment getTodayAssignment_1() { return cTodayAssignment_1; }
-
-		//"today"
+		
+		//'today'
 		public Keyword getTodayTodayKeyword_1_0() { return cTodayTodayKeyword_1_0; }
-
-		//tomorrow?="tomorrow"
+		
+		//tomorrow?='tomorrow'
 		public Assignment getTomorrowAssignment_2() { return cTomorrowAssignment_2; }
-
-		//"tomorrow"
+		
+		//'tomorrow'
 		public Keyword getTomorrowTomorrowKeyword_2_0() { return cTomorrowTomorrowKeyword_2_0; }
-
-		//year=INT "-" month=INT "-" day=INT
+		
+		//year=INT '-' month=INT '-' day=INT
 		public Group getGroup_3() { return cGroup_3; }
-
+		
 		//year=INT
 		public Assignment getYearAssignment_3_0() { return cYearAssignment_3_0; }
-
+		
 		//INT
 		public RuleCall getYearINTTerminalRuleCall_3_0_0() { return cYearINTTerminalRuleCall_3_0_0; }
-
-		//"-"
+		
+		//'-'
 		public Keyword getHyphenMinusKeyword_3_1() { return cHyphenMinusKeyword_3_1; }
-
+		
 		//month=INT
 		public Assignment getMonthAssignment_3_2() { return cMonthAssignment_3_2; }
-
+		
 		//INT
 		public RuleCall getMonthINTTerminalRuleCall_3_2_0() { return cMonthINTTerminalRuleCall_3_2_0; }
-
-		//"-"
+		
+		//'-'
 		public Keyword getHyphenMinusKeyword_3_3() { return cHyphenMinusKeyword_3_3; }
-
+		
 		//day=INT
 		public Assignment getDayAssignment_3_4() { return cDayAssignment_3_4; }
-
+		
 		//INT
 		public RuleCall getDayINTTerminalRuleCall_3_4_0() { return cDayINTTerminalRuleCall_3_4_0; }
 	}
-
 	public class EntityMockByResourceAttributeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockByResourceAttribute");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockByResourceAttribute");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockByResourceAttributeAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cVarKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -2500,104 +2471,101 @@
 		private final RuleCall cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1 = (RuleCall)cResourceAttributeEntityMockResourceAttributeCrossReference_4_0.eContents().get(1);
 		
 		//EntityMockByResourceAttribute:
-		//	{EntityMockByResourceAttribute} "var" attributeRef=[entity::LEntityAttribute] "as"
+		//	{EntityMockByResourceAttribute} 'var' attributeRef=[entity::LEntityAttribute] 'as'
 		//	resourceAttribute=[EntityMockResourceAttribute];
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockByResourceAttribute} "var" attributeRef=[entity::LEntityAttribute] "as"
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockByResourceAttribute} 'var' attributeRef=[entity::LEntityAttribute] 'as'
 		//resourceAttribute=[EntityMockResourceAttribute]
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockByResourceAttribute}
 		public Action getEntityMockByResourceAttributeAction_0() { return cEntityMockByResourceAttributeAction_0; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_1() { return cVarKeyword_1; }
-
+		
 		//attributeRef=[entity::LEntityAttribute]
 		public Assignment getAttributeRefAssignment_2() { return cAttributeRefAssignment_2; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getAttributeRefLEntityAttributeCrossReference_2_0() { return cAttributeRefLEntityAttributeCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1() { return cAttributeRefLEntityAttributeIDTerminalRuleCall_2_0_1; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_3() { return cAsKeyword_3; }
-
+		
 		//resourceAttribute=[EntityMockResourceAttribute]
 		public Assignment getResourceAttributeAssignment_4() { return cResourceAttributeAssignment_4; }
-
+		
 		//[EntityMockResourceAttribute]
 		public CrossReference getResourceAttributeEntityMockResourceAttributeCrossReference_4_0() { return cResourceAttributeEntityMockResourceAttributeCrossReference_4_0; }
-
+		
 		//ID
 		public RuleCall getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1() { return cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_4_0_1; }
 	}
-
-	public class EntityMockTemporaryElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockTemporary");
+	public class EntityMockTemplateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockTemplate");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Keyword cTemporaryKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cTemplateKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
 		private final Keyword cByObjectKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cObjectAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final CrossReference cObjectEntityMockObjectCrossReference_3_0 = (CrossReference)cObjectAssignment_3.eContents().get(0);
 		private final RuleCall cObjectEntityMockObjectIDTerminalRuleCall_3_0_1 = (RuleCall)cObjectEntityMockObjectCrossReference_3_0.eContents().get(1);
 		
-		//EntityMockTemporary:
-		//	"temporary" name=QualifiedName "by object" object=[EntityMockObject];
-		public ParserRule getRule() { return rule; }
-
-		//"temporary" name=QualifiedName "by object" object=[EntityMockObject]
+		//EntityMockTemplate:
+		//	'template' name=ID 'byObject' object=[EntityMockObject];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'template' name=ID 'byObject' object=[EntityMockObject]
 		public Group getGroup() { return cGroup; }
-
-		//"temporary"
-		public Keyword getTemporaryKeyword_0() { return cTemporaryKeyword_0; }
-
-		//name=QualifiedName
+		
+		//'template'
+		public Keyword getTemplateKeyword_0() { return cTemplateKeyword_0; }
+		
+		//name=ID
 		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
-
-		//QualifiedName
-		public RuleCall getNameQualifiedNameParserRuleCall_1_0() { return cNameQualifiedNameParserRuleCall_1_0; }
-
-		//"by object"
+		
+		//ID
+		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+		
+		//'byObject'
 		public Keyword getByObjectKeyword_2() { return cByObjectKeyword_2; }
-
+		
 		//object=[EntityMockObject]
 		public Assignment getObjectAssignment_3() { return cObjectAssignment_3; }
-
+		
 		//[EntityMockObject]
 		public CrossReference getObjectEntityMockObjectCrossReference_3_0() { return cObjectEntityMockObjectCrossReference_3_0; }
-
+		
 		//ID
 		public RuleCall getObjectEntityMockObjectIDTerminalRuleCall_3_0_1() { return cObjectEntityMockObjectIDTerminalRuleCall_3_0_1; }
 	}
-
 	public class IEntityMockEntityUsableElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IEntityMockEntityUsable");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockEntityUsable");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cIEntityMockAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cEntityMockEntityFunctionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
 		
 		//IEntityMockEntityUsable:
 		//	IEntityMockAttribute | EntityMockEntityFunction;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//IEntityMockAttribute | EntityMockEntityFunction
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//IEntityMockAttribute
 		public RuleCall getIEntityMockAttributeParserRuleCall_0() { return cIEntityMockAttributeParserRuleCall_0; }
-
+		
 		//EntityMockEntityFunction
 		public RuleCall getEntityMockEntityFunctionParserRuleCall_1() { return cEntityMockEntityFunctionParserRuleCall_1; }
 	}
-
 	public class IEntityMockAttributeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "IEntityMockAttribute");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.IEntityMockAttribute");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cEntityMockAttributeByObjectParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cEntityMockAttributeFillerParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -2605,29 +2573,28 @@
 		
 		//IEntityMockAttribute:
 		//	EntityMockAttributeByObject | EntityMockAttributeFiller | EntityMockAttributeByReference;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//EntityMockAttributeByObject | EntityMockAttributeFiller | EntityMockAttributeByReference
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//EntityMockAttributeByObject
 		public RuleCall getEntityMockAttributeByObjectParserRuleCall_0() { return cEntityMockAttributeByObjectParserRuleCall_0; }
-
+		
 		//EntityMockAttributeFiller
 		public RuleCall getEntityMockAttributeFillerParserRuleCall_1() { return cEntityMockAttributeFillerParserRuleCall_1; }
-
+		
 		//EntityMockAttributeByReference
 		public RuleCall getEntityMockAttributeByReferenceParserRuleCall_2() { return cEntityMockAttributeByReferenceParserRuleCall_2; }
 	}
-
 	public class EntityMockEntityFunctionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockEntityFunction");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunction");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cAttributeRefAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final CrossReference cAttributeRefLEntityAttributeCrossReference_1_0 = (CrossReference)cAttributeRefAssignment_1.eContents().get(0);
 		private final RuleCall cAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cAttributeRefLEntityAttributeCrossReference_1_0.eContents().get(1);
-		private final Keyword cCalculateBasedOnKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cCalculateOnKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
 		private final Assignment cParamsAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
@@ -2641,149 +2608,140 @@
 		private final RuleCall cBodyXBlockExpressionParserRuleCall_6_0 = (RuleCall)cBodyAssignment_6.eContents().get(0);
 		
 		//EntityMockEntityFunction:
-		//	"var" attributeRef=[entity::LEntityAttribute] "calculate based on" "(" (params+=EntityMockEntityFunctionParameter
-		//	("," params+=EntityMockEntityFunctionParameter)*)? ")" body=XBlockExpression;
-		public ParserRule getRule() { return rule; }
-
-		//"var" attributeRef=[entity::LEntityAttribute] "calculate based on" "(" (params+=EntityMockEntityFunctionParameter (","
-		//params+=EntityMockEntityFunctionParameter)*)? ")" body=XBlockExpression
+		//	'var' attributeRef=[entity::LEntityAttribute]
+		//	'calculateOn' '(' (params+=EntityMockEntityFunctionParameter (',' params+=EntityMockEntityFunctionParameter)*)? ')'
+		//	body=XBlockExpression;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' attributeRef=[entity::LEntityAttribute] 'calculateOn' '(' (params+=EntityMockEntityFunctionParameter (','
+		//params+=EntityMockEntityFunctionParameter)*)? ')' body=XBlockExpression
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
+		
 		//attributeRef=[entity::LEntityAttribute]
 		public Assignment getAttributeRefAssignment_1() { return cAttributeRefAssignment_1; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getAttributeRefLEntityAttributeCrossReference_1_0() { return cAttributeRefLEntityAttributeCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1() { return cAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1; }
-
-		//"calculate based on"
-		public Keyword getCalculateBasedOnKeyword_2() { return cCalculateBasedOnKeyword_2; }
-
-		//"("
+		
+		//'calculateOn'
+		public Keyword getCalculateOnKeyword_2() { return cCalculateOnKeyword_2; }
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
-
-		//(params+=EntityMockEntityFunctionParameter ("," params+=EntityMockEntityFunctionParameter)*)?
+		
+		//(params+=EntityMockEntityFunctionParameter (',' params+=EntityMockEntityFunctionParameter)*)?
 		public Group getGroup_4() { return cGroup_4; }
-
+		
 		//params+=EntityMockEntityFunctionParameter
 		public Assignment getParamsAssignment_4_0() { return cParamsAssignment_4_0; }
-
+		
 		//EntityMockEntityFunctionParameter
 		public RuleCall getParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0() { return cParamsEntityMockEntityFunctionParameterParserRuleCall_4_0_0; }
-
-		//("," params+=EntityMockEntityFunctionParameter)*
+		
+		//(',' params+=EntityMockEntityFunctionParameter)*
 		public Group getGroup_4_1() { return cGroup_4_1; }
-
-		//","
+		
+		//','
 		public Keyword getCommaKeyword_4_1_0() { return cCommaKeyword_4_1_0; }
-
+		
 		//params+=EntityMockEntityFunctionParameter
 		public Assignment getParamsAssignment_4_1_1() { return cParamsAssignment_4_1_1; }
-
+		
 		//EntityMockEntityFunctionParameter
 		public RuleCall getParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0() { return cParamsEntityMockEntityFunctionParameterParserRuleCall_4_1_1_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
-
+		
 		//body=XBlockExpression
 		public Assignment getBodyAssignment_6() { return cBodyAssignment_6; }
-
+		
 		//XBlockExpression
 		public RuleCall getBodyXBlockExpressionParserRuleCall_6_0() { return cBodyXBlockExpressionParserRuleCall_6_0; }
 	}
-
 	public class EntityMockEntityFunctionParameterElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockEntityFunctionParameter");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityFunctionParameter");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final Assignment cAttributeRefAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
 		private final CrossReference cAttributeRefLEntityAttributeCrossReference_0_0 = (CrossReference)cAttributeRefAssignment_0.eContents().get(0);
 		private final RuleCall cAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1 = (RuleCall)cAttributeRefLEntityAttributeCrossReference_0_0.eContents().get(1);
-		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
-		private final Assignment cReferencePathsAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
-		private final CrossReference cReferencePathsLEntityReferenceCrossReference_1_0_0 = (CrossReference)cReferencePathsAssignment_1_0.eContents().get(0);
-		private final RuleCall cReferencePathsLEntityReferenceIDTerminalRuleCall_1_0_0_1 = (RuleCall)cReferencePathsLEntityReferenceCrossReference_1_0_0.eContents().get(1);
-		private final Group cGroup_1_1 = (Group)cGroup_1.eContents().get(1);
-		private final Keyword cFullStopKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
-		private final Assignment cReferencePathsAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
-		private final CrossReference cReferencePathsLEntityReferenceCrossReference_1_1_1_0 = (CrossReference)cReferencePathsAssignment_1_1_1.eContents().get(0);
-		private final RuleCall cReferencePathsLEntityReferenceIDTerminalRuleCall_1_1_1_0_1 = (RuleCall)cReferencePathsLEntityReferenceCrossReference_1_1_1_0.eContents().get(1);
-		private final Keyword cFullStopKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
-		private final Assignment cReferenceRefAssignment_1_3 = (Assignment)cGroup_1.eContents().get(3);
-		private final CrossReference cReferenceRefLEntityAttributeCrossReference_1_3_0 = (CrossReference)cReferenceRefAssignment_1_3.eContents().get(0);
-		private final RuleCall cReferenceRefLEntityAttributeIDTerminalRuleCall_1_3_0_1 = (RuleCall)cReferenceRefLEntityAttributeCrossReference_1_3_0.eContents().get(1);
+		private final Assignment cNestedAttributeAssignment_1 = (Assignment)cAlternatives.eContents().get(1);
+		private final RuleCall cNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0 = (RuleCall)cNestedAttributeAssignment_1.eContents().get(0);
 		
 		//EntityMockEntityFunctionParameter:
-		//	attributeRef=[entity::LEntityAttribute] | referencePaths+=[entity::LEntityReference] ("."?
-		//	referencePaths+=[entity::LEntityReference])* "." referenceRef=[entity::LEntityAttribute];
-		public ParserRule getRule() { return rule; }
-
-		//attributeRef=[entity::LEntityAttribute] | referencePaths+=[entity::LEntityReference] ("."?
-		//referencePaths+=[entity::LEntityReference])* "." referenceRef=[entity::LEntityAttribute]
+		//	attributeRef=[entity::LEntityAttribute] | nestedAttribute=EntityMockEntityNestedAttribute;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//attributeRef=[entity::LEntityAttribute] | nestedAttribute=EntityMockEntityNestedAttribute
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//attributeRef=[entity::LEntityAttribute]
 		public Assignment getAttributeRefAssignment_0() { return cAttributeRefAssignment_0; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getAttributeRefLEntityAttributeCrossReference_0_0() { return cAttributeRefLEntityAttributeCrossReference_0_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1() { return cAttributeRefLEntityAttributeIDTerminalRuleCall_0_0_1; }
-
-		//referencePaths+=[entity::LEntityReference] ("."? referencePaths+=[entity::LEntityReference])* "."
-		//referenceRef=[entity::LEntityAttribute]
-		public Group getGroup_1() { return cGroup_1; }
-
-		//referencePaths+=[entity::LEntityReference]
-		public Assignment getReferencePathsAssignment_1_0() { return cReferencePathsAssignment_1_0; }
-
-		//[entity::LEntityReference]
-		public CrossReference getReferencePathsLEntityReferenceCrossReference_1_0_0() { return cReferencePathsLEntityReferenceCrossReference_1_0_0; }
-
-		//ID
-		public RuleCall getReferencePathsLEntityReferenceIDTerminalRuleCall_1_0_0_1() { return cReferencePathsLEntityReferenceIDTerminalRuleCall_1_0_0_1; }
-
-		//("."? referencePaths+=[entity::LEntityReference])*
-		public Group getGroup_1_1() { return cGroup_1_1; }
-
-		//"."?
-		public Keyword getFullStopKeyword_1_1_0() { return cFullStopKeyword_1_1_0; }
-
-		//referencePaths+=[entity::LEntityReference]
-		public Assignment getReferencePathsAssignment_1_1_1() { return cReferencePathsAssignment_1_1_1; }
-
-		//[entity::LEntityReference]
-		public CrossReference getReferencePathsLEntityReferenceCrossReference_1_1_1_0() { return cReferencePathsLEntityReferenceCrossReference_1_1_1_0; }
-
-		//ID
-		public RuleCall getReferencePathsLEntityReferenceIDTerminalRuleCall_1_1_1_0_1() { return cReferencePathsLEntityReferenceIDTerminalRuleCall_1_1_1_0_1; }
-
-		//"."
-		public Keyword getFullStopKeyword_1_2() { return cFullStopKeyword_1_2; }
-
-		//referenceRef=[entity::LEntityAttribute]
-		public Assignment getReferenceRefAssignment_1_3() { return cReferenceRefAssignment_1_3; }
-
-		//[entity::LEntityAttribute]
-		public CrossReference getReferenceRefLEntityAttributeCrossReference_1_3_0() { return cReferenceRefLEntityAttributeCrossReference_1_3_0; }
-
-		//ID
-		public RuleCall getReferenceRefLEntityAttributeIDTerminalRuleCall_1_3_0_1() { return cReferenceRefLEntityAttributeIDTerminalRuleCall_1_3_0_1; }
+		
+		//nestedAttribute=EntityMockEntityNestedAttribute
+		public Assignment getNestedAttributeAssignment_1() { return cNestedAttributeAssignment_1; }
+		
+		//EntityMockEntityNestedAttribute
+		public RuleCall getNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0() { return cNestedAttributeEntityMockEntityNestedAttributeParserRuleCall_1_0; }
 	}
-
+	public class EntityMockEntityNestedAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockEntityNestedAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cReferenceAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final CrossReference cReferenceLEntityReferenceCrossReference_0_0 = (CrossReference)cReferenceAssignment_0.eContents().get(0);
+		private final RuleCall cReferenceLEntityReferenceIDTerminalRuleCall_0_0_1 = (RuleCall)cReferenceLEntityReferenceCrossReference_0_0.eContents().get(1);
+		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cAttributeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cAttributeLEntityAttributeCrossReference_2_0 = (CrossReference)cAttributeAssignment_2.eContents().get(0);
+		private final RuleCall cAttributeLEntityAttributeIDTerminalRuleCall_2_0_1 = (RuleCall)cAttributeLEntityAttributeCrossReference_2_0.eContents().get(1);
+		
+		//EntityMockEntityNestedAttribute:
+		//	reference=[entity::LEntityReference] '.' attribute=[entity::LEntityAttribute];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//reference=[entity::LEntityReference] '.' attribute=[entity::LEntityAttribute]
+		public Group getGroup() { return cGroup; }
+		
+		//reference=[entity::LEntityReference]
+		public Assignment getReferenceAssignment_0() { return cReferenceAssignment_0; }
+		
+		//[entity::LEntityReference]
+		public CrossReference getReferenceLEntityReferenceCrossReference_0_0() { return cReferenceLEntityReferenceCrossReference_0_0; }
+		
+		//ID
+		public RuleCall getReferenceLEntityReferenceIDTerminalRuleCall_0_0_1() { return cReferenceLEntityReferenceIDTerminalRuleCall_0_0_1; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
+		
+		//attribute=[entity::LEntityAttribute]
+		public Assignment getAttributeAssignment_2() { return cAttributeAssignment_2; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getAttributeLEntityAttributeCrossReference_2_0() { return cAttributeLEntityAttributeCrossReference_2_0; }
+		
+		//ID
+		public RuleCall getAttributeLEntityAttributeIDTerminalRuleCall_2_0_1() { return cAttributeLEntityAttributeIDTerminalRuleCall_2_0_1; }
+	}
 	public class EntityMockReferencedObjectAttributeElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockReferencedObjectAttribute");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockReferencedObjectAttribute");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cEntityMockReferencedObjectAttributeAction_0 = (Action)cGroup.eContents().get(0);
-		private final Assignment cTemporaryAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final CrossReference cTemporaryEntityMockTemporaryCrossReference_1_0 = (CrossReference)cTemporaryAssignment_1.eContents().get(0);
-		private final RuleCall cTemporaryEntityMockTemporaryIDTerminalRuleCall_1_0_1 = (RuleCall)cTemporaryEntityMockTemporaryCrossReference_1_0.eContents().get(1);
+		private final Assignment cTemplateAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cTemplateEntityMockTemplateCrossReference_1_0 = (CrossReference)cTemplateAssignment_1.eContents().get(0);
+		private final RuleCall cTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1 = (RuleCall)cTemplateEntityMockTemplateCrossReference_1_0.eContents().get(1);
 		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
 		private final Keyword cFullStopKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
 		private final Assignment cEmbeddedAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
@@ -2795,56 +2753,55 @@
 		private final RuleCall cAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1 = (RuleCall)cAttributeIEntityMockObjectUsableCrossReference_4_0.eContents().get(1);
 		
 		//EntityMockReferencedObjectAttribute:
-		//	{EntityMockReferencedObjectAttribute} temporary=[EntityMockTemporary] ("."? embedded+=[EntityMockObjectEmbed])* "."
+		//	{EntityMockReferencedObjectAttribute} template=[EntityMockTemplate] ('.'? embedded+=[EntityMockObjectEmbed])* '.'
 		//	attribute=[IEntityMockObjectUsable];
-		public ParserRule getRule() { return rule; }
-
-		//{EntityMockReferencedObjectAttribute} temporary=[EntityMockTemporary] ("."? embedded+=[EntityMockObjectEmbed])* "."
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{EntityMockReferencedObjectAttribute} template=[EntityMockTemplate] ('.'? embedded+=[EntityMockObjectEmbed])* '.'
 		//attribute=[IEntityMockObjectUsable]
 		public Group getGroup() { return cGroup; }
-
+		
 		//{EntityMockReferencedObjectAttribute}
 		public Action getEntityMockReferencedObjectAttributeAction_0() { return cEntityMockReferencedObjectAttributeAction_0; }
-
-		//temporary=[EntityMockTemporary]
-		public Assignment getTemporaryAssignment_1() { return cTemporaryAssignment_1; }
-
-		//[EntityMockTemporary]
-		public CrossReference getTemporaryEntityMockTemporaryCrossReference_1_0() { return cTemporaryEntityMockTemporaryCrossReference_1_0; }
-
+		
+		//template=[EntityMockTemplate]
+		public Assignment getTemplateAssignment_1() { return cTemplateAssignment_1; }
+		
+		//[EntityMockTemplate]
+		public CrossReference getTemplateEntityMockTemplateCrossReference_1_0() { return cTemplateEntityMockTemplateCrossReference_1_0; }
+		
 		//ID
-		public RuleCall getTemporaryEntityMockTemporaryIDTerminalRuleCall_1_0_1() { return cTemporaryEntityMockTemporaryIDTerminalRuleCall_1_0_1; }
-
-		//("."? embedded+=[EntityMockObjectEmbed])*
+		public RuleCall getTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1() { return cTemplateEntityMockTemplateIDTerminalRuleCall_1_0_1; }
+		
+		//('.'? embedded+=[EntityMockObjectEmbed])*
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"."?
+		
+		//'.'?
 		public Keyword getFullStopKeyword_2_0() { return cFullStopKeyword_2_0; }
-
+		
 		//embedded+=[EntityMockObjectEmbed]
 		public Assignment getEmbeddedAssignment_2_1() { return cEmbeddedAssignment_2_1; }
-
+		
 		//[EntityMockObjectEmbed]
 		public CrossReference getEmbeddedEntityMockObjectEmbedCrossReference_2_1_0() { return cEmbeddedEntityMockObjectEmbedCrossReference_2_1_0; }
-
+		
 		//ID
 		public RuleCall getEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1() { return cEmbeddedEntityMockObjectEmbedIDTerminalRuleCall_2_1_0_1; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_3() { return cFullStopKeyword_3; }
-
+		
 		//attribute=[IEntityMockObjectUsable]
 		public Assignment getAttributeAssignment_4() { return cAttributeAssignment_4; }
-
+		
 		//[IEntityMockObjectUsable]
 		public CrossReference getAttributeIEntityMockObjectUsableCrossReference_4_0() { return cAttributeIEntityMockObjectUsableCrossReference_4_0; }
-
+		
 		//ID
 		public RuleCall getAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1() { return cAttributeIEntityMockObjectUsableIDTerminalRuleCall_4_0_1; }
 	}
-
 	public class EntityMockAttributeByObjectElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockAttributeByObject");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockAttributeByObject");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
 		private final Keyword cVarKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
@@ -2866,71 +2823,70 @@
 		private final RuleCall cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1 = (RuleCall)cResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0.eContents().get(1);
 		
 		//EntityMockAttributeByObject:
-		//	"var" attributeRef=[entity::LEntityAttribute] ("as" reference=EntityMockReferencedObjectAttribute) | "using"
-		//	resourceEnum=[EntityMockObjectEnum] "." resourceAttribute=[EntityMockResourceAttribute];
-		public ParserRule getRule() { return rule; }
-
-		//"var" attributeRef=[entity::LEntityAttribute] ("as" reference=EntityMockReferencedObjectAttribute) | "using"
-		//resourceEnum=[EntityMockObjectEnum] "." resourceAttribute=[EntityMockResourceAttribute]
+		//	'var' attributeRef=[entity::LEntityAttribute] ('as' reference=EntityMockReferencedObjectAttribute) | 'using'
+		//	resourceEnum=[EntityMockObjectEnum] '.' resourceAttribute=[EntityMockResourceAttribute];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' attributeRef=[entity::LEntityAttribute] ('as' reference=EntityMockReferencedObjectAttribute) | 'using'
+		//resourceEnum=[EntityMockObjectEnum] '.' resourceAttribute=[EntityMockResourceAttribute]
 		public Alternatives getAlternatives() { return cAlternatives; }
-
-		//"var" attributeRef=[entity::LEntityAttribute] ("as" reference=EntityMockReferencedObjectAttribute)
+		
+		//'var' attributeRef=[entity::LEntityAttribute] ('as' reference=EntityMockReferencedObjectAttribute)
 		public Group getGroup_0() { return cGroup_0; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0_0() { return cVarKeyword_0_0; }
-
+		
 		//attributeRef=[entity::LEntityAttribute]
 		public Assignment getAttributeRefAssignment_0_1() { return cAttributeRefAssignment_0_1; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getAttributeRefLEntityAttributeCrossReference_0_1_0() { return cAttributeRefLEntityAttributeCrossReference_0_1_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1() { return cAttributeRefLEntityAttributeIDTerminalRuleCall_0_1_0_1; }
-
-		//"as" reference=EntityMockReferencedObjectAttribute
+		
+		//'as' reference=EntityMockReferencedObjectAttribute
 		public Group getGroup_0_2() { return cGroup_0_2; }
-
-		//"as"
+		
+		//'as'
 		public Keyword getAsKeyword_0_2_0() { return cAsKeyword_0_2_0; }
-
+		
 		//reference=EntityMockReferencedObjectAttribute
 		public Assignment getReferenceAssignment_0_2_1() { return cReferenceAssignment_0_2_1; }
-
+		
 		//EntityMockReferencedObjectAttribute
 		public RuleCall getReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0() { return cReferenceEntityMockReferencedObjectAttributeParserRuleCall_0_2_1_0; }
-
-		//"using" resourceEnum=[EntityMockObjectEnum] "." resourceAttribute=[EntityMockResourceAttribute]
+		
+		//'using' resourceEnum=[EntityMockObjectEnum] '.' resourceAttribute=[EntityMockResourceAttribute]
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"using"
+		
+		//'using'
 		public Keyword getUsingKeyword_1_0() { return cUsingKeyword_1_0; }
-
+		
 		//resourceEnum=[EntityMockObjectEnum]
 		public Assignment getResourceEnumAssignment_1_1() { return cResourceEnumAssignment_1_1; }
-
+		
 		//[EntityMockObjectEnum]
 		public CrossReference getResourceEnumEntityMockObjectEnumCrossReference_1_1_0() { return cResourceEnumEntityMockObjectEnumCrossReference_1_1_0; }
-
+		
 		//ID
 		public RuleCall getResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1() { return cResourceEnumEntityMockObjectEnumIDTerminalRuleCall_1_1_0_1; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1_2() { return cFullStopKeyword_1_2; }
-
+		
 		//resourceAttribute=[EntityMockResourceAttribute]
 		public Assignment getResourceAttributeAssignment_1_3() { return cResourceAttributeAssignment_1_3; }
-
+		
 		//[EntityMockResourceAttribute]
 		public CrossReference getResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0() { return cResourceAttributeEntityMockResourceAttributeCrossReference_1_3_0; }
-
+		
 		//ID
 		public RuleCall getResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1() { return cResourceAttributeEntityMockResourceAttributeIDTerminalRuleCall_1_3_0_1; }
 	}
-
 	public class EntityMockAttributeFillerElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockAttributeFiller");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockAttributeFiller");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cVarKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cAttributeRefAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -2941,36 +2897,35 @@
 		private final RuleCall cFillerTypePropertyFillerTypeParserRuleCall_3_0 = (RuleCall)cFillerTypeAssignment_3.eContents().get(0);
 		
 		//EntityMockAttributeFiller:
-		//	"var" attributeRef=[entity::LEntityAttribute] "randomize" fillerType=PropertyFillerType;
-		public ParserRule getRule() { return rule; }
-
-		//"var" attributeRef=[entity::LEntityAttribute] "randomize" fillerType=PropertyFillerType
+		//	'var' attributeRef=[entity::LEntityAttribute] 'randomize' fillerType=PropertyFillerType;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'var' attributeRef=[entity::LEntityAttribute] 'randomize' fillerType=PropertyFillerType
 		public Group getGroup() { return cGroup; }
-
-		//"var"
+		
+		//'var'
 		public Keyword getVarKeyword_0() { return cVarKeyword_0; }
-
+		
 		//attributeRef=[entity::LEntityAttribute]
 		public Assignment getAttributeRefAssignment_1() { return cAttributeRefAssignment_1; }
-
+		
 		//[entity::LEntityAttribute]
 		public CrossReference getAttributeRefLEntityAttributeCrossReference_1_0() { return cAttributeRefLEntityAttributeCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1() { return cAttributeRefLEntityAttributeIDTerminalRuleCall_1_0_1; }
-
-		//"randomize"
+		
+		//'randomize'
 		public Keyword getRandomizeKeyword_2() { return cRandomizeKeyword_2; }
-
+		
 		//fillerType=PropertyFillerType
 		public Assignment getFillerTypeAssignment_3() { return cFillerTypeAssignment_3; }
-
+		
 		//PropertyFillerType
 		public RuleCall getFillerTypePropertyFillerTypeParserRuleCall_3_0() { return cFillerTypePropertyFillerTypeParserRuleCall_3_0; }
 	}
-
 	public class EntityMockAttributeByReferenceElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EntityMockAttributeByReference");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EntityMockAttributeByReference");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cRefKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cAttributeRefAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -2989,171 +2944,127 @@
 		private final Keyword cPercentKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
 		
 		//EntityMockAttributeByReference:
-		//	"ref" attributeRef=[entity::LEntityReference] "to" ("existing entities" | mockedEntity=[EntityMockEntity])
-		//	("optional for" optionalFor=INT "percent")?;
-		public ParserRule getRule() { return rule; }
-
-		//"ref" attributeRef=[entity::LEntityReference] "to" ("existing entities" | mockedEntity=[EntityMockEntity])
-		//("optional for" optionalFor=INT "percent")?
+		//	'ref' attributeRef=[entity::LEntityReference] 'to' ('existingEntities' | mockedEntity=[EntityMockEntity])
+		//	('optionalFor' optionalFor=INT 'percent')?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'ref' attributeRef=[entity::LEntityReference] 'to' ('existingEntities' | mockedEntity=[EntityMockEntity]) ('optionalFor'
+		//optionalFor=INT 'percent')?
 		public Group getGroup() { return cGroup; }
-
-		//"ref"
+		
+		//'ref'
 		public Keyword getRefKeyword_0() { return cRefKeyword_0; }
-
+		
 		//attributeRef=[entity::LEntityReference]
 		public Assignment getAttributeRefAssignment_1() { return cAttributeRefAssignment_1; }
-
+		
 		//[entity::LEntityReference]
 		public CrossReference getAttributeRefLEntityReferenceCrossReference_1_0() { return cAttributeRefLEntityReferenceCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1() { return cAttributeRefLEntityReferenceIDTerminalRuleCall_1_0_1; }
-
-		//"to"
+		
+		//'to'
 		public Keyword getToKeyword_2() { return cToKeyword_2; }
-
-		//"existing entities" | mockedEntity=[EntityMockEntity]
+		
+		//'existingEntities' | mockedEntity=[EntityMockEntity]
 		public Alternatives getAlternatives_3() { return cAlternatives_3; }
-
-		//"existing entities"
+		
+		//'existingEntities'
 		public Keyword getExistingEntitiesKeyword_3_0() { return cExistingEntitiesKeyword_3_0; }
-
+		
 		//mockedEntity=[EntityMockEntity]
 		public Assignment getMockedEntityAssignment_3_1() { return cMockedEntityAssignment_3_1; }
-
+		
 		//[EntityMockEntity]
 		public CrossReference getMockedEntityEntityMockEntityCrossReference_3_1_0() { return cMockedEntityEntityMockEntityCrossReference_3_1_0; }
-
+		
 		//ID
 		public RuleCall getMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1() { return cMockedEntityEntityMockEntityIDTerminalRuleCall_3_1_0_1; }
-
-		//("optional for" optionalFor=INT "percent")?
+		
+		//('optionalFor' optionalFor=INT 'percent')?
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"optional for"
+		
+		//'optionalFor'
 		public Keyword getOptionalForKeyword_4_0() { return cOptionalForKeyword_4_0; }
-
+		
 		//optionalFor=INT
 		public Assignment getOptionalForAssignment_4_1() { return cOptionalForAssignment_4_1; }
-
+		
 		//INT
 		public RuleCall getOptionalForINTTerminalRuleCall_4_1_0() { return cOptionalForINTTerminalRuleCall_4_1_0; }
-
-		//"percent"
+		
+		//'percent'
 		public Keyword getPercentKeyword_4_2() { return cPercentKeyword_4_2; }
 	}
-
 	public class SignedNumberElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "SignedNumber");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SignedNumber");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final RuleCall cUnsignedNumberParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
 		
-		//SignedNumber returns ecore::EDouble:
-		//	"-"? UnsignedNumber;
-		public ParserRule getRule() { return rule; }
-
-		//"-"? UnsignedNumber
+		//SignedNumber ecore::EDouble:
+		//	'-'? UnsignedNumber;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? UnsignedNumber
 		public Group getGroup() { return cGroup; }
-
-		//"-"?
+		
+		//'-'?
 		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
-
+		
 		//UnsignedNumber
 		public RuleCall getUnsignedNumberParserRuleCall_1() { return cUnsignedNumberParserRuleCall_1; }
 	}
-
 	public class UnsignedNumberElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "UnsignedNumber");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.UnsignedNumber");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final RuleCall cINTTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
 		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
 		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
 		private final RuleCall cINTTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
 		
-		//UnsignedNumber returns ecore::EDouble:
-		//	INT ("." INT)?;
-		public ParserRule getRule() { return rule; }
-
-		//INT ("." INT)?
+		//UnsignedNumber ecore::EDouble:
+		//	INT ('.' INT)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//INT ('.' INT)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//INT
 		public RuleCall getINTTerminalRuleCall_0() { return cINTTerminalRuleCall_0; }
-
-		//("." INT)?
+		
+		//('.' INT)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
+		
 		//INT
 		public RuleCall getINTTerminalRuleCall_1_1() { return cINTTerminalRuleCall_1_1; }
 	}
-
 	public class SINTElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "SINT");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.SINT");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
 		
-		//SINT returns ecore::EInt:
-		//	"-"? INT;
-		public ParserRule getRule() { return rule; }
-
-		//"-"? INT
+		//SINT ecore::EInt:
+		//	'-'? INT;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT
 		public Group getGroup() { return cGroup; }
-
-		//"-"?
+		
+		//'-'?
 		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
-
+		
 		//INT
 		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
 	}
-
-	public class QualifiedNameElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "QualifiedName");
-		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final RuleCall cValidIDParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
-		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
-		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
-		private final RuleCall cValidIDParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
-		
-		//QualifiedName:
-		//	ValidID ("." ValidID)*;
-		public ParserRule getRule() { return rule; }
-
-		//ValidID ("." ValidID)*
-		public Group getGroup() { return cGroup; }
-
-		//ValidID
-		public RuleCall getValidIDParserRuleCall_0() { return cValidIDParserRuleCall_0; }
-
-		//(=> "." ValidID)*
-		public Group getGroup_1() { return cGroup_1; }
-
-		//=> "."
-		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
-		//ValidID
-		public RuleCall getValidIDParserRuleCall_1_1() { return cValidIDParserRuleCall_1_1; }
-	}
-
-	public class ValidIDElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "ValidID");
-		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
-		
-		//ValidID:
-		//	ID;
-		public ParserRule getRule() { return rule; }
-
-		//ID
-		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
-	}
-	
 	
 	public class EDateStepTypeElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "EDateStepType");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.entitymock.EntityMockDSL.EDateStepType");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cDAYSEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cDAYSDaysKeyword_0_0 = (Keyword)cDAYSEnumLiteralDeclaration_0.eContents().get(0);
@@ -3165,41 +3076,40 @@
 		private final Keyword cYEARSYearsKeyword_3_0 = (Keyword)cYEARSEnumLiteralDeclaration_3.eContents().get(0);
 		
 		//enum EDateStepType:
-		//	DAYS="days" | WEEKS="weeks" | MONTHS="months" | YEARS="years";
+		//	DAYS='days' | WEEKS='weeks' | MONTHS='months' | YEARS='years';
 		public EnumRule getRule() { return rule; }
-
-		//DAYS="days" | WEEKS="weeks" | MONTHS="months" | YEARS="years"
+		
+		//DAYS='days' | WEEKS='weeks' | MONTHS='months' | YEARS='years'
 		public Alternatives getAlternatives() { return cAlternatives; }
-
-		//DAYS="days"
+		
+		//DAYS='days'
 		public EnumLiteralDeclaration getDAYSEnumLiteralDeclaration_0() { return cDAYSEnumLiteralDeclaration_0; }
-
-		//"days"
+		
+		//'days'
 		public Keyword getDAYSDaysKeyword_0_0() { return cDAYSDaysKeyword_0_0; }
-
-		//WEEKS="weeks"
+		
+		//WEEKS='weeks'
 		public EnumLiteralDeclaration getWEEKSEnumLiteralDeclaration_1() { return cWEEKSEnumLiteralDeclaration_1; }
-
-		//"weeks"
+		
+		//'weeks'
 		public Keyword getWEEKSWeeksKeyword_1_0() { return cWEEKSWeeksKeyword_1_0; }
-
-		//MONTHS="months"
+		
+		//MONTHS='months'
 		public EnumLiteralDeclaration getMONTHSEnumLiteralDeclaration_2() { return cMONTHSEnumLiteralDeclaration_2; }
-
-		//"months"
+		
+		//'months'
 		public Keyword getMONTHSMonthsKeyword_2_0() { return cMONTHSMonthsKeyword_2_0; }
-
-		//YEARS="years"
+		
+		//YEARS='years'
 		public EnumLiteralDeclaration getYEARSEnumLiteralDeclaration_3() { return cYEARSEnumLiteralDeclaration_3; }
-
-		//"years"
+		
+		//'years'
 		public Keyword getYEARSYearsKeyword_3_0() { return cYEARSYearsKeyword_3_0; }
 	}
 	
 	private final EntityMockModelElements pEntityMockModel;
 	private final EntityMockPackageElements pEntityMockPackage;
-	private final EntityModelImportElements pEntityModelImport;
-	private final EntityMockQualifiedNameWithWildCardElements pEntityMockQualifiedNameWithWildCard;
+	private final EntityMockElements pEntityMock;
 	private final RunningDataInterchangesElements pRunningDataInterchanges;
 	private final RunningDataInterchangeElements pRunningDataInterchange;
 	private final EntityMockResourcesElements pEntityMockResources;
@@ -3209,7 +3119,6 @@
 	private final EntityMockObjectsElements pEntityMockObjects;
 	private final EntityMockObjectElements pEntityMockObject;
 	private final EntityMockObjectEnumElements pEntityMockObjectEnum;
-	private final EntityMockDataTypesElements pEntityMockDataTypes;
 	private final IEntityMockObjectUsableElements pIEntityMockObjectUsable;
 	private final IEntityMockObjectAttributeElements pIEntityMockObjectAttribute;
 	private final EntityMockObjectPlainValueElements pEntityMockObjectPlainValue;
@@ -3237,20 +3146,20 @@
 	private final PropertyFillerUnsignedDoubleRandomElements pPropertyFillerUnsignedDoubleRandom;
 	private final PropertyFillerUnsignedIntegerRangeElements pPropertyFillerUnsignedIntegerRange;
 	private final PropertyFillerUnsignedIntegerRandomElements pPropertyFillerUnsignedIntegerRandom;
-	private final EntityMockDataTypeElements pEntityMockDataType;
 	private final EntityMockEntitiesElements pEntityMockEntities;
 	private final EntityMockEntityElements pEntityMockEntity;
 	private final IIterateElements pIIterate;
 	private final IntegerIterateElements pIntegerIterate;
 	private final DateIterateElements pDateIterate;
 	private final DateElements pDate;
-	private final EDateStepTypeElements unknownRuleEDateStepType;
+	private final EDateStepTypeElements eEDateStepType;
 	private final EntityMockByResourceAttributeElements pEntityMockByResourceAttribute;
-	private final EntityMockTemporaryElements pEntityMockTemporary;
+	private final EntityMockTemplateElements pEntityMockTemplate;
 	private final IEntityMockEntityUsableElements pIEntityMockEntityUsable;
 	private final IEntityMockAttributeElements pIEntityMockAttribute;
 	private final EntityMockEntityFunctionElements pEntityMockEntityFunction;
 	private final EntityMockEntityFunctionParameterElements pEntityMockEntityFunctionParameter;
+	private final EntityMockEntityNestedAttributeElements pEntityMockEntityNestedAttribute;
 	private final EntityMockReferencedObjectAttributeElements pEntityMockReferencedObjectAttribute;
 	private final EntityMockAttributeByObjectElements pEntityMockAttributeByObject;
 	private final EntityMockAttributeFillerElements pEntityMockAttributeFiller;
@@ -3258,23 +3167,31 @@
 	private final SignedNumberElements pSignedNumber;
 	private final UnsignedNumberElements pUnsignedNumber;
 	private final SINTElements pSINT;
-	private final QualifiedNameElements pQualifiedName;
-	private final ValidIDElements pValidID;
-	private final TerminalRule tID;
 	
 	private final Grammar grammar;
-
+	
+	private final OXtypeGrammarAccess gaOXtype;
+	
 	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
+	
+	private final XbaseGrammarAccess gaXbase;
+	
+	private final XtypeGrammarAccess gaXtype;
 
 	@Inject
 	public EntityMockDSLGrammarAccess(GrammarProvider grammarProvider,
-		XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations) {
+			OXtypeGrammarAccess gaOXtype,
+			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
+			XbaseGrammarAccess gaXbase,
+			XtypeGrammarAccess gaXtype) {
 		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaOXtype = gaOXtype;
 		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
+		this.gaXbase = gaXbase;
+		this.gaXtype = gaXtype;
 		this.pEntityMockModel = new EntityMockModelElements();
 		this.pEntityMockPackage = new EntityMockPackageElements();
-		this.pEntityModelImport = new EntityModelImportElements();
-		this.pEntityMockQualifiedNameWithWildCard = new EntityMockQualifiedNameWithWildCardElements();
+		this.pEntityMock = new EntityMockElements();
 		this.pRunningDataInterchanges = new RunningDataInterchangesElements();
 		this.pRunningDataInterchange = new RunningDataInterchangeElements();
 		this.pEntityMockResources = new EntityMockResourcesElements();
@@ -3284,7 +3201,6 @@
 		this.pEntityMockObjects = new EntityMockObjectsElements();
 		this.pEntityMockObject = new EntityMockObjectElements();
 		this.pEntityMockObjectEnum = new EntityMockObjectEnumElements();
-		this.pEntityMockDataTypes = new EntityMockDataTypesElements();
 		this.pIEntityMockObjectUsable = new IEntityMockObjectUsableElements();
 		this.pIEntityMockObjectAttribute = new IEntityMockObjectAttributeElements();
 		this.pEntityMockObjectPlainValue = new EntityMockObjectPlainValueElements();
@@ -3312,20 +3228,20 @@
 		this.pPropertyFillerUnsignedDoubleRandom = new PropertyFillerUnsignedDoubleRandomElements();
 		this.pPropertyFillerUnsignedIntegerRange = new PropertyFillerUnsignedIntegerRangeElements();
 		this.pPropertyFillerUnsignedIntegerRandom = new PropertyFillerUnsignedIntegerRandomElements();
-		this.pEntityMockDataType = new EntityMockDataTypeElements();
 		this.pEntityMockEntities = new EntityMockEntitiesElements();
 		this.pEntityMockEntity = new EntityMockEntityElements();
 		this.pIIterate = new IIterateElements();
 		this.pIntegerIterate = new IntegerIterateElements();
 		this.pDateIterate = new DateIterateElements();
 		this.pDate = new DateElements();
-		this.unknownRuleEDateStepType = new EDateStepTypeElements();
+		this.eEDateStepType = new EDateStepTypeElements();
 		this.pEntityMockByResourceAttribute = new EntityMockByResourceAttributeElements();
-		this.pEntityMockTemporary = new EntityMockTemporaryElements();
+		this.pEntityMockTemplate = new EntityMockTemplateElements();
 		this.pIEntityMockEntityUsable = new IEntityMockEntityUsableElements();
 		this.pIEntityMockAttribute = new IEntityMockAttributeElements();
 		this.pEntityMockEntityFunction = new EntityMockEntityFunctionElements();
 		this.pEntityMockEntityFunctionParameter = new EntityMockEntityFunctionParameterElements();
+		this.pEntityMockEntityNestedAttribute = new EntityMockEntityNestedAttributeElements();
 		this.pEntityMockReferencedObjectAttribute = new EntityMockReferencedObjectAttributeElements();
 		this.pEntityMockAttributeByObject = new EntityMockAttributeByObjectElements();
 		this.pEntityMockAttributeFiller = new EntityMockAttributeFillerElements();
@@ -3333,9 +3249,6 @@
 		this.pSignedNumber = new SignedNumberElements();
 		this.pUnsignedNumber = new UnsignedNumberElements();
 		this.pSINT = new SINTElements();
-		this.pQualifiedName = new QualifiedNameElements();
-		this.pValidID = new ValidIDElements();
-		this.tID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "ID");
 	}
 	
 	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
@@ -3354,18 +3267,31 @@
 		return grammar;
 	}
 	
-	
+	@Override
 	public Grammar getGrammar() {
 		return grammar;
 	}
 	
-
+	
+	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
+		return gaOXtype;
+	}
+	
 	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
 		return gaXbaseWithAnnotations;
 	}
+	
+	public XbaseGrammarAccess getXbaseGrammarAccess() {
+		return gaXbase;
+	}
+	
+	public XtypeGrammarAccess getXtypeGrammarAccess() {
+		return gaXtype;
+	}
 
 	
 	//EntityMockModel:
+	//	importSection=XImportSection?
 	//	packages+=EntityMockPackage*;
 	public EntityMockModelElements getEntityMockModelAccess() {
 		return pEntityMockModel;
@@ -3374,11 +3300,10 @@
 	public ParserRule getEntityMockModelRule() {
 		return getEntityMockModelAccess().getRule();
 	}
-
+	
 	//EntityMockPackage:
-	//	"mock entitymodel for" imports+=EntityModelImport "{" ("run with priority" runPriority=INT)? ("import"
-	//	imports+=EntityModelImport)* datainterchanges=RunningDataInterchanges? resources=EntityMockResources?
-	//	objects=EntityMockObjects? datatypes=EntityMockDataTypes? entities=EntityMockEntities "}";
+	//	{EntityMockPackage} 'package' name=QualifiedName ('{'
+	//	mocks+=EntityMock* '}')?;
 	public EntityMockPackageElements getEntityMockPackageAccess() {
 		return pEntityMockPackage;
 	}
@@ -3386,29 +3311,24 @@
 	public ParserRule getEntityMockPackageRule() {
 		return getEntityMockPackageAccess().getRule();
 	}
-
-	//EntityModelImport returns types::LImport:
-	//	importedNamespace=EntityMockQualifiedNameWithWildCard;
-	public EntityModelImportElements getEntityModelImportAccess() {
-		return pEntityModelImport;
+	
+	//EntityMock:
+	//	{EntityMock} 'mock' name=ID (description?='describedBy' descriptionValue=STRING)? ('{' (('priority' runPriority=INT)?
+	//	& datainterchanges=RunningDataInterchanges? & resources=EntityMockResources? & objects=EntityMockObjects? &
+	//	entities=EntityMockEntities)
+	//	'}')?;
+	public EntityMockElements getEntityMockAccess() {
+		return pEntityMock;
 	}
 	
-	public ParserRule getEntityModelImportRule() {
-		return getEntityModelImportAccess().getRule();
-	}
-
-	//EntityMockQualifiedNameWithWildCard:
-	//	QualifiedName ("." "*")?;
-	public EntityMockQualifiedNameWithWildCardElements getEntityMockQualifiedNameWithWildCardAccess() {
-		return pEntityMockQualifiedNameWithWildCard;
+	public ParserRule getEntityMockRule() {
+		return getEntityMockAccess().getRule();
 	}
 	
-	public ParserRule getEntityMockQualifiedNameWithWildCardRule() {
-		return getEntityMockQualifiedNameWithWildCardAccess().getRule();
-	}
-
 	//RunningDataInterchanges:
-	//	{RunningDataInterchanges} "datainterchanges" "{" datainterchanges+=RunningDataInterchange* "}";
+	//	{RunningDataInterchanges} 'datainterchanges' '{'
+	//	datainterchanges+=RunningDataInterchange*
+	//	'}';
 	public RunningDataInterchangesElements getRunningDataInterchangesAccess() {
 		return pRunningDataInterchanges;
 	}
@@ -3416,9 +3336,9 @@
 	public ParserRule getRunningDataInterchangesRule() {
 		return getRunningDataInterchangesAccess().getRule();
 	}
-
+	
 	//RunningDataInterchange:
-	//	{RunningDataInterchange} "datainterchange import" datainterchangeRef=[datainterchange::DataInterchange] "from file"
+	//	{RunningDataInterchange} 'datainterchange' datainterchangeRef=[datainterchange::DataInterchange] 'file'
 	//	fileURL=STRING;
 	public RunningDataInterchangeElements getRunningDataInterchangeAccess() {
 		return pRunningDataInterchange;
@@ -3427,9 +3347,11 @@
 	public ParserRule getRunningDataInterchangeRule() {
 		return getRunningDataInterchangeAccess().getRule();
 	}
-
+	
 	//EntityMockResources:
-	//	{EntityMockResources} "resources" "{" resources+=EntityMockResource* "}";
+	//	{EntityMockResources} 'resources' '{'
+	//	resources+=EntityMockResource*
+	//	'}';
 	public EntityMockResourcesElements getEntityMockResourcesAccess() {
 		return pEntityMockResources;
 	}
@@ -3437,10 +3359,11 @@
 	public ParserRule getEntityMockResourcesRule() {
 		return getEntityMockResourcesAccess().getRule();
 	}
-
+	
 	//EntityMockResource:
-	//	"resource" name=QualifiedName "{" ("attributes" "(" (attributes+=EntityMockResourceAttribute ","?)* ")")? "items" "{"
-	//	datarows+=EntityMockResourceDataRow* "}" "}";
+	//	'resource' name=ID '{' ('attributes' '(' (attributes+=EntityMockResourceAttribute ','?)* ')')?
+	//	'items' '{' datarows+=EntityMockResourceDataRow* '}'
+	//	'}';
 	public EntityMockResourceElements getEntityMockResourceAccess() {
 		return pEntityMockResource;
 	}
@@ -3448,9 +3371,9 @@
 	public ParserRule getEntityMockResourceRule() {
 		return getEntityMockResourceAccess().getRule();
 	}
-
+	
 	//EntityMockResourceAttribute:
-	//	{EntityMockResourceAttribute} name=QualifiedName;
+	//	{EntityMockResourceAttribute} name=ID;
 	public EntityMockResourceAttributeElements getEntityMockResourceAttributeAccess() {
 		return pEntityMockResourceAttribute;
 	}
@@ -3458,9 +3381,9 @@
 	public ParserRule getEntityMockResourceAttributeRule() {
 		return getEntityMockResourceAttributeAccess().getRule();
 	}
-
+	
 	//EntityMockResourceDataRow:
-	//	{EntityMockResourceDataRow} name=QualifiedName ("(" (values+=STRING ","?)* ")")?;
+	//	{EntityMockResourceDataRow} name=ID ('(' (values+=STRING ','?)* ')')?;
 	public EntityMockResourceDataRowElements getEntityMockResourceDataRowAccess() {
 		return pEntityMockResourceDataRow;
 	}
@@ -3468,9 +3391,11 @@
 	public ParserRule getEntityMockResourceDataRowRule() {
 		return getEntityMockResourceDataRowAccess().getRule();
 	}
-
+	
 	//EntityMockObjects:
-	//	{EntityMockObjects} "objects" "{" objects+=EntityMockObject* "}";
+	//	{EntityMockObjects} 'objects' '{'
+	//	objects+=EntityMockObject*
+	//	'}';
 	public EntityMockObjectsElements getEntityMockObjectsAccess() {
 		return pEntityMockObjects;
 	}
@@ -3478,10 +3403,13 @@
 	public ParserRule getEntityMockObjectsRule() {
 		return getEntityMockObjectsAccess().getRule();
 	}
-
+	
 	//EntityMockObject:
-	//	"object" name=QualifiedName "{" enumerations+=EntityMockObjectEnum* attributes+=IEntityMockObjectAttribute*
-	//	calculations+=EntityMockObjectFunction* "}";
+	//	'object' name=ID '{'
+	//	enumerations+=EntityMockObjectEnum*
+	//	attributes+=IEntityMockObjectAttribute*
+	//	calculations+=EntityMockObjectFunction*
+	//	'}';
 	public EntityMockObjectElements getEntityMockObjectAccess() {
 		return pEntityMockObject;
 	}
@@ -3489,9 +3417,9 @@
 	public ParserRule getEntityMockObjectRule() {
 		return getEntityMockObjectAccess().getRule();
 	}
-
+	
 	//EntityMockObjectEnum:
-	//	"var" name=QualifiedName "by enum" usingResource=[types::LEnum];
+	//	'var' name=ID 'byEnum' usingResource=[types::LEnum];
 	public EntityMockObjectEnumElements getEntityMockObjectEnumAccess() {
 		return pEntityMockObjectEnum;
 	}
@@ -3499,17 +3427,7 @@
 	public ParserRule getEntityMockObjectEnumRule() {
 		return getEntityMockObjectEnumAccess().getRule();
 	}
-
-	//EntityMockDataTypes:
-	//	{EntityMockDataTypes} "datatypes" "{" datatypes+=EntityMockDataType* "}";
-	public EntityMockDataTypesElements getEntityMockDataTypesAccess() {
-		return pEntityMockDataTypes;
-	}
 	
-	public ParserRule getEntityMockDataTypesRule() {
-		return getEntityMockDataTypesAccess().getRule();
-	}
-
 	//IEntityMockObjectUsable:
 	//	EntityMockObjectFunction | EntityMockObjectEnum | EntityMockObjectPlainValue | EntityMockObjectArrayValue |
 	//	EntityMockObjectEmbed | EntityMockObjectFill;
@@ -3520,7 +3438,7 @@
 	public ParserRule getIEntityMockObjectUsableRule() {
 		return getIEntityMockObjectUsableAccess().getRule();
 	}
-
+	
 	//IEntityMockObjectAttribute:
 	//	EntityMockObjectResourceValue | EntityMockObjectPlainValue | EntityMockObjectArrayValue | EntityMockObjectEmbed |
 	//	EntityMockObjectFill;
@@ -3531,9 +3449,9 @@
 	public ParserRule getIEntityMockObjectAttributeRule() {
 		return getIEntityMockObjectAttributeAccess().getRule();
 	}
-
+	
 	//EntityMockObjectPlainValue:
-	//	"var" name=QualifiedName "(" (values+=STRING ","?)* ")";
+	//	'var' name=ID '(' (values+=STRING ','?)* ')';
 	public EntityMockObjectPlainValueElements getEntityMockObjectPlainValueAccess() {
 		return pEntityMockObjectPlainValue;
 	}
@@ -3541,10 +3459,9 @@
 	public ParserRule getEntityMockObjectPlainValueRule() {
 		return getEntityMockObjectPlainValueAccess().getRule();
 	}
-
+	
 	//EntityMockObjectResourceValue:
-	//	"var" name=QualifiedName "with" resourceEnum=[EntityMockObjectEnum] ("."
-	//	resourceAttribute=[EntityMockResourceAttribute])?;
+	//	'var' name=ID 'with' resourceEnum=[EntityMockObjectEnum] ('.' resourceAttribute=[EntityMockResourceAttribute])?;
 	public EntityMockObjectResourceValueElements getEntityMockObjectResourceValueAccess() {
 		return pEntityMockObjectResourceValue;
 	}
@@ -3552,9 +3469,9 @@
 	public ParserRule getEntityMockObjectResourceValueRule() {
 		return getEntityMockObjectResourceValueAccess().getRule();
 	}
-
+	
 	//EntityMockObjectArrayValue:
-	//	"var" name=QualifiedName "switch on" enumeration=[EntityMockObjectEnum] "{" items+=EntityMockObjectItemValue* "}";
+	//	'var' name=ID 'switchOn' enumeration=[EntityMockObjectEnum] '{' items+=EntityMockObjectItemValue* '}';
 	public EntityMockObjectArrayValueElements getEntityMockObjectArrayValueAccess() {
 		return pEntityMockObjectArrayValue;
 	}
@@ -3562,9 +3479,9 @@
 	public ParserRule getEntityMockObjectArrayValueRule() {
 		return getEntityMockObjectArrayValueAccess().getRule();
 	}
-
+	
 	//EntityMockObjectItemValue:
-	//	"when" datarow=[types::LEnumLiteral] "(" (values+=STRING ","?)* ")";
+	//	'when' datarow=[types::LEnumLiteral] '(' (values+=STRING ','?)* ')';
 	public EntityMockObjectItemValueElements getEntityMockObjectItemValueAccess() {
 		return pEntityMockObjectItemValue;
 	}
@@ -3572,9 +3489,9 @@
 	public ParserRule getEntityMockObjectItemValueRule() {
 		return getEntityMockObjectItemValueAccess().getRule();
 	}
-
+	
 	//EntityMockObjectEmbed:
-	//	{EntityMockObjectEmbed} "embed" name=QualifiedName "defined as" object=[EntityMockObject];
+	//	{EntityMockObjectEmbed} 'embed' name=ID 'definedAs' object=[EntityMockObject];
 	public EntityMockObjectEmbedElements getEntityMockObjectEmbedAccess() {
 		return pEntityMockObjectEmbed;
 	}
@@ -3582,10 +3499,10 @@
 	public ParserRule getEntityMockObjectEmbedRule() {
 		return getEntityMockObjectEmbedAccess().getRule();
 	}
-
+	
 	//EntityMockObjectFunction:
-	//	"var" name=QualifiedName "calculate as" oftype=JvmParameterizedTypeReference "based on" "("
-	//	(params+=EntityMockObjectFunctionParameter ("," params+=EntityMockObjectFunctionParameter)*)? ")"
+	//	'var' name=ID 'calculateAs' oftype=JvmParameterizedTypeReference
+	//	'basedOn' '(' (params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)*)? ')'
 	//	body=XBlockExpression;
 	public EntityMockObjectFunctionElements getEntityMockObjectFunctionAccess() {
 		return pEntityMockObjectFunction;
@@ -3594,7 +3511,7 @@
 	public ParserRule getEntityMockObjectFunctionRule() {
 		return getEntityMockObjectFunctionAccess().getRule();
 	}
-
+	
 	//EntityMockObjectFunctionParameter:
 	//	parameterType=JvmTypeReference name=[IEntityMockObjectUsable];
 	public EntityMockObjectFunctionParameterElements getEntityMockObjectFunctionParameterAccess() {
@@ -3604,9 +3521,9 @@
 	public ParserRule getEntityMockObjectFunctionParameterRule() {
 		return getEntityMockObjectFunctionParameterAccess().getRule();
 	}
-
+	
 	//EntityMockObjectFill:
-	//	"var" name=QualifiedName "randomize" fillerType=PropertyFillerType;
+	//	'var' name=ID 'randomize' fillerType=PropertyFillerType;
 	public EntityMockObjectFillElements getEntityMockObjectFillAccess() {
 		return pEntityMockObjectFill;
 	}
@@ -3614,13 +3531,17 @@
 	public ParserRule getEntityMockObjectFillRule() {
 		return getEntityMockObjectFillAccess().getRule();
 	}
-
+	
 	//PropertyFillerType:
-	//	PropertyFillerDateFuture | PropertyFillerDatePast | PropertyFillerDateRange | PropertyFillerBoolean |
-	//	PropertyFillerSignedDoubleRange | PropertyFillerSignedDoubleRandom | PropertyFillerSignedIntegerRange |
-	//	PropertyFillerSignedIntegerRandom | PropertyFillerTextRandom | PropertyFillerTextParagraphs |
-	//	PropertyFillerTextSentences | PropertyFillerTextWords | PropertyFillerUnsignedDoubleRange |
-	//	PropertyFillerUnsignedDoubleRandom | PropertyFillerUnsignedIntegerRange | PropertyFillerUnsignedIntegerRandom;
+	//	PropertyFillerDateFuture | PropertyFillerDatePast
+	//	| PropertyFillerDateRange
+	//	| PropertyFillerBoolean
+	//	| PropertyFillerSignedDoubleRange | PropertyFillerSignedDoubleRandom
+	//	| PropertyFillerSignedIntegerRange | PropertyFillerSignedIntegerRandom
+	//	| PropertyFillerTextRandom
+	//	| PropertyFillerTextParagraphs | PropertyFillerTextSentences | PropertyFillerTextWords
+	//	| PropertyFillerUnsignedDoubleRange | PropertyFillerUnsignedDoubleRandom
+	//	| PropertyFillerUnsignedIntegerRange | PropertyFillerUnsignedIntegerRandom;
 	public PropertyFillerTypeElements getPropertyFillerTypeAccess() {
 		return pPropertyFillerType;
 	}
@@ -3628,9 +3549,9 @@
 	public ParserRule getPropertyFillerTypeRule() {
 		return getPropertyFillerTypeAccess().getRule();
 	}
-
+	
 	//PropertyFillerDateFuture:
-	//	"future date" dateFutureYears=INT "years";
+	//	'future' dateFutureYears=INT 'years';
 	public PropertyFillerDateFutureElements getPropertyFillerDateFutureAccess() {
 		return pPropertyFillerDateFuture;
 	}
@@ -3638,9 +3559,9 @@
 	public ParserRule getPropertyFillerDateFutureRule() {
 		return getPropertyFillerDateFutureAccess().getRule();
 	}
-
+	
 	//PropertyFillerDatePast:
-	//	"past date" datePastYears=INT "years";
+	//	'past' datePastYears=INT 'years';
 	public PropertyFillerDatePastElements getPropertyFillerDatePastAccess() {
 		return pPropertyFillerDatePast;
 	}
@@ -3648,9 +3569,9 @@
 	public ParserRule getPropertyFillerDatePastRule() {
 		return getPropertyFillerDatePastAccess().getRule();
 	}
-
+	
 	//PropertyFillerBoolean:
-	//	{PropertyFillerBoolean} "boolean";
+	//	{PropertyFillerBoolean} 'boolean';
 	public PropertyFillerBooleanElements getPropertyFillerBooleanAccess() {
 		return pPropertyFillerBoolean;
 	}
@@ -3658,9 +3579,9 @@
 	public ParserRule getPropertyFillerBooleanRule() {
 		return getPropertyFillerBooleanAccess().getRule();
 	}
-
+	
 	//PropertyFillerDateRange:
-	//	"date in range" dateBeginYears=SINT "up to and including" dateEndYears=SINT "years";
+	//	'dateRange' 'from' dateBeginYears=SINT 'until' dateEndYears=SINT 'years';
 	public PropertyFillerDateRangeElements getPropertyFillerDateRangeAccess() {
 		return pPropertyFillerDateRange;
 	}
@@ -3668,11 +3589,11 @@
 	public ParserRule getPropertyFillerDateRangeRule() {
 		return getPropertyFillerDateRangeAccess().getRule();
 	}
-
+	
 	//PropertyFillerSignedDoubleRange:
-	//	"signed double in range" ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? "up to and including"
-	//	(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT "decimals" ("round to"
-	//	rounded=UnsignedNumber)?;
+	//	'numberRange' 'from' ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+	//	(endRange=SignedNumber | endRangeRef=[entity::LEntityAttribute]))?
+	//	'with' decimals=INT 'decimals' ('roundTo' rounded=UnsignedNumber)?;
 	public PropertyFillerSignedDoubleRangeElements getPropertyFillerSignedDoubleRangeAccess() {
 		return pPropertyFillerSignedDoubleRange;
 	}
@@ -3680,9 +3601,9 @@
 	public ParserRule getPropertyFillerSignedDoubleRangeRule() {
 		return getPropertyFillerSignedDoubleRangeAccess().getRule();
 	}
-
+	
 	//PropertyFillerSignedDoubleRandom:
-	//	"signed double from" "(" items+=SignedNumber+ ")";
+	//	'numberPick' '(' items+=SignedNumber+ ')';
 	public PropertyFillerSignedDoubleRandomElements getPropertyFillerSignedDoubleRandomAccess() {
 		return pPropertyFillerSignedDoubleRandom;
 	}
@@ -3690,11 +3611,11 @@
 	public ParserRule getPropertyFillerSignedDoubleRandomRule() {
 		return getPropertyFillerSignedDoubleRandomAccess().getRule();
 	}
-
+	
 	//PropertyFillerSignedIntegerRange:
-	//	{PropertyFillerSignedIntegerRange} "signed integer in range" ((beginRange=SINT |
-	//	beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=SINT |
-	//	endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?;
+	//	{PropertyFillerSignedIntegerRange} 'integerRange' 'from' ((beginRange=SINT |
+	//	beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SINT | endRangeRef=[entity::LEntityAttribute]))?
+	//	('roundTo' rounded=INT)?;
 	public PropertyFillerSignedIntegerRangeElements getPropertyFillerSignedIntegerRangeAccess() {
 		return pPropertyFillerSignedIntegerRange;
 	}
@@ -3702,9 +3623,9 @@
 	public ParserRule getPropertyFillerSignedIntegerRangeRule() {
 		return getPropertyFillerSignedIntegerRangeAccess().getRule();
 	}
-
+	
 	//PropertyFillerSignedIntegerRandom:
-	//	"signed integer from" "(" items+=SINT+ ")";
+	//	'integerPick' '(' items+=SINT+ ')';
 	public PropertyFillerSignedIntegerRandomElements getPropertyFillerSignedIntegerRandomAccess() {
 		return pPropertyFillerSignedIntegerRandom;
 	}
@@ -3712,9 +3633,9 @@
 	public ParserRule getPropertyFillerSignedIntegerRandomRule() {
 		return getPropertyFillerSignedIntegerRandomAccess().getRule();
 	}
-
+	
 	//PropertyFillerTextRandom:
-	//	"text from" "(" items+=STRING+ ")";
+	//	'textPick' '(' items+=STRING+ ')';
 	public PropertyFillerTextRandomElements getPropertyFillerTextRandomAccess() {
 		return pPropertyFillerTextRandom;
 	}
@@ -3722,9 +3643,9 @@
 	public ParserRule getPropertyFillerTextRandomRule() {
 		return getPropertyFillerTextRandomAccess().getRule();
 	}
-
+	
 	//PropertyFillerTextParagraphs:
-	//	{PropertyFillerTextParagraphs} "paragraps" count=INT?;
+	//	{PropertyFillerTextParagraphs} 'paragraphs' count=INT?;
 	public PropertyFillerTextParagraphsElements getPropertyFillerTextParagraphsAccess() {
 		return pPropertyFillerTextParagraphs;
 	}
@@ -3732,9 +3653,9 @@
 	public ParserRule getPropertyFillerTextParagraphsRule() {
 		return getPropertyFillerTextParagraphsAccess().getRule();
 	}
-
+	
 	//PropertyFillerTextSentences:
-	//	{PropertyFillerTextSentences} "sentences" count=INT?;
+	//	{PropertyFillerTextSentences} 'sentences' count=INT?;
 	public PropertyFillerTextSentencesElements getPropertyFillerTextSentencesAccess() {
 		return pPropertyFillerTextSentences;
 	}
@@ -3742,9 +3663,9 @@
 	public ParserRule getPropertyFillerTextSentencesRule() {
 		return getPropertyFillerTextSentencesAccess().getRule();
 	}
-
+	
 	//PropertyFillerTextWords:
-	//	{PropertyFillerTextWords} "words" count=INT?;
+	//	{PropertyFillerTextWords} 'words' count=INT?;
 	public PropertyFillerTextWordsElements getPropertyFillerTextWordsAccess() {
 		return pPropertyFillerTextWords;
 	}
@@ -3752,11 +3673,11 @@
 	public ParserRule getPropertyFillerTextWordsRule() {
 		return getPropertyFillerTextWordsAccess().getRule();
 	}
-
+	
 	//PropertyFillerUnsignedDoubleRange:
-	//	"unsigned double in range" ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])?
-	//	"up to and including" (endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))? "with" decimals=INT
-	//	"decimals" ("round to" rounded=UnsignedNumber)?;
+	//	'unsignedNumberRange' 'from' ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until'
+	//	(endRange=UnsignedNumber | endRangeRef=[entity::LEntityAttribute]))?
+	//	'with' decimals=INT 'decimals' ('roundTo' rounded=UnsignedNumber)?;
 	public PropertyFillerUnsignedDoubleRangeElements getPropertyFillerUnsignedDoubleRangeAccess() {
 		return pPropertyFillerUnsignedDoubleRange;
 	}
@@ -3764,9 +3685,9 @@
 	public ParserRule getPropertyFillerUnsignedDoubleRangeRule() {
 		return getPropertyFillerUnsignedDoubleRangeAccess().getRule();
 	}
-
+	
 	//PropertyFillerUnsignedDoubleRandom:
-	//	"unsigned double from" "(" items+=UnsignedNumber+ ")";
+	//	'unsignedNumberPick' '(' items+=UnsignedNumber+ ')';
 	public PropertyFillerUnsignedDoubleRandomElements getPropertyFillerUnsignedDoubleRandomAccess() {
 		return pPropertyFillerUnsignedDoubleRandom;
 	}
@@ -3774,11 +3695,11 @@
 	public ParserRule getPropertyFillerUnsignedDoubleRandomRule() {
 		return getPropertyFillerUnsignedDoubleRandomAccess().getRule();
 	}
-
+	
 	//PropertyFillerUnsignedIntegerRange:
-	//	{PropertyFillerUnsignedIntegerRange} "unsigned integer in range" ((beginRange=INT |
-	//	beginRangeRef=[entity::LEntityAttribute])? "up to and including" (endRange=INT |
-	//	endRangeRef=[entity::LEntityAttribute]))? ("round to" rounded=INT)?;
+	//	{PropertyFillerUnsignedIntegerRange} 'unsignedIntegerRange' 'from' ((beginRange=INT |
+	//	beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=INT | endRangeRef=[entity::LEntityAttribute]))?
+	//	('roundTo' rounded=INT)?;
 	public PropertyFillerUnsignedIntegerRangeElements getPropertyFillerUnsignedIntegerRangeAccess() {
 		return pPropertyFillerUnsignedIntegerRange;
 	}
@@ -3786,9 +3707,9 @@
 	public ParserRule getPropertyFillerUnsignedIntegerRangeRule() {
 		return getPropertyFillerUnsignedIntegerRangeAccess().getRule();
 	}
-
+	
 	//PropertyFillerUnsignedIntegerRandom:
-	//	"unsigned integer from" "(" items+=INT+ ")";
+	//	'unsignedIntegerPick' '(' items+=INT+ ')';
 	public PropertyFillerUnsignedIntegerRandomElements getPropertyFillerUnsignedIntegerRandomAccess() {
 		return pPropertyFillerUnsignedIntegerRandom;
 	}
@@ -3796,19 +3717,11 @@
 	public ParserRule getPropertyFillerUnsignedIntegerRandomRule() {
 		return getPropertyFillerUnsignedIntegerRandomAccess().getRule();
 	}
-
-	//EntityMockDataType:
-	//	"datatype" name=QualifiedName "{" "}";
-	public EntityMockDataTypeElements getEntityMockDataTypeAccess() {
-		return pEntityMockDataType;
-	}
 	
-	public ParserRule getEntityMockDataTypeRule() {
-		return getEntityMockDataTypeAccess().getRule();
-	}
-
 	//EntityMockEntities:
-	//	{EntityMockEntities} "mock entities" "{" entities+=EntityMockEntity* "}";
+	//	{EntityMockEntities} 'entities' '{'
+	//	entities+=EntityMockEntity*
+	//	'}';
 	public EntityMockEntitiesElements getEntityMockEntitiesAccess() {
 		return pEntityMockEntities;
 	}
@@ -3816,13 +3729,20 @@
 	public ParserRule getEntityMockEntitiesRule() {
 		return getEntityMockEntitiesAccess().getRule();
 	}
-
+	
 	//EntityMockEntity:
-	//	"mocking" name=QualifiedName "for entity" entityRef=[entity::LEntity] ("rows" minRows=INT "to" maxRows=INT "{"
-	//	temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}" |
-	//	"by resource" byResource=[EntityMockResource] "{" byResourceAttributes+=EntityMockByResourceAttribute*
-	//	createBlobMapping?="createBlobMapping"? "}" | "iterate" iterator=[entity::LEntityAttribute] "with" iterate=IIterate
-	//	"{" temporaries+=EntityMockTemporary* attributes+=IEntityMockAttribute* calculations+=EntityMockEntityFunction* "}");
+	//	'mocking' name=ID 'entity' entityRef=[entity::LEntity] ('rows' minRows=INT 'to' maxRows=INT '{'
+	//	templates+=EntityMockTemplate*
+	//	attributes+=IEntityMockAttribute*
+	//	calculations+=EntityMockEntityFunction*
+	//	'}' | 'resource' byResource=[EntityMockResource] '{' (byResourceAttributes+=EntityMockByResourceAttribute* &
+	//	createBlobMapping?='createBlobMapping'?)
+	//	'}' | 'iterate' iterator=[entity::LEntityAttribute]
+	//	'with' iterate=IIterate '{'
+	//	templates+=EntityMockTemplate*
+	//	attributes+=IEntityMockAttribute*
+	//	calculations+=EntityMockEntityFunction*
+	//	'}');
 	public EntityMockEntityElements getEntityMockEntityAccess() {
 		return pEntityMockEntity;
 	}
@@ -3830,7 +3750,7 @@
 	public ParserRule getEntityMockEntityRule() {
 		return getEntityMockEntityAccess().getRule();
 	}
-
+	
 	//IIterate:
 	//	IntegerIterate | DateIterate;
 	public IIterateElements getIIterateAccess() {
@@ -3840,9 +3760,9 @@
 	public ParserRule getIIterateRule() {
 		return getIIterateAccess().getRule();
 	}
-
+	
 	//IntegerIterate:
-	//	"integer from" from=SINT "until" until=SINT "step" step=INT;
+	//	'integerFrom' from=SINT 'until' until=SINT 'step' step=INT;
 	public IntegerIterateElements getIntegerIterateAccess() {
 		return pIntegerIterate;
 	}
@@ -3850,9 +3770,9 @@
 	public ParserRule getIntegerIterateRule() {
 		return getIntegerIterateAccess().getRule();
 	}
-
+	
 	//DateIterate:
-	//	"date from" from=Date "until" until=Date "every" stepCount=INT stepType=EDateStepType;
+	//	'dateFrom' from=Date 'until' until=Date 'every' stepCount=INT stepType=EDateStepType;
 	public DateIterateElements getDateIterateAccess() {
 		return pDateIterate;
 	}
@@ -3860,9 +3780,9 @@
 	public ParserRule getDateIterateRule() {
 		return getDateIterateAccess().getRule();
 	}
-
+	
 	//Date:
-	//	yesterday?="yesterday" | today?="today" | tomorrow?="tomorrow" | year=INT "-" month=INT "-" day=INT;
+	//	yesterday?='yesterday' | today?='today' | tomorrow?='tomorrow' | year=INT '-' month=INT '-' day=INT;
 	public DateElements getDateAccess() {
 		return pDate;
 	}
@@ -3870,19 +3790,19 @@
 	public ParserRule getDateRule() {
 		return getDateAccess().getRule();
 	}
-
+	
 	//enum EDateStepType:
-	//	DAYS="days" | WEEKS="weeks" | MONTHS="months" | YEARS="years";
+	//	DAYS='days' | WEEKS='weeks' | MONTHS='months' | YEARS='years';
 	public EDateStepTypeElements getEDateStepTypeAccess() {
-		return unknownRuleEDateStepType;
+		return eEDateStepType;
 	}
 	
 	public EnumRule getEDateStepTypeRule() {
 		return getEDateStepTypeAccess().getRule();
 	}
-
+	
 	//EntityMockByResourceAttribute:
-	//	{EntityMockByResourceAttribute} "var" attributeRef=[entity::LEntityAttribute] "as"
+	//	{EntityMockByResourceAttribute} 'var' attributeRef=[entity::LEntityAttribute] 'as'
 	//	resourceAttribute=[EntityMockResourceAttribute];
 	public EntityMockByResourceAttributeElements getEntityMockByResourceAttributeAccess() {
 		return pEntityMockByResourceAttribute;
@@ -3891,17 +3811,17 @@
 	public ParserRule getEntityMockByResourceAttributeRule() {
 		return getEntityMockByResourceAttributeAccess().getRule();
 	}
-
-	//EntityMockTemporary:
-	//	"temporary" name=QualifiedName "by object" object=[EntityMockObject];
-	public EntityMockTemporaryElements getEntityMockTemporaryAccess() {
-		return pEntityMockTemporary;
+	
+	//EntityMockTemplate:
+	//	'template' name=ID 'byObject' object=[EntityMockObject];
+	public EntityMockTemplateElements getEntityMockTemplateAccess() {
+		return pEntityMockTemplate;
 	}
 	
-	public ParserRule getEntityMockTemporaryRule() {
-		return getEntityMockTemporaryAccess().getRule();
+	public ParserRule getEntityMockTemplateRule() {
+		return getEntityMockTemplateAccess().getRule();
 	}
-
+	
 	//IEntityMockEntityUsable:
 	//	IEntityMockAttribute | EntityMockEntityFunction;
 	public IEntityMockEntityUsableElements getIEntityMockEntityUsableAccess() {
@@ -3911,7 +3831,7 @@
 	public ParserRule getIEntityMockEntityUsableRule() {
 		return getIEntityMockEntityUsableAccess().getRule();
 	}
-
+	
 	//IEntityMockAttribute:
 	//	EntityMockAttributeByObject | EntityMockAttributeFiller | EntityMockAttributeByReference;
 	public IEntityMockAttributeElements getIEntityMockAttributeAccess() {
@@ -3921,10 +3841,11 @@
 	public ParserRule getIEntityMockAttributeRule() {
 		return getIEntityMockAttributeAccess().getRule();
 	}
-
+	
 	//EntityMockEntityFunction:
-	//	"var" attributeRef=[entity::LEntityAttribute] "calculate based on" "(" (params+=EntityMockEntityFunctionParameter
-	//	("," params+=EntityMockEntityFunctionParameter)*)? ")" body=XBlockExpression;
+	//	'var' attributeRef=[entity::LEntityAttribute]
+	//	'calculateOn' '(' (params+=EntityMockEntityFunctionParameter (',' params+=EntityMockEntityFunctionParameter)*)? ')'
+	//	body=XBlockExpression;
 	public EntityMockEntityFunctionElements getEntityMockEntityFunctionAccess() {
 		return pEntityMockEntityFunction;
 	}
@@ -3932,10 +3853,9 @@
 	public ParserRule getEntityMockEntityFunctionRule() {
 		return getEntityMockEntityFunctionAccess().getRule();
 	}
-
+	
 	//EntityMockEntityFunctionParameter:
-	//	attributeRef=[entity::LEntityAttribute] | referencePaths+=[entity::LEntityReference] ("."?
-	//	referencePaths+=[entity::LEntityReference])* "." referenceRef=[entity::LEntityAttribute];
+	//	attributeRef=[entity::LEntityAttribute] | nestedAttribute=EntityMockEntityNestedAttribute;
 	public EntityMockEntityFunctionParameterElements getEntityMockEntityFunctionParameterAccess() {
 		return pEntityMockEntityFunctionParameter;
 	}
@@ -3943,9 +3863,19 @@
 	public ParserRule getEntityMockEntityFunctionParameterRule() {
 		return getEntityMockEntityFunctionParameterAccess().getRule();
 	}
-
+	
+	//EntityMockEntityNestedAttribute:
+	//	reference=[entity::LEntityReference] '.' attribute=[entity::LEntityAttribute];
+	public EntityMockEntityNestedAttributeElements getEntityMockEntityNestedAttributeAccess() {
+		return pEntityMockEntityNestedAttribute;
+	}
+	
+	public ParserRule getEntityMockEntityNestedAttributeRule() {
+		return getEntityMockEntityNestedAttributeAccess().getRule();
+	}
+	
 	//EntityMockReferencedObjectAttribute:
-	//	{EntityMockReferencedObjectAttribute} temporary=[EntityMockTemporary] ("."? embedded+=[EntityMockObjectEmbed])* "."
+	//	{EntityMockReferencedObjectAttribute} template=[EntityMockTemplate] ('.'? embedded+=[EntityMockObjectEmbed])* '.'
 	//	attribute=[IEntityMockObjectUsable];
 	public EntityMockReferencedObjectAttributeElements getEntityMockReferencedObjectAttributeAccess() {
 		return pEntityMockReferencedObjectAttribute;
@@ -3954,10 +3884,10 @@
 	public ParserRule getEntityMockReferencedObjectAttributeRule() {
 		return getEntityMockReferencedObjectAttributeAccess().getRule();
 	}
-
+	
 	//EntityMockAttributeByObject:
-	//	"var" attributeRef=[entity::LEntityAttribute] ("as" reference=EntityMockReferencedObjectAttribute) | "using"
-	//	resourceEnum=[EntityMockObjectEnum] "." resourceAttribute=[EntityMockResourceAttribute];
+	//	'var' attributeRef=[entity::LEntityAttribute] ('as' reference=EntityMockReferencedObjectAttribute) | 'using'
+	//	resourceEnum=[EntityMockObjectEnum] '.' resourceAttribute=[EntityMockResourceAttribute];
 	public EntityMockAttributeByObjectElements getEntityMockAttributeByObjectAccess() {
 		return pEntityMockAttributeByObject;
 	}
@@ -3965,9 +3895,9 @@
 	public ParserRule getEntityMockAttributeByObjectRule() {
 		return getEntityMockAttributeByObjectAccess().getRule();
 	}
-
+	
 	//EntityMockAttributeFiller:
-	//	"var" attributeRef=[entity::LEntityAttribute] "randomize" fillerType=PropertyFillerType;
+	//	'var' attributeRef=[entity::LEntityAttribute] 'randomize' fillerType=PropertyFillerType;
 	public EntityMockAttributeFillerElements getEntityMockAttributeFillerAccess() {
 		return pEntityMockAttributeFiller;
 	}
@@ -3975,10 +3905,10 @@
 	public ParserRule getEntityMockAttributeFillerRule() {
 		return getEntityMockAttributeFillerAccess().getRule();
 	}
-
+	
 	//EntityMockAttributeByReference:
-	//	"ref" attributeRef=[entity::LEntityReference] "to" ("existing entities" | mockedEntity=[EntityMockEntity])
-	//	("optional for" optionalFor=INT "percent")?;
+	//	'ref' attributeRef=[entity::LEntityReference] 'to' ('existingEntities' | mockedEntity=[EntityMockEntity])
+	//	('optionalFor' optionalFor=INT 'percent')?;
 	public EntityMockAttributeByReferenceElements getEntityMockAttributeByReferenceAccess() {
 		return pEntityMockAttributeByReference;
 	}
@@ -3986,9 +3916,9 @@
 	public ParserRule getEntityMockAttributeByReferenceRule() {
 		return getEntityMockAttributeByReferenceAccess().getRule();
 	}
-
-	//SignedNumber returns ecore::EDouble:
-	//	"-"? UnsignedNumber;
+	
+	//SignedNumber ecore::EDouble:
+	//	'-'? UnsignedNumber;
 	public SignedNumberElements getSignedNumberAccess() {
 		return pSignedNumber;
 	}
@@ -3996,9 +3926,9 @@
 	public ParserRule getSignedNumberRule() {
 		return getSignedNumberAccess().getRule();
 	}
-
-	//UnsignedNumber returns ecore::EDouble:
-	//	INT ("." INT)?;
+	
+	//UnsignedNumber ecore::EDouble:
+	//	INT ('.' INT)?;
 	public UnsignedNumberElements getUnsignedNumberAccess() {
 		return pUnsignedNumber;
 	}
@@ -4006,9 +3936,9 @@
 	public ParserRule getUnsignedNumberRule() {
 		return getUnsignedNumberAccess().getRule();
 	}
-
-	//SINT returns ecore::EInt:
-	//	"-"? INT;
+	
+	//SINT ecore::EInt:
+	//	'-'? INT;
 	public SINTElements getSINTAccess() {
 		return pSINT;
 	}
@@ -4016,37 +3946,27 @@
 	public ParserRule getSINTRule() {
 		return getSINTAccess().getRule();
 	}
-
-	//QualifiedName:
-	//	ValidID ("." ValidID)*;
-	public QualifiedNameElements getQualifiedNameAccess() {
-		return pQualifiedName;
+	
+	//@ Override XImportDeclaration OXImportDeclaration:
+	//	{OXImportDeclaration}
+	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
+	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
+	//	importedNamespace=QualifiedNameWithWildcard
+	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
+	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
+		return gaOXtype.getXImportDeclarationAccess();
 	}
 	
-	public ParserRule getQualifiedNameRule() {
-		return getQualifiedNameAccess().getRule();
-	}
-
-	//ValidID:
-	//	ID;
-	public ValidIDElements getValidIDAccess() {
-		return pValidID;
+	public ParserRule getXImportDeclarationRule() {
+		return getXImportDeclarationAccess().getRule();
 	}
 	
-	public ParserRule getValidIDRule() {
-		return getValidIDAccess().getRule();
-	}
-
-	//terminal ID:
-	//	"^"? ("a".."z" | "A".."Z" | "$" | "_") ("a".."z" | "A".."Z" | "$" | "_" | "0".."9")*;
-	public TerminalRule getIDRule() {
-		return tID;
-	} 
-
 	//XAnnotation:
-	//	{XAnnotation} "@" annotationType=[types::JvmAnnotationType|QualifiedName] ("("
-	//	(elementValuePairs+=XAnnotationElementValuePair ("," elementValuePairs+=XAnnotationElementValuePair)* |
-	//	value=XAnnotationElementValueOrCommaList)? ")")?;
+	//	{XAnnotation}
+	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
+	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
+	//	| value=XAnnotationElementValueOrCommaList)?
+	//	')')?;
 	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
 		return gaXbaseWithAnnotations.getXAnnotationAccess();
 	}
@@ -4054,9 +3974,9 @@
 	public ParserRule getXAnnotationRule() {
 		return getXAnnotationAccess().getRule();
 	}
-
+	
 	//XAnnotationElementValuePair:
-	//	=> (element=[types::JvmOperation|ValidID] "=") value=XAnnotationElementValue;
+	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
 	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
 		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
 	}
@@ -4064,10 +3984,10 @@
 	public ParserRule getXAnnotationElementValuePairRule() {
 		return getXAnnotationElementValuePairAccess().getRule();
 	}
-
-	//XAnnotationElementValueOrCommaList returns xbase::XExpression:
-	//	=> ({xbase::XListLiteral} "#" "[") (elements+=XAnnotationOrExpression ("," elements+=XAnnotationOrExpression)*)? "]"
-	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} ("," elements+=XAnnotationOrExpression)+)?;
+	
+	//XAnnotationElementValueOrCommaList xbase::XExpression:
+	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
+	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
 	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
 		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
 	}
@@ -4075,9 +3995,9 @@
 	public ParserRule getXAnnotationElementValueOrCommaListRule() {
 		return getXAnnotationElementValueOrCommaListAccess().getRule();
 	}
-
-	//XAnnotationElementValue returns xbase::XExpression:
-	//	=> ({xbase::XListLiteral} "#" "[") (elements+=XAnnotationOrExpression ("," elements+=XAnnotationOrExpression)*)? "]"
+	
+	//XAnnotationElementValue xbase::XExpression:
+	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
 	//	| XAnnotationOrExpression;
 	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
 		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
@@ -4086,8 +4006,8 @@
 	public ParserRule getXAnnotationElementValueRule() {
 		return getXAnnotationElementValueAccess().getRule();
 	}
-
-	//XAnnotationOrExpression returns xbase::XExpression:
+	
+	//XAnnotationOrExpression xbase::XExpression:
 	//	XAnnotation | XExpression;
 	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
 		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
@@ -4096,854 +4016,902 @@
 	public ParserRule getXAnnotationOrExpressionRule() {
 		return getXAnnotationOrExpressionAccess().getRule();
 	}
-
+	
 	//XExpression:
 	//	XAssignment;
 	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
-		return gaXbaseWithAnnotations.getXExpressionAccess();
+		return gaXbase.getXExpressionAccess();
 	}
 	
 	public ParserRule getXExpressionRule() {
 		return getXExpressionAccess().getRule();
 	}
-
-	//XAssignment returns XExpression:
+	
+	//XAssignment XExpression:
 	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
 	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
 	//	rightOperand=XAssignment)?;
 	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
-		return gaXbaseWithAnnotations.getXAssignmentAccess();
+		return gaXbase.getXAssignmentAccess();
 	}
 	
 	public ParserRule getXAssignmentRule() {
 		return getXAssignmentAccess().getRule();
 	}
-
+	
 	//OpSingleAssign:
-	//	"=";
+	//	'=';
 	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
-		return gaXbaseWithAnnotations.getOpSingleAssignAccess();
+		return gaXbase.getOpSingleAssignAccess();
 	}
 	
 	public ParserRule getOpSingleAssignRule() {
 		return getOpSingleAssignAccess().getRule();
 	}
-
+	
 	//OpMultiAssign:
-	//	"+=" | "-=" | "*=" | "/=" | "%=" | "<" "<" "=" | ">" ">"? ">=";
+	//	'+=' | '-=' | '*=' | '/=' | '%=' |
+	//	'<' '<' '=' |
+	//	'>' '>'? '>=';
 	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
-		return gaXbaseWithAnnotations.getOpMultiAssignAccess();
+		return gaXbase.getOpMultiAssignAccess();
 	}
 	
 	public ParserRule getOpMultiAssignRule() {
 		return getOpMultiAssignAccess().getRule();
 	}
-
-	//XOrExpression returns XExpression:
+	
+	//XOrExpression XExpression:
 	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
 	//	rightOperand=XAndExpression)*;
 	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
-		return gaXbaseWithAnnotations.getXOrExpressionAccess();
+		return gaXbase.getXOrExpressionAccess();
 	}
 	
 	public ParserRule getXOrExpressionRule() {
 		return getXOrExpressionAccess().getRule();
 	}
-
+	
 	//OpOr:
-	//	"||";
+	//	'||';
 	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
-		return gaXbaseWithAnnotations.getOpOrAccess();
+		return gaXbase.getOpOrAccess();
 	}
 	
 	public ParserRule getOpOrRule() {
 		return getOpOrAccess().getRule();
 	}
-
-	//XAndExpression returns XExpression:
+	
+	//XAndExpression XExpression:
 	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
 	//	rightOperand=XEqualityExpression)*;
 	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
-		return gaXbaseWithAnnotations.getXAndExpressionAccess();
+		return gaXbase.getXAndExpressionAccess();
 	}
 	
 	public ParserRule getXAndExpressionRule() {
 		return getXAndExpressionAccess().getRule();
 	}
-
+	
 	//OpAnd:
-	//	"&&";
+	//	'&&';
 	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
-		return gaXbaseWithAnnotations.getOpAndAccess();
+		return gaXbase.getOpAndAccess();
 	}
 	
 	public ParserRule getOpAndRule() {
 		return getOpAndAccess().getRule();
 	}
-
-	//XEqualityExpression returns XExpression:
+	
+	//XEqualityExpression XExpression:
 	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
 	//	rightOperand=XRelationalExpression)*;
 	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
-		return gaXbaseWithAnnotations.getXEqualityExpressionAccess();
+		return gaXbase.getXEqualityExpressionAccess();
 	}
 	
 	public ParserRule getXEqualityExpressionRule() {
 		return getXEqualityExpressionAccess().getRule();
 	}
-
+	
 	//OpEquality:
-	//	"==" | "!=" | "===" | "!==";
+	//	'==' | '!=' | '===' | '!==';
 	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
-		return gaXbaseWithAnnotations.getOpEqualityAccess();
+		return gaXbase.getOpEqualityAccess();
 	}
 	
 	public ParserRule getOpEqualityRule() {
 		return getOpEqualityAccess().getRule();
 	}
-
-	//XRelationalExpression returns XExpression:
-	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} "instanceof") type=JvmTypeReference | =>
-	//	({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
+	
+	//XRelationalExpression XExpression:
+	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
+	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
 	//	rightOperand=XOtherOperatorExpression)*;
 	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
-		return gaXbaseWithAnnotations.getXRelationalExpressionAccess();
+		return gaXbase.getXRelationalExpressionAccess();
 	}
 	
 	public ParserRule getXRelationalExpressionRule() {
 		return getXRelationalExpressionAccess().getRule();
 	}
-
+	
 	//OpCompare:
-	//	">=" | "<" "=" | ">" | "<";
+	//	'>=' | '<' '=' | '>' | '<';
 	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
-		return gaXbaseWithAnnotations.getOpCompareAccess();
+		return gaXbase.getOpCompareAccess();
 	}
 	
 	public ParserRule getOpCompareRule() {
 		return getOpCompareAccess().getRule();
 	}
-
-	//XOtherOperatorExpression returns XExpression:
+	
+	//XOtherOperatorExpression XExpression:
 	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
 	//	rightOperand=XAdditiveExpression)*;
 	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
-		return gaXbaseWithAnnotations.getXOtherOperatorExpressionAccess();
+		return gaXbase.getXOtherOperatorExpressionAccess();
 	}
 	
 	public ParserRule getXOtherOperatorExpressionRule() {
 		return getXOtherOperatorExpressionAccess().getRule();
 	}
-
+	
 	//OpOther:
-	//	"->" | "..<" | ">" ".." | ".." | "=>" | ">" (=> (">" ">") | ">") | "<" (=> ("<" "<") | "<" | "=>") | "<>" | "?:";
+	//	'->'
+	//	| '..<'
+	//	| '>' '..'
+	//	| '..'
+	//	| '=>'
+	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
+	//	| '?:';
 	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
-		return gaXbaseWithAnnotations.getOpOtherAccess();
+		return gaXbase.getOpOtherAccess();
 	}
 	
 	public ParserRule getOpOtherRule() {
 		return getOpOtherAccess().getRule();
 	}
-
-	//XAdditiveExpression returns XExpression:
+	
+	//XAdditiveExpression XExpression:
 	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
 	//	rightOperand=XMultiplicativeExpression)*;
 	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
-		return gaXbaseWithAnnotations.getXAdditiveExpressionAccess();
+		return gaXbase.getXAdditiveExpressionAccess();
 	}
 	
 	public ParserRule getXAdditiveExpressionRule() {
 		return getXAdditiveExpressionAccess().getRule();
 	}
-
+	
 	//OpAdd:
-	//	"+" | "-";
+	//	'+' | '-';
 	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
-		return gaXbaseWithAnnotations.getOpAddAccess();
+		return gaXbase.getOpAddAccess();
 	}
 	
 	public ParserRule getOpAddRule() {
 		return getOpAddAccess().getRule();
 	}
-
-	//XMultiplicativeExpression returns XExpression:
+	
+	//XMultiplicativeExpression XExpression:
 	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
 	//	rightOperand=XUnaryOperation)*;
 	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
-		return gaXbaseWithAnnotations.getXMultiplicativeExpressionAccess();
+		return gaXbase.getXMultiplicativeExpressionAccess();
 	}
 	
 	public ParserRule getXMultiplicativeExpressionRule() {
 		return getXMultiplicativeExpressionAccess().getRule();
 	}
-
+	
 	//OpMulti:
-	//	"*" | "**" | "/" | "%";
+	//	'*' | '**' | '/' | '%';
 	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
-		return gaXbaseWithAnnotations.getOpMultiAccess();
+		return gaXbase.getOpMultiAccess();
 	}
 	
 	public ParserRule getOpMultiRule() {
 		return getOpMultiAccess().getRule();
 	}
-
-	//XUnaryOperation returns XExpression:
-	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation | XCastedExpression;
+	
+	//XUnaryOperation XExpression:
+	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
+	//	| XCastedExpression;
 	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
-		return gaXbaseWithAnnotations.getXUnaryOperationAccess();
+		return gaXbase.getXUnaryOperationAccess();
 	}
 	
 	public ParserRule getXUnaryOperationRule() {
 		return getXUnaryOperationAccess().getRule();
 	}
-
+	
 	//OpUnary:
 	//	"!" | "-" | "+";
 	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
-		return gaXbaseWithAnnotations.getOpUnaryAccess();
+		return gaXbase.getOpUnaryAccess();
 	}
 	
 	public ParserRule getOpUnaryRule() {
 		return getOpUnaryAccess().getRule();
 	}
-
-	//XCastedExpression returns XExpression:
-	//	XPostfixOperation (=> ({XCastedExpression.target=current} "as") type=JvmTypeReference)*;
+	
+	//XCastedExpression XExpression:
+	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
 	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
-		return gaXbaseWithAnnotations.getXCastedExpressionAccess();
+		return gaXbase.getXCastedExpressionAccess();
 	}
 	
 	public ParserRule getXCastedExpressionRule() {
 		return getXCastedExpressionAccess().getRule();
 	}
-
-	//XPostfixOperation returns XExpression:
+	
+	//XPostfixOperation XExpression:
 	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
 	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
-		return gaXbaseWithAnnotations.getXPostfixOperationAccess();
+		return gaXbase.getXPostfixOperationAccess();
 	}
 	
 	public ParserRule getXPostfixOperationRule() {
 		return getXPostfixOperationAccess().getRule();
 	}
-
+	
 	//OpPostfix:
 	//	"++" | "--";
 	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
-		return gaXbaseWithAnnotations.getOpPostfixAccess();
+		return gaXbase.getOpPostfixAccess();
 	}
 	
 	public ParserRule getOpPostfixRule() {
 		return getOpPostfixAccess().getRule();
 	}
-
-	//XMemberFeatureCall returns XExpression:
-	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ("." | explicitStatic?="::")
-	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment | =>
-	//	({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ("<"
-	//	typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")?
-	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?="(" (memberCallArguments+=XShortClosure
-	//	| memberCallArguments+=XExpression ("," memberCallArguments+=XExpression)*)? ")")? memberCallArguments+=XClosure?)*;
+	
+	//XMemberFeatureCall XExpression:
+	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
+	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
+	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
+	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
+	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
+	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
+	//	')')?
+	//	memberCallArguments+=XClosure?)*;
 	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
-		return gaXbaseWithAnnotations.getXMemberFeatureCallAccess();
+		return gaXbase.getXMemberFeatureCallAccess();
 	}
 	
 	public ParserRule getXMemberFeatureCallRule() {
 		return getXMemberFeatureCallAccess().getRule();
 	}
-
-	//XPrimaryExpression returns XExpression:
+	
+	//XPrimaryExpression XExpression:
 	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
 	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
 	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
 	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
-		return gaXbaseWithAnnotations.getXPrimaryExpressionAccess();
+		return gaXbase.getXPrimaryExpressionAccess();
 	}
 	
 	public ParserRule getXPrimaryExpressionRule() {
 		return getXPrimaryExpressionAccess().getRule();
 	}
-
-	//XLiteral returns XExpression:
+	
+	//XLiteral XExpression:
 	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
 	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
-		return gaXbaseWithAnnotations.getXLiteralAccess();
+		return gaXbase.getXLiteralAccess();
 	}
 	
 	public ParserRule getXLiteralRule() {
 		return getXLiteralAccess().getRule();
 	}
-
+	
 	//XCollectionLiteral:
 	//	XSetLiteral | XListLiteral;
 	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
-		return gaXbaseWithAnnotations.getXCollectionLiteralAccess();
+		return gaXbase.getXCollectionLiteralAccess();
 	}
 	
 	public ParserRule getXCollectionLiteralRule() {
 		return getXCollectionLiteralAccess().getRule();
 	}
-
+	
 	//XSetLiteral:
-	//	{XSetLiteral} "#" "{" (elements+=XExpression ("," elements+=XExpression)*)? "}";
+	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
 	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
-		return gaXbaseWithAnnotations.getXSetLiteralAccess();
+		return gaXbase.getXSetLiteralAccess();
 	}
 	
 	public ParserRule getXSetLiteralRule() {
 		return getXSetLiteralAccess().getRule();
 	}
-
+	
 	//XListLiteral:
-	//	{XListLiteral} "#" "[" (elements+=XExpression ("," elements+=XExpression)*)? "]";
+	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
 	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
-		return gaXbaseWithAnnotations.getXListLiteralAccess();
+		return gaXbase.getXListLiteralAccess();
 	}
 	
 	public ParserRule getXListLiteralRule() {
 		return getXListLiteralAccess().getRule();
 	}
-
-	//XClosure returns XExpression:
-	//	=> ({XClosure} "[") => ((declaredFormalParameters+=JvmFormalParameter (","
-	//	declaredFormalParameters+=JvmFormalParameter)*)? explicitSyntax?="|")? expression=XExpressionInClosure "]";
+	
+	//XClosure XExpression:
+	//	=> ({XClosure}
+	//	'[')
+	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
+	//	explicitSyntax?='|')?
+	//	expression=XExpressionInClosure
+	//	']';
 	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
-		return gaXbaseWithAnnotations.getXClosureAccess();
+		return gaXbase.getXClosureAccess();
 	}
 	
 	public ParserRule getXClosureRule() {
 		return getXClosureAccess().getRule();
 	}
-
-	//XExpressionInClosure returns XExpression:
-	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ";"?)*;
+	
+	//XExpressionInClosure XExpression:
+	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
 	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
-		return gaXbaseWithAnnotations.getXExpressionInClosureAccess();
+		return gaXbase.getXExpressionInClosureAccess();
 	}
 	
 	public ParserRule getXExpressionInClosureRule() {
 		return getXExpressionInClosureAccess().getRule();
 	}
-
-	//XShortClosure returns XExpression:
-	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter ("," declaredFormalParameters+=JvmFormalParameter)*)?
-	//	explicitSyntax?="|") expression=XExpression;
+	
+	//XShortClosure XExpression:
+	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
+	//	explicitSyntax?='|') expression=XExpression;
 	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
-		return gaXbaseWithAnnotations.getXShortClosureAccess();
+		return gaXbase.getXShortClosureAccess();
 	}
 	
 	public ParserRule getXShortClosureRule() {
 		return getXShortClosureAccess().getRule();
 	}
-
-	//XParenthesizedExpression returns XExpression:
-	//	"(" XExpression ")";
+	
+	//XParenthesizedExpression XExpression:
+	//	'(' XExpression ')';
 	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
-		return gaXbaseWithAnnotations.getXParenthesizedExpressionAccess();
+		return gaXbase.getXParenthesizedExpressionAccess();
 	}
 	
 	public ParserRule getXParenthesizedExpressionRule() {
 		return getXParenthesizedExpressionAccess().getRule();
 	}
-
-	//XIfExpression returns XExpression:
-	//	{XIfExpression} "if" "(" if=XExpression ")" then=XExpression ("else" else=XExpression)?;
+	
+	//XIfExpression XExpression:
+	//	{XIfExpression}
+	//	'if' '(' if=XExpression ')'
+	//	then=XExpression (=> 'else' else=XExpression)?;
 	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
-		return gaXbaseWithAnnotations.getXIfExpressionAccess();
+		return gaXbase.getXIfExpressionAccess();
 	}
 	
 	public ParserRule getXIfExpressionRule() {
 		return getXIfExpressionAccess().getRule();
 	}
-
-	//XSwitchExpression returns XExpression:
-	//	{XSwitchExpression} "switch" (=> ("(" declaredParam=JvmFormalParameter ":") switch=XExpression ")" | =>
-	//	(declaredParam=JvmFormalParameter ":")? switch=XExpression) "{" cases+=XCasePart* ("default" ":"
-	//	default=XExpression)? "}";
+	
+	//XSwitchExpression XExpression:
+	//	{XSwitchExpression}
+	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
+	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
+	//	cases+=XCasePart* ('default' ':' default=XExpression)?
+	//	'}';
 	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
-		return gaXbaseWithAnnotations.getXSwitchExpressionAccess();
+		return gaXbase.getXSwitchExpressionAccess();
 	}
 	
 	public ParserRule getXSwitchExpressionRule() {
 		return getXSwitchExpressionAccess().getRule();
 	}
-
+	
 	//XCasePart:
-	//	{XCasePart} typeGuard=JvmTypeReference? ("case" case=XExpression)? (":" then=XExpression | fallThrough?=",");
+	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
 	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
-		return gaXbaseWithAnnotations.getXCasePartAccess();
+		return gaXbase.getXCasePartAccess();
 	}
 	
 	public ParserRule getXCasePartRule() {
 		return getXCasePartAccess().getRule();
 	}
-
-	//XForLoopExpression returns XExpression:
-	//	=> ({XForLoopExpression} "for" "(" declaredParam=JvmFormalParameter ":") forExpression=XExpression ")"
+	
+	//XForLoopExpression XExpression:
+	//	=> ({XForLoopExpression}
+	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
 	//	eachExpression=XExpression;
 	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
-		return gaXbaseWithAnnotations.getXForLoopExpressionAccess();
+		return gaXbase.getXForLoopExpressionAccess();
 	}
 	
 	public ParserRule getXForLoopExpressionRule() {
 		return getXForLoopExpressionAccess().getRule();
 	}
-
-	//XBasicForLoopExpression returns XExpression:
-	//	{XBasicForLoopExpression} "for" "(" (initExpressions+=XExpressionOrVarDeclaration (","
-	//	initExpressions+=XExpressionOrVarDeclaration)*)? ";" expression=XExpression? ";" (updateExpressions+=XExpression (","
-	//	updateExpressions+=XExpression)*)? ")" eachExpression=XExpression;
+	
+	//XBasicForLoopExpression XExpression:
+	//	{XBasicForLoopExpression}
+	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
+	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
+	//	eachExpression=XExpression;
 	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
-		return gaXbaseWithAnnotations.getXBasicForLoopExpressionAccess();
+		return gaXbase.getXBasicForLoopExpressionAccess();
 	}
 	
 	public ParserRule getXBasicForLoopExpressionRule() {
 		return getXBasicForLoopExpressionAccess().getRule();
 	}
-
-	//XWhileExpression returns XExpression:
-	//	{XWhileExpression} "while" "(" predicate=XExpression ")" body=XExpression;
+	
+	//XWhileExpression XExpression:
+	//	{XWhileExpression}
+	//	'while' '(' predicate=XExpression ')'
+	//	body=XExpression;
 	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
-		return gaXbaseWithAnnotations.getXWhileExpressionAccess();
+		return gaXbase.getXWhileExpressionAccess();
 	}
 	
 	public ParserRule getXWhileExpressionRule() {
 		return getXWhileExpressionAccess().getRule();
 	}
-
-	//XDoWhileExpression returns XExpression:
-	//	{XDoWhileExpression} "do" body=XExpression "while" "(" predicate=XExpression ")";
+	
+	//XDoWhileExpression XExpression:
+	//	{XDoWhileExpression}
+	//	'do'
+	//	body=XExpression
+	//	'while' '(' predicate=XExpression ')';
 	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
-		return gaXbaseWithAnnotations.getXDoWhileExpressionAccess();
+		return gaXbase.getXDoWhileExpressionAccess();
 	}
 	
 	public ParserRule getXDoWhileExpressionRule() {
 		return getXDoWhileExpressionAccess().getRule();
 	}
-
-	//XBlockExpression returns XExpression:
-	//	{XBlockExpression} "{" (expressions+=XExpressionOrVarDeclaration ";"?)* "}";
+	
+	//XBlockExpression XExpression:
+	//	{XBlockExpression}
+	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
+	//	'}';
 	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
-		return gaXbaseWithAnnotations.getXBlockExpressionAccess();
+		return gaXbase.getXBlockExpressionAccess();
 	}
 	
 	public ParserRule getXBlockExpressionRule() {
 		return getXBlockExpressionAccess().getRule();
 	}
-
-	//XExpressionOrVarDeclaration returns XExpression:
+	
+	//XExpressionOrVarDeclaration XExpression:
 	//	XVariableDeclaration | XExpression;
 	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
-		return gaXbaseWithAnnotations.getXExpressionOrVarDeclarationAccess();
+		return gaXbase.getXExpressionOrVarDeclarationAccess();
 	}
 	
 	public ParserRule getXExpressionOrVarDeclarationRule() {
 		return getXExpressionOrVarDeclarationAccess().getRule();
 	}
-
-	//XVariableDeclaration returns XExpression:
-	//	{XVariableDeclaration} (writeable?="var" | "val") (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ("="
+	
+	//XVariableDeclaration XExpression:
+	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
 	//	right=XExpression)?;
 	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
-		return gaXbaseWithAnnotations.getXVariableDeclarationAccess();
+		return gaXbase.getXVariableDeclarationAccess();
 	}
 	
 	public ParserRule getXVariableDeclarationRule() {
 		return getXVariableDeclarationAccess().getRule();
 	}
-
-	//JvmFormalParameter returns types::JvmFormalParameter:
+	
+	//JvmFormalParameter types::JvmFormalParameter:
 	//	parameterType=JvmTypeReference? name=ValidID;
 	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
-		return gaXbaseWithAnnotations.getJvmFormalParameterAccess();
+		return gaXbase.getJvmFormalParameterAccess();
 	}
 	
 	public ParserRule getJvmFormalParameterRule() {
 		return getJvmFormalParameterAccess().getRule();
 	}
-
-	//FullJvmFormalParameter returns types::JvmFormalParameter:
+	
+	//FullJvmFormalParameter types::JvmFormalParameter:
 	//	parameterType=JvmTypeReference name=ValidID;
 	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
-		return gaXbaseWithAnnotations.getFullJvmFormalParameterAccess();
+		return gaXbase.getFullJvmFormalParameterAccess();
 	}
 	
 	public ParserRule getFullJvmFormalParameterRule() {
 		return getFullJvmFormalParameterAccess().getRule();
 	}
-
-	//XFeatureCall returns XExpression:
-	//	{XFeatureCall} ("<" typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")?
-	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?="(" (featureCallArguments+=XShortClosure
-	//	| featureCallArguments+=XExpression ("," featureCallArguments+=XExpression)*)? ")")? featureCallArguments+=XClosure?;
+	
+	//XFeatureCall XExpression:
+	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
+	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
+	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
+	//	')')?
+	//	featureCallArguments+=XClosure?;
 	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
-		return gaXbaseWithAnnotations.getXFeatureCallAccess();
+		return gaXbase.getXFeatureCallAccess();
 	}
 	
 	public ParserRule getXFeatureCallRule() {
 		return getXFeatureCallAccess().getRule();
 	}
-
+	
 	//FeatureCallID:
-	//	ValidID | "extends" | "static" | "import" | "extension";
+	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
 	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
-		return gaXbaseWithAnnotations.getFeatureCallIDAccess();
+		return gaXbase.getFeatureCallIDAccess();
 	}
 	
 	public ParserRule getFeatureCallIDRule() {
 		return getFeatureCallIDAccess().getRule();
 	}
-
+	
 	//IdOrSuper:
-	//	FeatureCallID | "super";
+	//	FeatureCallID | 'super';
 	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
-		return gaXbaseWithAnnotations.getIdOrSuperAccess();
+		return gaXbase.getIdOrSuperAccess();
 	}
 	
 	public ParserRule getIdOrSuperRule() {
 		return getIdOrSuperAccess().getRule();
 	}
-
-	//XConstructorCall returns XExpression:
-	//	{XConstructorCall} "new" constructor=[types::JvmConstructor|QualifiedName] ("<"
-	//	typeArguments+=JvmArgumentTypeReference ("," typeArguments+=JvmArgumentTypeReference)* ">")? (=>
-	//	explicitConstructorCall?="(" (arguments+=XShortClosure | arguments+=XExpression ("," arguments+=XExpression)*)? ")")?
+	
+	//XConstructorCall XExpression:
+	//	{XConstructorCall}
+	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
+	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
+	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
+	//	')')?
 	//	arguments+=XClosure?;
 	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
-		return gaXbaseWithAnnotations.getXConstructorCallAccess();
+		return gaXbase.getXConstructorCallAccess();
 	}
 	
 	public ParserRule getXConstructorCallRule() {
 		return getXConstructorCallAccess().getRule();
 	}
-
-	//XBooleanLiteral returns XExpression:
-	//	{XBooleanLiteral} ("false" | isTrue?="true");
+	
+	//XBooleanLiteral XExpression:
+	//	{XBooleanLiteral} ('false' | isTrue?='true');
 	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
-		return gaXbaseWithAnnotations.getXBooleanLiteralAccess();
+		return gaXbase.getXBooleanLiteralAccess();
 	}
 	
 	public ParserRule getXBooleanLiteralRule() {
 		return getXBooleanLiteralAccess().getRule();
 	}
-
-	//XNullLiteral returns XExpression:
-	//	{XNullLiteral} "null";
+	
+	//XNullLiteral XExpression:
+	//	{XNullLiteral} 'null';
 	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
-		return gaXbaseWithAnnotations.getXNullLiteralAccess();
+		return gaXbase.getXNullLiteralAccess();
 	}
 	
 	public ParserRule getXNullLiteralRule() {
 		return getXNullLiteralAccess().getRule();
 	}
-
-	//XNumberLiteral returns XExpression:
+	
+	//XNumberLiteral XExpression:
 	//	{XNumberLiteral} value=Number;
 	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
-		return gaXbaseWithAnnotations.getXNumberLiteralAccess();
+		return gaXbase.getXNumberLiteralAccess();
 	}
 	
 	public ParserRule getXNumberLiteralRule() {
 		return getXNumberLiteralAccess().getRule();
 	}
-
-	//XStringLiteral returns XExpression:
+	
+	//XStringLiteral XExpression:
 	//	{XStringLiteral} value=STRING;
 	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
-		return gaXbaseWithAnnotations.getXStringLiteralAccess();
+		return gaXbase.getXStringLiteralAccess();
 	}
 	
 	public ParserRule getXStringLiteralRule() {
 		return getXStringLiteralAccess().getRule();
 	}
-
-	//XTypeLiteral returns XExpression:
-	//	{XTypeLiteral} "typeof" "(" type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ")";
+	
+	//XTypeLiteral XExpression:
+	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
 	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
-		return gaXbaseWithAnnotations.getXTypeLiteralAccess();
+		return gaXbase.getXTypeLiteralAccess();
 	}
 	
 	public ParserRule getXTypeLiteralRule() {
 		return getXTypeLiteralAccess().getRule();
 	}
-
-	//XThrowExpression returns XExpression:
-	//	{XThrowExpression} "throw" expression=XExpression;
+	
+	//XThrowExpression XExpression:
+	//	{XThrowExpression} 'throw' expression=XExpression;
 	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
-		return gaXbaseWithAnnotations.getXThrowExpressionAccess();
+		return gaXbase.getXThrowExpressionAccess();
 	}
 	
 	public ParserRule getXThrowExpressionRule() {
 		return getXThrowExpressionAccess().getRule();
 	}
-
-	//XReturnExpression returns XExpression:
-	//	{XReturnExpression} "return" -> expression=XExpression?;
+	
+	//XReturnExpression XExpression:
+	//	{XReturnExpression} 'return' -> expression=XExpression?;
 	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
-		return gaXbaseWithAnnotations.getXReturnExpressionAccess();
+		return gaXbase.getXReturnExpressionAccess();
 	}
 	
 	public ParserRule getXReturnExpressionRule() {
 		return getXReturnExpressionAccess().getRule();
 	}
-
-	//XTryCatchFinallyExpression returns XExpression:
-	//	{XTryCatchFinallyExpression} "try" expression=XExpression (catchClauses+=XCatchClause+ ("finally"
-	//	finallyExpression=XExpression)? | "finally" finallyExpression=XExpression);
+	
+	//XTryCatchFinallyExpression XExpression:
+	//	{XTryCatchFinallyExpression}
+	//	'try'
+	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
+	//	| 'finally' finallyExpression=XExpression);
 	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
-		return gaXbaseWithAnnotations.getXTryCatchFinallyExpressionAccess();
+		return gaXbase.getXTryCatchFinallyExpressionAccess();
 	}
 	
 	public ParserRule getXTryCatchFinallyExpressionRule() {
 		return getXTryCatchFinallyExpressionAccess().getRule();
 	}
-
-	//XSynchronizedExpression returns XExpression:
-	//	=> ({XSynchronizedExpression} "synchronized" "(") param=XExpression ")" expression=XExpression;
+	
+	//XSynchronizedExpression XExpression:
+	//	=> ({XSynchronizedExpression}
+	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
 	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
-		return gaXbaseWithAnnotations.getXSynchronizedExpressionAccess();
+		return gaXbase.getXSynchronizedExpressionAccess();
 	}
 	
 	public ParserRule getXSynchronizedExpressionRule() {
 		return getXSynchronizedExpressionAccess().getRule();
 	}
-
+	
 	//XCatchClause:
-	//	"catch" "(" declaredParam=FullJvmFormalParameter ")" expression=XExpression;
+	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
 	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
-		return gaXbaseWithAnnotations.getXCatchClauseAccess();
+		return gaXbase.getXCatchClauseAccess();
 	}
 	
 	public ParserRule getXCatchClauseRule() {
 		return getXCatchClauseAccess().getRule();
 	}
-
+	
+	//QualifiedName:
+	//	ValidID (=> '.' ValidID)*;
+	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
+		return gaXbase.getQualifiedNameAccess();
+	}
+	
+	public ParserRule getQualifiedNameRule() {
+		return getQualifiedNameAccess().getRule();
+	}
+	
 	//Number hidden():
-	//	HEX | (INT | DECIMAL) ("." (INT | DECIMAL))?;
+	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
 	public XbaseGrammarAccess.NumberElements getNumberAccess() {
-		return gaXbaseWithAnnotations.getNumberAccess();
+		return gaXbase.getNumberAccess();
 	}
 	
 	public ParserRule getNumberRule() {
 		return getNumberAccess().getRule();
 	}
-
-	/// **
+	
+	///**
 	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
 	// * which makes downstream grammars break on classloading, when a rule is removed.
-	// * /
-	//StaticQualifier:
-	//	(ValidID "::")+;
+	// */ StaticQualifier:
+	//	(ValidID '::')+;
 	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
-		return gaXbaseWithAnnotations.getStaticQualifierAccess();
+		return gaXbase.getStaticQualifierAccess();
 	}
 	
 	public ParserRule getStaticQualifierRule() {
 		return getStaticQualifierAccess().getRule();
 	}
-
+	
 	//terminal HEX:
-	//	("0x" | "0X") ("0".."9" | "a".."f" | "A".."F" | "_")+ ("#" (("b" | "B") ("i" | "I") | ("l" | "L")))?;
+	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
 	public TerminalRule getHEXRule() {
-		return gaXbaseWithAnnotations.getHEXRule();
-	} 
-
+		return gaXbase.getHEXRule();
+	}
+	
 	//terminal INT returns ecore::EInt:
-	//	"0".."9" ("0".."9" | "_")*;
+	//	'0'..'9' ('0'..'9' | '_')*;
 	public TerminalRule getINTRule() {
-		return gaXbaseWithAnnotations.getINTRule();
-	} 
-
+		return gaXbase.getINTRule();
+	}
+	
 	//terminal DECIMAL:
-	//	INT (("e" | "E") ("+" | "-")? INT)? (("b" | "B") ("i" | "I" | "d" | "D") | ("l" | "L" | "d" | "D" | "f" | "F"))?;
+	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
 	public TerminalRule getDECIMALRule() {
-		return gaXbaseWithAnnotations.getDECIMALRule();
-	} 
-
+		return gaXbase.getDECIMALRule();
+	}
+	
 	//JvmTypeReference:
-	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
-	//	XFunctionTypeRef;
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
+	//	| XFunctionTypeRef;
 	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
-		return gaXbaseWithAnnotations.getJvmTypeReferenceAccess();
+		return gaXtype.getJvmTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmTypeReferenceRule() {
 		return getJvmTypeReferenceAccess().getRule();
 	}
-
+	
 	//ArrayBrackets:
-	//	"[" "]";
+	//	'[' ']';
 	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
-		return gaXbaseWithAnnotations.getArrayBracketsAccess();
+		return gaXtype.getArrayBracketsAccess();
 	}
 	
 	public ParserRule getArrayBracketsRule() {
 		return getArrayBracketsAccess().getRule();
 	}
-
+	
 	//XFunctionTypeRef:
-	//	("(" (paramTypes+=JvmTypeReference ("," paramTypes+=JvmTypeReference)*)? ")")? "=>" returnType=JvmTypeReference;
+	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
 	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
-		return gaXbaseWithAnnotations.getXFunctionTypeRefAccess();
+		return gaXtype.getXFunctionTypeRefAccess();
 	}
 	
 	public ParserRule getXFunctionTypeRefRule() {
 		return getXFunctionTypeRefAccess().getRule();
 	}
-
+	
 	//JvmParameterizedTypeReference:
-	//	type=[JvmType|QualifiedName] ("<" arguments+=JvmArgumentTypeReference ("," arguments+=JvmArgumentTypeReference)* ">"
-	//	(=> ({JvmInnerTypeReference.outer=current} ".") type=[JvmType|ValidID] ("<" arguments+=JvmArgumentTypeReference (","
-	//	arguments+=JvmArgumentTypeReference)* ">")?)*)?;
+	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
+	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
+	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
 	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
-		return gaXbaseWithAnnotations.getJvmParameterizedTypeReferenceAccess();
+		return gaXtype.getJvmParameterizedTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmParameterizedTypeReferenceRule() {
 		return getJvmParameterizedTypeReferenceAccess().getRule();
 	}
-
-	//JvmArgumentTypeReference returns JvmTypeReference:
+	
+	//JvmArgumentTypeReference JvmTypeReference:
 	//	JvmTypeReference | JvmWildcardTypeReference;
 	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
-		return gaXbaseWithAnnotations.getJvmArgumentTypeReferenceAccess();
+		return gaXtype.getJvmArgumentTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmArgumentTypeReferenceRule() {
 		return getJvmArgumentTypeReferenceAccess().getRule();
 	}
-
+	
 	//JvmWildcardTypeReference:
-	//	{JvmWildcardTypeReference} "?" (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded* |
-	//	constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
+	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
+	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
 	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
-		return gaXbaseWithAnnotations.getJvmWildcardTypeReferenceAccess();
+		return gaXtype.getJvmWildcardTypeReferenceAccess();
 	}
 	
 	public ParserRule getJvmWildcardTypeReferenceRule() {
 		return getJvmWildcardTypeReferenceAccess().getRule();
 	}
-
+	
 	//JvmUpperBound:
-	//	"extends" typeReference=JvmTypeReference;
+	//	'extends' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
-		return gaXbaseWithAnnotations.getJvmUpperBoundAccess();
+		return gaXtype.getJvmUpperBoundAccess();
 	}
 	
 	public ParserRule getJvmUpperBoundRule() {
 		return getJvmUpperBoundAccess().getRule();
 	}
-
-	//JvmUpperBoundAnded returns JvmUpperBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmUpperBoundAnded JvmUpperBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
-		return gaXbaseWithAnnotations.getJvmUpperBoundAndedAccess();
+		return gaXtype.getJvmUpperBoundAndedAccess();
 	}
 	
 	public ParserRule getJvmUpperBoundAndedRule() {
 		return getJvmUpperBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmLowerBound:
-	//	"super" typeReference=JvmTypeReference;
+	//	'super' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
-		return gaXbaseWithAnnotations.getJvmLowerBoundAccess();
+		return gaXtype.getJvmLowerBoundAccess();
 	}
 	
 	public ParserRule getJvmLowerBoundRule() {
 		return getJvmLowerBoundAccess().getRule();
 	}
-
-	//JvmLowerBoundAnded returns JvmLowerBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmLowerBoundAnded JvmLowerBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
-		return gaXbaseWithAnnotations.getJvmLowerBoundAndedAccess();
+		return gaXtype.getJvmLowerBoundAndedAccess();
 	}
 	
 	public ParserRule getJvmLowerBoundAndedRule() {
 		return getJvmLowerBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmTypeParameter:
 	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
 	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
-		return gaXbaseWithAnnotations.getJvmTypeParameterAccess();
+		return gaXtype.getJvmTypeParameterAccess();
 	}
 	
 	public ParserRule getJvmTypeParameterRule() {
 		return getJvmTypeParameterAccess().getRule();
 	}
-
+	
 	//QualifiedNameWithWildcard:
-	//	QualifiedName "." "*";
+	//	super::QualifiedName '.' '*';
 	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
-		return gaXbaseWithAnnotations.getQualifiedNameWithWildcardAccess();
+		return gaXtype.getQualifiedNameWithWildcardAccess();
 	}
 	
 	public ParserRule getQualifiedNameWithWildcardRule() {
 		return getQualifiedNameWithWildcardAccess().getRule();
 	}
-
+	
+	//ValidID:
+	//	ID;
+	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
+		return gaXtype.getValidIDAccess();
+	}
+	
+	public ParserRule getValidIDRule() {
+		return getValidIDAccess().getRule();
+	}
+	
 	//XImportSection:
-	//	importDeclarations+=XImportDeclaration+;
+	//	importDeclarations+=super::XImportDeclaration+;
 	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
-		return gaXbaseWithAnnotations.getXImportSectionAccess();
+		return gaXtype.getXImportSectionAccess();
 	}
 	
 	public ParserRule getXImportSectionRule() {
 		return getXImportSectionAccess().getRule();
 	}
-
-	//XImportDeclaration:
-	//	"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
-	//	(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
-	//	importedNamespace=QualifiedNameWithWildcard) ";"?;
-	public XtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
-		return gaXbaseWithAnnotations.getXImportDeclarationAccess();
-	}
 	
-	public ParserRule getXImportDeclarationRule() {
-		return getXImportDeclarationAccess().getRule();
-	}
-
 	//QualifiedNameInStaticImport:
-	//	(ValidID ".")+;
+	//	(ValidID '.')+;
 	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
-		return gaXbaseWithAnnotations.getQualifiedNameInStaticImportAccess();
+		return gaXtype.getQualifiedNameInStaticImportAccess();
 	}
 	
 	public ParserRule getQualifiedNameInStaticImportRule() {
 		return getQualifiedNameInStaticImportAccess().getRule();
 	}
-
+	
+	//terminal ID:
+	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
+	public TerminalRule getIDRule() {
+		return gaXtype.getIDRule();
+	}
+	
 	//terminal STRING:
-	//	"\"" ("\\" . / * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\""))* "\""? | "\'" ("\\" .
-	//	/ * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\'"))* "\'"?;
+	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
+	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
 	public TerminalRule getSTRINGRule() {
-		return gaXbaseWithAnnotations.getSTRINGRule();
-	} 
-
+		return gaXtype.getSTRINGRule();
+	}
+	
 	//terminal ML_COMMENT:
-	//	"/ *"->"* /";
+	//	'/*'->'*/';
 	public TerminalRule getML_COMMENTRule() {
-		return gaXbaseWithAnnotations.getML_COMMENTRule();
-	} 
-
+		return gaXtype.getML_COMMENTRule();
+	}
+	
 	//terminal SL_COMMENT:
-	//	"//" !("\n" | "\r")* ("\r"? "\n")?;
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
 	public TerminalRule getSL_COMMENTRule() {
-		return gaXbaseWithAnnotations.getSL_COMMENTRule();
-	} 
-
+		return gaXtype.getSL_COMMENTRule();
+	}
+	
 	//terminal WS:
-	//	(" " | "\t" | "\r" | "\n")+;
+	//	' ' | '\t' | '\r' | '\n'+;
 	public TerminalRule getWSRule() {
-		return gaXbaseWithAnnotations.getWSRule();
-	} 
-
+		return gaXtype.getWSRule();
+	}
+	
 	//terminal ANY_OTHER:
 	//	.;
 	public TerminalRule getANY_OTHERRule() {
-		return gaXbaseWithAnnotations.getANY_OTHERRule();
-	} 
+		return gaXtype.getANY_OTHERRule();
+	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/validation/AbstractEntityMockDSLValidator.java b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/validation/AbstractEntityMockDSLValidator.java
index de6f013..89ea9d8 100644
--- a/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/validation/AbstractEntityMockDSLValidator.java
+++ b/org.eclipse.osbp.xtext.entitymock/src-gen/org/eclipse/osbp/xtext/entitymock/validation/AbstractEntityMockDSLValidator.java
@@ -10,6 +10,8 @@
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
+ * generated by Xtext 2.11.0
+ *
  */
 
 package org.eclipse.osbp.xtext.entitymock.validation;
@@ -17,20 +19,20 @@
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.xtext.validation.ComposedChecks;
+import org.eclipse.osbp.xtext.oxtype.validation.OXtypeValidator;
 
-@ComposedChecks(validators= {org.eclipse.osbp.xtext.basic.validation.NamesAreUniqueValidator.class})
-public class AbstractEntityMockDSLValidator extends org.eclipse.xtext.xbase.annotations.validation.XbaseWithAnnotationsValidator {
-
+public abstract class AbstractEntityMockDSLValidator extends OXtypeValidator {
+	
 	@Override
 	protected List<EPackage> getEPackages() {
-	    List<EPackage> result = new ArrayList<EPackage>(super.getEPackages());
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/xtext/entitymock/EntityMockDSL"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/dsl/common/types/v1"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/Xtext/Xbase/XAnnotations"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xbase"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/common/JavaVMTypes"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xtype"));
+		List<EPackage> result = new ArrayList<EPackage>(super.getEPackages());
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/xtext/entitymock/EntityMockDSL"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/osbp/xtext/oxtype/OXtype"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/Xtext/Xbase/XAnnotations"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xbase"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/common/JavaVMTypes"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xtype"));
 		return result;
 	}
+	
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtext b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtext
index 43abd38..644db30 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtext
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtext
@@ -11,7 +11,7 @@
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
  * 
  */
-grammar org.eclipse.osbp.xtext.entitymock.EntityMockDSL with org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations
+grammar org.eclipse.osbp.xtext.entitymock.EntityMockDSL with org.eclipse.osbp.xtext.oxtype.OXtype
 
 import "http://osbp.eclipse.org/xtext/entitymock/EntityMockDSL" 
 
@@ -22,24 +22,24 @@
 
 
 EntityMockModel returns EntityMockModel:
+	importSection=XImportSection?
     packages+=EntityMockPackage*;
 
-EntityMockPackage returns EntityMockPackage:
-    'mock entitymodel for' imports+=EntityModelImport '{'
-    	('run with priority' runPriority=INT)?
-    	('import' imports+=EntityModelImport)*
-        (datainterchanges=RunningDataInterchanges)?
-        (resources=EntityMockResources)?
-        (objects=EntityMockObjects)?
-        (datatypes=EntityMockDataTypes)?
-        (entities=EntityMockEntities)
-    '}';
-
-EntityModelImport returns types::LImport:
-    importedNamespace=EntityMockQualifiedNameWithWildCard;
-
-EntityMockQualifiedNameWithWildCard:
-    QualifiedName ('.' '*')?;
+EntityMockPackage:
+	{EntityMockPackage} 'package' name=QualifiedName
+    ('{'
+    	(mocks+=EntityMock*)
+    '}')?;
+    
+EntityMock:
+	{EntityMock} 'mock' name=ID (description?='describedBy' descriptionValue=STRING)?
+    ('{'
+    	(('priority' runPriority=INT)? &
+        (datainterchanges=RunningDataInterchanges)? &
+        (resources=EntityMockResources)? &
+        (objects=EntityMockObjects)? &
+        (entities=EntityMockEntities))
+    '}')?;
 
 RunningDataInterchanges returns RunningDataInterchanges:
     {RunningDataInterchanges} 'datainterchanges' '{'
@@ -47,7 +47,7 @@
     '}';
 
 RunningDataInterchange returns RunningDataInterchange:
-    {RunningDataInterchange} 'datainterchange import' datainterchangeRef=[datainterchange::DataInterchange] 'from file' fileURL=STRING; 
+    {RunningDataInterchange} 'datainterchange' datainterchangeRef=[datainterchange::DataInterchange] 'file' fileURL=STRING; 
 
 EntityMockResources returns EntityMockResources:
     {EntityMockResources} 'resources' '{'
@@ -55,16 +55,16 @@
     '}';
 
 EntityMockResource returns EntityMockResource:
-    'resource' name=QualifiedName '{'
+    'resource' name=ID '{'
     	('attributes' '(' (attributes+=EntityMockResourceAttribute ','?)* ')')?
     	'items' '{' (datarows+=EntityMockResourceDataRow)* '}'
 	 '}';
 
 EntityMockResourceAttribute:
-    {EntityMockResourceAttribute} name=QualifiedName;
+    {EntityMockResourceAttribute} name=ID;
 
 EntityMockResourceDataRow:
-    {EntityMockResourceDataRow} name=QualifiedName ('(' (values+=STRING ','? )* ')')?;
+    {EntityMockResourceDataRow} name=ID ('(' (values+=STRING ','? )* ')')?;
 
 EntityMockObjects returns EntityMockObjects:
     {EntityMockObjects} 'objects' '{'
@@ -72,19 +72,14 @@
     '}';
 
 EntityMockObject returns EntityMockObject:
-    'object' name=QualifiedName '{'
+    'object' name=ID '{'
         (enumerations+=EntityMockObjectEnum)*
         (attributes+=IEntityMockObjectAttribute)*
         (calculations+=EntityMockObjectFunction)*
     '}';
 
 EntityMockObjectEnum returns EntityMockObjectEnum:
-    'var' name=QualifiedName 'by enum' usingResource=[types::LEnum];
-
-EntityMockDataTypes returns EntityMockDataTypes:
-    {EntityMockDataTypes} 'datatypes' '{'
-        (datatypes+=EntityMockDataType)*
-    '}';
+    'var' name=ID 'byEnum' usingResource=[types::LEnum];
 
 IEntityMockObjectUsable:
     EntityMockObjectFunction | EntityMockObjectEnum | EntityMockObjectPlainValue | EntityMockObjectArrayValue | EntityMockObjectEmbed | EntityMockObjectFill;
@@ -93,30 +88,30 @@
     EntityMockObjectResourceValue | EntityMockObjectPlainValue | EntityMockObjectArrayValue | EntityMockObjectEmbed | EntityMockObjectFill;
 
 EntityMockObjectPlainValue:
-    'var' name=QualifiedName '(' (values+=STRING ','? )* ')';
+    'var' name=ID '(' (values+=STRING ','? )* ')';
 
 EntityMockObjectResourceValue:
-    'var' name=QualifiedName 'with' resourceEnum=[EntityMockObjectEnum] ('.' resourceAttribute=[EntityMockResourceAttribute])?;
+    'var' name=ID 'with' resourceEnum=[EntityMockObjectEnum] ('.' resourceAttribute=[EntityMockResourceAttribute])?;
 
 EntityMockObjectArrayValue:
-    'var' name=QualifiedName 'switch on' enumeration=[EntityMockObjectEnum] '{' (items+=EntityMockObjectItemValue)* '}';
+    'var' name=ID 'switchOn' enumeration=[EntityMockObjectEnum] '{' (items+=EntityMockObjectItemValue)* '}';
 
 EntityMockObjectItemValue:
     'when' datarow=[types::LEnumLiteral] '(' (values+=STRING ','? )* ')';
 
 EntityMockObjectEmbed returns EntityMockObjectEmbed:
-    {EntityMockObjectEmbed} 'embed' name=QualifiedName 'defined as' object=[EntityMockObject];
+    {EntityMockObjectEmbed} 'embed' name=ID 'definedAs' object=[EntityMockObject];
 
 EntityMockObjectFunction:
-	'var' name=QualifiedName 'calculate as' oftype=JvmParameterizedTypeReference
-		'based on' '(' (params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)* )? ')'
+	'var' name=ID 'calculateAs' oftype=JvmParameterizedTypeReference
+		'basedOn' '(' (params+=EntityMockObjectFunctionParameter (',' params+=EntityMockObjectFunctionParameter)* )? ')'
 	body=XBlockExpression;
 
 EntityMockObjectFunctionParameter:
 	parameterType=JvmTypeReference name=[IEntityMockObjectUsable];
 
 EntityMockObjectFill:
-    'var' name=QualifiedName 'randomize' fillerType=PropertyFillerType;
+    'var' name=ID 'randomize' fillerType=PropertyFillerType;
 
 
 PropertyFillerType returns PropertyFillerType:
@@ -132,39 +127,39 @@
     ;
 
 PropertyFillerDateFuture returns PropertyFillerDateFuture:
-    'future date' dateFutureYears=INT 'years';
+    'future' dateFutureYears=INT 'years';
 
 PropertyFillerDatePast returns PropertyFillerDatePast:
-    'past date' datePastYears=INT 'years';
+    'past' datePastYears=INT 'years';
 
 PropertyFillerBoolean returns PropertyFillerBoolean:
     {PropertyFillerBoolean} 'boolean';
 
 PropertyFillerDateRange returns PropertyFillerDateRange:
-    'date in range' dateBeginYears=SINT 'up to and including' dateEndYears=SINT 'years';
+    'dateRange' 'from' dateBeginYears=SINT 'until' dateEndYears=SINT 'years';
 
 PropertyFillerSignedDoubleRange returns PropertyFillerSignedDoubleRange:
-    'signed double in range' 
-        ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'up to and including' (endRange=SignedNumber|endRangeRef=[entity::LEntityAttribute]))?
+    'numberRange' 'from' 
+        ((beginRange=SignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SignedNumber|endRangeRef=[entity::LEntityAttribute]))?
         'with' decimals=INT 'decimals' 
-        ('round to' rounded=UnsignedNumber)?;
+        ('roundTo' rounded=UnsignedNumber)?;
     
 PropertyFillerSignedDoubleRandom returns PropertyFillerSignedDoubleRandom:
-    'signed double from' '(' (items+=SignedNumber)+ ')';
+    'numberPick' '(' (items+=SignedNumber)+ ')';
 
 PropertyFillerSignedIntegerRange returns PropertyFillerSignedIntegerRange:
-    {PropertyFillerSignedIntegerRange} 'signed integer in range' 
-        ((beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])? 'up to and including' (endRange=SINT|endRangeRef=[entity::LEntityAttribute]))?
-        ('round to' rounded=INT)?;
+    {PropertyFillerSignedIntegerRange} 'integerRange' 'from'
+        ((beginRange=SINT | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=SINT|endRangeRef=[entity::LEntityAttribute]))?
+        ('roundTo' rounded=INT)?;
     
 PropertyFillerSignedIntegerRandom returns PropertyFillerSignedIntegerRandom:
-    'signed integer from' '(' (items+=SINT)+ ')';
+    'integerPick' '(' (items+=SINT)+ ')';
     
 PropertyFillerTextRandom returns PropertyFillerTextRandom:
-    'text from' '(' (items+=STRING)+ ')';
+    'textPick' '(' (items+=STRING)+ ')';
 
 PropertyFillerTextParagraphs returns PropertyFillerTextParagraphs:
-    {PropertyFillerTextParagraphs} 'paragraps' (count=INT)?;
+    {PropertyFillerTextParagraphs} 'paragraphs' (count=INT)?;
 
 PropertyFillerTextSentences returns PropertyFillerTextSentences:
     {PropertyFillerTextSentences} 'sentences' (count=INT)?;
@@ -173,49 +168,45 @@
     {PropertyFillerTextWords} 'words' (count=INT)?;
 
 PropertyFillerUnsignedDoubleRange returns PropertyFillerUnsignedDoubleRange:
-    'unsigned double in range' 
-        ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'up to and including' (endRange=UnsignedNumber|endRangeRef=[entity::LEntityAttribute]))?
+    'unsignedNumberRange' 'from' 
+        ((beginRange=UnsignedNumber | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=UnsignedNumber|endRangeRef=[entity::LEntityAttribute]))?
         'with' decimals=INT 'decimals' 
-        ('round to' rounded=UnsignedNumber)?;
+        ('roundTo' rounded=UnsignedNumber)?;
     
 PropertyFillerUnsignedDoubleRandom returns PropertyFillerUnsignedDoubleRandom:
-    'unsigned double from' '(' (items+=UnsignedNumber)+ ')';
+    'unsignedNumberPick' '(' (items+=UnsignedNumber)+ ')';
 
 PropertyFillerUnsignedIntegerRange returns PropertyFillerUnsignedIntegerRange:
-    {PropertyFillerUnsignedIntegerRange} 'unsigned integer in range' 
-        ((beginRange=INT | beginRangeRef=[entity::LEntityAttribute])? 'up to and including' (endRange=INT|endRangeRef=[entity::LEntityAttribute]))?
-        ('round to' rounded=INT)?;
+    {PropertyFillerUnsignedIntegerRange} 'unsignedIntegerRange' 'from' 
+        ((beginRange=INT | beginRangeRef=[entity::LEntityAttribute])? 'until' (endRange=INT|endRangeRef=[entity::LEntityAttribute]))?
+        ('roundTo' rounded=INT)?;
     
 PropertyFillerUnsignedIntegerRandom returns PropertyFillerUnsignedIntegerRandom:
-    'unsigned integer from' '(' (items+=INT)+ ')';
+    'unsignedIntegerPick' '(' (items+=INT)+ ')';
 
 
 
-EntityMockDataType returns EntityMockDataType:
-    'datatype' name=QualifiedName '{'
-    '}';
-
 EntityMockEntities returns EntityMockEntities:
-    {EntityMockEntities} 'mock entities' '{'
+    {EntityMockEntities} 'entities' '{'
         (entities+=EntityMockEntity)*
     '}';
 
 EntityMockEntity returns EntityMockEntity:
-    'mocking' name=QualifiedName 'for entity' entityRef=[entity::LEntity]
+    'mocking' name=ID 'entity' entityRef=[entity::LEntity]
     (('rows' minRows=INT 'to' maxRows=INT '{'
-        (temporaries+=EntityMockTemporary)*
+        (templates+=EntityMockTemplate)*
         (attributes+=IEntityMockAttribute)*
         (calculations+=EntityMockEntityFunction)*
     '}')
     |
-    ('by resource' byResource=[EntityMockResource] '{'
-        (byResourceAttributes+=EntityMockByResourceAttribute)*
-        (createBlobMapping?='createBlobMapping')?
+    ('resource' byResource=[EntityMockResource] '{'
+        ((byResourceAttributes+=EntityMockByResourceAttribute)* &
+        (createBlobMapping?='createBlobMapping')?)
     '}')
     |
     ('iterate' iterator=[entity::LEntityAttribute]
         'with' iterate=IIterate '{'
-    	(temporaries+=EntityMockTemporary)*
+    	(templates+=EntityMockTemplate)*
         (attributes+=IEntityMockAttribute)*
         (calculations+=EntityMockEntityFunction)*
     '}')
@@ -226,10 +217,10 @@
 	IntegerIterate | DateIterate;
 
 IntegerIterate:
-	'integer from' from=SINT 'until' until=SINT 'step' step=INT;
+	'integerFrom' from=SINT 'until' until=SINT 'step' step=INT;
 
 DateIterate:
-	'date from' from=Date 'until' until=Date 'every' stepCount=INT stepType=EDateStepType;
+	'dateFrom' from=Date 'until' until=Date 'every' stepCount=INT stepType=EDateStepType;
 
 Date:
 	(yesterday?='yesterday' ) | (today?='today' ) | (tomorrow?='tomorrow') | (year=INT '-' month=INT '-' day=INT);
@@ -240,8 +231,8 @@
 EntityMockByResourceAttribute:
     {EntityMockByResourceAttribute} 'var' attributeRef=[entity::LEntityAttribute] 'as' resourceAttribute=[EntityMockResourceAttribute];
 
-EntityMockTemporary:
-    'temporary' name=QualifiedName 'by object' object=[EntityMockObject];
+EntityMockTemplate:
+    'template' name=ID 'byObject' object=[EntityMockObject];
 
 IEntityMockEntityUsable:
 	IEntityMockAttribute | EntityMockEntityFunction;
@@ -251,16 +242,17 @@
 
 EntityMockEntityFunction:
 	'var' attributeRef=[entity::LEntityAttribute]
-		'calculate based on' '(' (params+=EntityMockEntityFunctionParameter (',' params+=EntityMockEntityFunctionParameter)* )? ')'
+		'calculateOn' '(' (params+=EntityMockEntityFunctionParameter (',' params+=EntityMockEntityFunctionParameter)* )? ')'
 	body=XBlockExpression;
 
 EntityMockEntityFunctionParameter:
-	(attributeRef=[entity::LEntityAttribute])
-	|
-	(referencePaths+=[entity::LEntityReference]  ('.'? referencePaths+=[entity::LEntityReference])* '.' referenceRef=[entity::LEntityAttribute]);
+	attributeRef=[entity::LEntityAttribute]|nestedAttribute=EntityMockEntityNestedAttribute;
+
+EntityMockEntityNestedAttribute:
+	reference=[entity::LEntityReference]'.'attribute=[entity::LEntityAttribute];
 
 EntityMockReferencedObjectAttribute:
-    {EntityMockReferencedObjectAttribute} temporary=[EntityMockTemporary] ('.'? embedded+=[EntityMockObjectEmbed])* '.' attribute=[IEntityMockObjectUsable];
+    {EntityMockReferencedObjectAttribute} template=[EntityMockTemplate] ('.'? embedded+=[EntityMockObjectEmbed])* '.' attribute=[IEntityMockObjectUsable];
 
 EntityMockAttributeByObject:
     'var' attributeRef=[entity::LEntityAttribute]
@@ -273,7 +265,7 @@
     'var' attributeRef=[entity::LEntityAttribute] 'randomize' fillerType=PropertyFillerType;
 
 EntityMockAttributeByReference:
-    'ref' attributeRef=[entity::LEntityReference] 'to' ('existing entities' | mockedEntity=[EntityMockEntity]) ('optional for' optionalFor=INT 'percent')?;
+    'ref' attributeRef=[entity::LEntityReference] 'to' ('existingEntities' | mockedEntity=[EntityMockEntity]) ('optionalFor' optionalFor=INT 'percent')?;
 
 SignedNumber returns ecore::EDouble:
     ('-')? UnsignedNumber;
@@ -283,12 +275,3 @@
 
 SINT returns ecore::EInt:
     ('-')? INT;
-
-QualifiedName:
-  ValidID (=>'.' ValidID)*;
-  
-ValidID:
-    ID;
-	
-terminal ID:
-    '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSLRuntimeModule.java b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSLRuntimeModule.java
index aac8d27..356115f 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSLRuntimeModule.java
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSLRuntimeModule.java
@@ -14,32 +14,60 @@
 
 import javax.inject.Singleton;
 
-import org.eclipse.xtext.generator.IGenerator;
-import org.eclipse.xtext.generator.IOutputConfigurationProvider;
-import org.eclipse.xtext.scoping.IScopeProvider;
-import org.eclipse.osbp.dsl.xtext.lazyresolver.LazyJvmTypeLinker;
-import org.eclipse.osbp.dsl.xtext.lazyresolver.SemanticLoadingResource;
-import org.eclipse.osbp.dsl.xtext.lazyresolver.linker.LazyJvmTypeTransientValueService;
-
-import com.google.inject.Binder;
-
+import org.eclipse.osbp.dsl.common.xtext.scoping.ScopingInfoProvider;
+import org.eclipse.osbp.xtext.entitymock.formatting.EntityMockDSLFormatter;
 import org.eclipse.osbp.xtext.entitymock.generator.EntityMockDslGenerator;
+import org.eclipse.osbp.xtext.entitymock.imports.ShouldImportProvider;
+import org.eclipse.osbp.xtext.entitymock.scoping.EntityMockDSLImportSectionNamespaceScopeProvider;
 import org.eclipse.osbp.xtext.entitymock.scoping.EntityMockDSLScopeProvider;
 import org.eclipse.osbp.xtext.entitymock.valueconverter.EntityMockQualifiedNameProvider;
 import org.eclipse.osbp.xtext.i18n.DSLOutputConfigurationProvider;
+import org.eclipse.osbp.xtext.oxtype.imports.IShouldImportProvider;
+import org.eclipse.osbp.xtext.oxtype.imports.OXTypeRewritableImportSection;
+import org.eclipse.osbp.xtext.oxtype.linker.JvmTypeAwareLinker;
+import org.eclipse.osbp.xtext.oxtype.linking.OXTypeLinkingService;
+import org.eclipse.osbp.xtext.oxtype.resource.SemanticLoadingResource;
+import org.eclipse.osbp.xtext.oxtype.scoping.IScopingInfoProvider;
+import org.eclipse.osbp.xtext.oxtype.scoping.OXDelegatingNamespaceScopeProvider;
+import org.eclipse.osbp.xtext.oxtype.scoping.eobject.OXEObjectImportSectionNamespaceScopeProvider;
+import org.eclipse.osbp.xtext.oxtype.serializer.JvmTypeAwareTransientValueService;
+import org.eclipse.xtext.findReferences.TargetURICollector;
+import org.eclipse.xtext.generator.IGenerator;
+import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.xtext.linking.ILinkingService;
+import org.eclipse.xtext.resource.persistence.IResourceStorageFacade;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.serializer.sequencer.ITransientValueService;
+import org.eclipse.xtext.xbase.imports.RewritableImportSection;
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelTargetURICollector;
+import org.eclipse.xtext.xbase.resource.BatchLinkableResourceStorageFacade;
+
+import com.google.inject.Binder;
+import com.google.inject.name.Names;
 
 /**
  * Use this class to register components to be used at runtime / without the
  * Equinox extension registry.
  */
-public class EntityMockDSLRuntimeModule extends
-		org.eclipse.osbp.xtext.entitymock.AbstractEntityMockDSLRuntimeModule {
-	
+public class EntityMockDSLRuntimeModule extends org.eclipse.osbp.xtext.entitymock.AbstractEntityMockDSLRuntimeModule {
+
+	public Class<? extends IResourceStorageFacade> bindResourceStorageFacade() {
+		return BatchLinkableResourceStorageFacade.class;
+	}
+
+	public Class<? extends TargetURICollector> bindTargetURICollector() {
+		return JvmModelTargetURICollector.class;
+	}
+
 	@Override
 	public Class<? extends IGenerator> bindIGenerator() {
-	    return EntityMockDslGenerator.class;
+		return EntityMockDslGenerator.class;
 	}
-	
+
+	public Class<? extends org.eclipse.xtext.formatting.IFormatter> bindIFormatter() {
+		return EntityMockDSLFormatter.class;
+	}
+
 	@Override
 	public void configure(Binder binder) {
 		super.configure(binder);
@@ -71,13 +99,39 @@
 		return SemanticLoadingResource.class;
 	}
 
-	@Override
-	public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
-		return LazyJvmTypeLinker.class;
+	public void configureITransientValueService(Binder binder) {
+		binder.bind(ITransientValueService.class).to(JvmTypeAwareTransientValueService.class);
 	}
 
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ITransientValueService> bindSerializerITransientValueService() {
-		return LazyJvmTypeTransientValueService.class;
+	public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
+		return JvmTypeAwareLinker.class;
+	}
+
+	public Class<? extends ILinkingService> bindILinkingService() {
+		return OXTypeLinkingService.class;
+	}
+
+	public Class<? extends RewritableImportSection.Factory> bindRewritableImportSection$Factory() {
+		return OXTypeRewritableImportSection.Factory.class;
+	}
+
+	public Class<? extends IScopingInfoProvider> bindIScopingInfoProvider() {
+		return ScopingInfoProvider.class;
+	}
+
+	@Override
+	public void configureIScopeProviderDelegate(Binder binder) {
+		binder.bind(IScopeProvider.class)
+				.annotatedWith(Names.named("org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegate"))
+				.to(OXDelegatingNamespaceScopeProvider.class);
+	}
+
+	public Class<? extends OXEObjectImportSectionNamespaceScopeProvider> bindOXEObjectImportSectionNamespaceScopeProvider() {
+		return EntityMockDSLImportSectionNamespaceScopeProvider.class;
+	}
+
+	public Class<? extends IShouldImportProvider> bindIShouldImportProvider() {
+		return ShouldImportProvider.class;
 	}
 
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/GenerateEntityMockDSL.mwe2 b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/GenerateEntityMockDSL.mwe2
index 1c5ca39..79386f0 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/GenerateEntityMockDSL.mwe2
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/GenerateEntityMockDSL.mwe2
@@ -15,156 +15,86 @@
 module org.eclipse.osbp.xtext.entitymock.GenerateEntityMockDSL
 
 import org.eclipse.emf.mwe.utils.*
-import org.eclipse.xtext.generator.*
-import org.eclipse.xtext.ui.generator.*
-import org.eclipse.osbp.dsl.mwe.*
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
 
-var projectName = "org.eclipse.osbp.xtext.entitymock"
-var grammarURI = "platform:/resource/${projectName}/src/org/eclipse/osbp/xtext/entitymock/EntityMockDSL.xtext"
-var fileExtensions = "entitymock"
-var runtimeProject = "../${projectName}"
-var generateXtendStub = true
-var encoding = "UTF-8"
+var rootPath = ".."
+
+var fileHeaderText = "/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * generated by Xtext \${version}
+ *
+ */
+
+"
 
 Workflow {
-    bean = org.eclipse.emf.ecore.xcore.XcoreStandaloneSetup : xcore {}
-    bean = org.eclipse.xtext.mwe.Reader {
-        register = xcore
-    }
-    bean = MavenStandaloneSetup {
-    	scanClassPath = true
-    	platformUri = "${runtimeProject}/.."
 
-        registerGenModelFile = "platform:/resource/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore"
-        registerGeneratedEPackage = "org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage"
-        
-        registerGenModelFile = "platform:/resource/org.eclipse.osbp.dsl.entity.xtext/model/entity.xcore"
-        registerGeneratedEPackage = "org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage"
-        registerGenModelFile = "platform:/resource/org.eclipse.osbp.dsl.common.xtext/model/types.xcore"
-        registerGeneratedEPackage = "org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage"
-		registerGenModelFile = "platform:/resource/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore"
-		registerGeneratedEPackage = "org.eclipse.osbp.xtext.datainterchange.DataDSLPackage"
-        
-    	registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
-    	registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
-    }
-    
-    component = DirectoryCleaner {
-    	directory = "${runtimeProject}/src-gen"
-    }
-    
-    component = DirectoryCleaner {
-    	directory = "${runtimeProject}.ui/src-gen"
-    }
-    
-    component = DirectoryCleaner {
-    	directory = "${runtimeProject}.tests/src-gen"
-    }
-    
-    component = Generator {
-    	pathRtProject = runtimeProject
-    	pathUiProject = "${runtimeProject}.ui"
-    	pathTestProject = "${runtimeProject}.tests"
-    	projectNameRt = projectName
-    	projectNameUi = "${projectName}.ui"
-    	encoding = encoding
-    	language = auto-inject {
-    		uri = grammarURI
-    
-    		// Java API to access grammar elements (required by several other fragments)
-    		fragment = grammarAccess.GrammarAccessFragment auto-inject {}
-    
-    		// generates Java API for the generated EPackages
-    		fragment = ecore.EMFGeneratorFragment auto-inject {}
-    
-    		// the old serialization component
-    		// fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}    
-    
-    		// serializer 2.0
-    		fragment = serializer.SerializerFragment auto-inject {
-    			generateStub = false
-    		}
-    
-    		// a custom ResourceFactory for use with EMF
-    		fragment = resourceFactory.ResourceFactoryFragment auto-inject {}
-    
-    		// The antlr parser generator fragment.
-    		fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject {
-    		//  options = {
-    		//      backtrack = true
-    		//  }
-    		}
-    
-    		// Xtend-based API for validation
-    		fragment = validation.ValidatorFragment auto-inject {
-    		//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
-    		//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
-    		    composedCheck = "org.eclipse.osbp.xtext.basic.validation.NamesAreUniqueValidator"
-    		}
-    
-    		// old scoping and exporting API
-    		// fragment = scoping.ImportURIScopingFragment auto-inject {}
-    		// fragment = exporting.SimpleNamesFragment auto-inject {}
-    
-    		// scoping and exporting API
-    		fragment = scoping.ImportNamespacesScopingFragment auto-inject {}
-    		fragment = exporting.QualifiedNamesFragment auto-inject {}
-    		fragment = builder.BuilderIntegrationFragment auto-inject {}
-    
-    		// generator API
-    		fragment = generator.GeneratorFragment auto-inject {}
-    
-    		// formatter API
-    		fragment = formatting.FormatterFragment auto-inject {}
-    
-    		// labeling API
-    		fragment = labeling.LabelProviderFragment auto-inject {}
-    
-    		// outline API
-    		fragment = outline.OutlineTreeProviderFragment auto-inject {}
-    		fragment = outline.QuickOutlineFragment auto-inject {}
-    
-    		// quickfix API
-    		fragment = quickfix.QuickfixProviderFragment auto-inject {}
-    
-    		// content assist API
-    		fragment = contentAssist.ContentAssistFragment auto-inject {}
-    
-			// generates a more lightweight Antlr parser and lexer tailored for content assist
-			fragment = parser.antlr.XtextAntlrUiGeneratorFragment auto-inject {
-				// @see https://github.com/osbp/osbp-doc/blob/master/org.eclipse.osbp.doc.dsl/src/org.eclipse.osbp/doc/dsl/grammar/GenerateOSBPDocGrammar.mwe2
-    		  	options = {
-    		//      backtrack = true
-    				classSplitting=true
-    				fieldsPerClass="100"
-    				methodsPerClass="100"
-    		  	}
-    		}
-    
-    		// generates junit test support classes into Generator#pathTestProject
-    		fragment = junit.Junit4Fragment auto-inject {}
-    
-    		// rename refactoring
-    		fragment = refactoring.RefactorElementNameFragment auto-inject {}
-    
-    		// provides the necessary bindings for java types integration
-    		fragment = types.TypesGeneratorFragment auto-inject {}
-    
-    		// generates the required bindings only if the grammar inherits from Xbase
-    		fragment = xbase.XbaseGeneratorFragment auto-inject {}
-    		
-    		// generates the required bindings only if the grammar inherits from Xtype
-    		fragment = xbase.XtypeGeneratorFragment auto-inject {}
-    
-    		// provides a preference page for template proposals
-    		fragment = templates.CodetemplatesGeneratorFragment auto-inject {}
-    
-    		// provides a compare view
-    		fragment = compare.CompareFragment auto-inject {}
-    		
-    		// parse grammar and generate i18n grammar
-    		fragment = org.eclipse.osbp.xtext.basic.generator.BasicDslGrammarI18nGenerator auto-inject {}
-    	}
-    }
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.osbp.xtext.entitymock"
+				rootPath = rootPath
+				genericIde = {
+					enabled = true
+					name = "org.eclipse.osbp.xtext.entitymock.ide"
+				}
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = false
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				lineDelimiter = "\n"
+				fileHeader = fileHeaderText
+			}
+		}
+
+		language = StandardLanguage {
+			name = "org.eclipse.osbp.xtext.entitymock.EntityMockDSL"
+			fileExtensions = "entitymock"
+			
+			referencedResource = "platform:/resource/org.eclipse.osbp.xtext.entitymock/model/EntityMockDSL.xcore"
+			
+			referencedResource = "platform:/resource/org.eclipse.osbp.xtext.oxtype/model/OXtype.ecore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.xtext.oxtype/model/OXtype.genmodel"
+			referencedResource = "platform:/resource/org.eclipse.osbp.dsl.common.xtext/model/types.xcore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.dsl.entity.xtext/model/entity.xcore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore"
+			
+			generateXtendStubs = false
+			
+			serializer = {
+				generateStub = false
+			}
+			validator = {
+			}
+
+			generator = {
+				generateStub = false
+				generateJavaMain = false
+				generateXtendStub = false
+			}
+
+		}
+	}
 }
 
+
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.xtend
index 6573544..a7a5155 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.xtend
@@ -14,20 +14,17 @@
  *  This copyright notice shows up in the generated Java code
  *
  */
- 
 package org.eclipse.osbp.xtext.entitymock.formatting
 
-import com.google.inject.Inject;
-import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
-import org.eclipse.xtext.formatting.impl.FormattingConfig
-import org.eclipse.osbp.utils.xtext.GenericFormatter
-import org.eclipse.xtext.xbase.services.XtypeGrammarAccess
+import com.google.inject.Inject
+import org.eclipse.osbp.xtext.oxtype.formatting.GenericFormatter
+import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess
 import org.eclipse.xtext.GrammarUtil
 import org.eclipse.xtext.ParserRule
-import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
+import org.eclipse.xtext.formatting.impl.FormattingConfig
 
 //import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess
-
 /**
  * This class contains custom formatting description.
  * 
@@ -38,19 +35,17 @@
  */
 class EntityMockDSLFormatter extends AbstractDeclarativeFormatter {
 
-//	@Inject extension EntityMockDSLGrammarAccess
-	@Inject XtypeGrammarAccess grammarAccess
-	
-	override protected void configureFormatting(FormattingConfig c) {
-//		c.setLinewrap(1, 1, 1).around(SL_COMMENTRule)
-//		c.setLinewrap(1, 1, 1).around(ML_COMMENTRule)
-		val genericFormatter        = new GenericFormatter()
-		var ParserRule importDef    = GrammarUtil.findRuleForName( grammar.grammar, "EntityModelImport"           ) as ParserRule
-		var ParserRule resourceAttr = GrammarUtil.findRuleForName( grammar.grammar, "EntityMockResourceAttribute" ) as ParserRule
+	//	@Inject extension EntityMockDSLGrammarAccess
+	@Inject OXtypeGrammarAccess grammarAccess
 
-//		genericFormatter.formatFirstLevelBlocks( c, grammar.grammar, "Dialog", "EntityModelImport" )
-		c.setNoLinewrap().around( importDef )
-		c.setNoLinewrap().around( resourceAttr )
-		genericFormatter.genericFormatting( c, grammar, grammarAccess )
+	override protected void configureFormatting(FormattingConfig c) {
+
+		//		c.setLinewrap(1, 1, 1).around(SL_COMMENTRule)
+		//		c.setLinewrap(1, 1, 1).around(ML_COMMENTRule)
+		val genericFormatter = new GenericFormatter()
+		var ParserRule importDef = GrammarUtil.findRuleForName(grammar.grammar, "EntityModelImport") as ParserRule
+		var ParserRule resourceAttr = GrammarUtil.findRuleForName(grammar.grammar, "EntityMockResourceAttribute") as ParserRule
+		c.setNoLinewrap().around(resourceAttr)
+		genericFormatter.genericFormatting(c, grammar, grammarAccess)
 	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.xtend
index c277acd..b5474bf 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.xtend
@@ -19,68 +19,48 @@
 
 import com.google.inject.Inject
 import java.io.BufferedInputStream
+import java.io.File
+import java.io.FileInputStream
+import java.io.IOException
 import java.io.InputStream
+import java.io.PrintWriter
+import java.io.StringWriter
 import java.util.ArrayList
 import java.util.Date
 import java.util.HashMap
 import java.util.Iterator
 import java.util.LinkedHashMap
 import java.util.List
+import java.util.Properties
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.emf.ecore.resource.Resource
-import org.eclipse.osbp.utils.entitymock.ABaseMockEntity
-import org.eclipse.osbp.utils.entitymock.ABaseMockObject
-import org.eclipse.osbp.utils.entitymock.ABaseMockResource
-import org.eclipse.osbp.utils.entitymock.AEntityMockDataGenerator
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataDbFiller
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator
-import org.eclipse.osbp.utils.entitymock.Iterators
-import org.eclipse.osbp.utils.entitymock.MockedEntityDto
+import org.eclipse.osbp.blob.service.BlobService
+import org.eclipse.osbp.blob.service.BlobTypingAPI
+import org.eclipse.osbp.preferences.ProductConfiguration
 import org.eclipse.osbp.xtext.addons.AdvancedJvmModelGenerator
 import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
-import org.eclipse.osbp.xtext.entitymock.EntityMockModel
-import org.eclipse.osbp.xtext.entitymock.EntityMockPackage
-import org.eclipse.osbp.xtext.entitymock.jvmmodel.EntityMockDSLJvmModelInferrer
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource
+import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller
+import org.eclipse.osbp.xtext.entitymock.common.Iterators
+import org.eclipse.osbp.xtext.entitymock.common.MockedEntityDto
 import org.eclipse.xtext.generator.IFileSystemAccess
 import org.eclipse.xtext.xbase.compiler.GeneratorConfig
 import org.eclipse.xtext.xbase.compiler.ImportManager
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import org.eclipse.osbp.utils.blob.component.BlobTypingAPI
-import org.eclipse.osbp.utils.blob.component.BlobUpload
+import org.eclipse.osbp.ui.api.customfields.IBlobService
 
 class EntityMockDslGenerator extends AdvancedJvmModelGenerator {
-//    @Inject extension JvmTypeReferenceBuilder
     @Inject extension BasicDslGeneratorUtils
     
     override doGenerate(Resource input, IFileSystemAccess fsa) {
-        val model = input.getContents().get(0) as EntityMockModel
-        for (pckg : model.packages) {
-            pckg.generateOsgiInf(fsa)
-        }
         super.doGenerate(input, fsa)
     }
 
     /**
-     * Generate an OSGI INF xml file defining the generated Entity Mock Data Generator via Declarative Service
-     * @param pckg the package defining the generator
-     * @param fsa file system access 
-     */
-    def void generateOsgiInf(EntityMockPackage pckg, IFileSystemAccess fsa) {
-        val generatorName = '''«EntityMockDSLJvmModelInferrer.getEntityMockName(pckg)».«EntityMockDSLJvmModelInferrer.ENTITY_MOCK_GENERATOR»'''
-        var str = '''
-            <?xml version="1.0" encoding="UTF-8"?>
-            <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="«generatorName»">
-               <implementation class="«generatorName»"/>
-               <service>
-                  <provide interface="«IEntityMockDataGenerator.canonicalName»"/>
-               </service>
-            </scr:component>
-        '''
-        fsa.generateFile('''../OSGI-INF/«generatorName».xml''', str)
-    }
-
-    /**
      * add all relevant Java import statements for necessary classes
      */
     override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
@@ -102,12 +82,21 @@
 			, LinkedHashMap
 			, List
 			, BlobTypingAPI
-			, BlobUpload
+			, BlobService
 			, InputStream
 			, BufferedInputStream
 			, Logger
 			, LoggerFactory
 			, IEntityMockDataDbFiller
+			, IOException
+			, File
+			, FileInputStream
+			, Properties
+			, ProductConfiguration
+			, PrintWriter
+			, StringWriter
+			, IBlobService
+			
 			)
         super.createAppendable(context, importManager, config)
     }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/imports/ShouldImportProvider.java b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/imports/ShouldImportProvider.java
new file mode 100644
index 0000000..b9c2f2b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/imports/ShouldImportProvider.java
@@ -0,0 +1,23 @@
+package org.eclipse.osbp.xtext.entitymock.imports;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.osbp.dsl.semantic.entity.LEntity;
+import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
+import org.eclipse.osbp.xtext.oxtype.imports.DefaultShouldImportProvider;
+
+public class ShouldImportProvider extends DefaultShouldImportProvider {
+
+	protected boolean doShouldImport(EObject toImport, EReference eRef, EObject context) {
+		return toImport instanceof LEntity || toImport instanceof DataInterchange;
+	}
+
+	protected boolean doShouldProposeAllElements(EObject object, EReference reference) {
+		EClass type = reference.getEReferenceType();
+		return DataDSLPackage.Literals.DATA_INTERCHANGE.isSuperTypeOf(type)
+				|| OSBPEntityPackage.Literals.LENTITY.isSuperTypeOf(type);
+	}
+}
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
index 0dcbad2..68da466 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
@@ -14,7 +14,6 @@
  *  This copyright notice shows up in the generated Java code
  *
  */
- 
 package org.eclipse.osbp.xtext.entitymock.jvmmodel
 
 import com.google.inject.Inject
@@ -24,26 +23,27 @@
 import java.util.Set
 import org.apache.commons.lang.StringUtils
 import org.apache.commons.lang.WordUtils
+import org.eclipse.osbp.core.api.persistence.IPersistenceService
+import org.eclipse.osbp.datainterchange.api.IDataInterchange
+import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
 import org.eclipse.osbp.dsl.semantic.common.types.LEnum
+import org.eclipse.osbp.dsl.semantic.entity.LBean
 import org.eclipse.osbp.dsl.semantic.entity.LEntity
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
-import org.eclipse.osbp.persistence.IPersistenceService
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher
+import org.eclipse.osbp.ui.api.customfields.IBlobService
+import org.eclipse.osbp.utils.annotation.CommonUtils
 import org.eclipse.osbp.utils.common.EntityUtils
 import org.eclipse.osbp.utils.entityhelper.DataType
-import org.eclipse.osbp.utils.entitymock.ABaseMockEntity
-import org.eclipse.osbp.utils.entitymock.ABaseMockObject
-import org.eclipse.osbp.utils.entitymock.ABaseMockResource
-import org.eclipse.osbp.utils.entitymock.AEntityMockDataGenerator
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataDbFiller
 import org.eclipse.osbp.xtext.datainterchange.jvmmodel.DataDSLJvmModelInferrer
 import org.eclipse.osbp.xtext.entitymock.Date
 import org.eclipse.osbp.xtext.entitymock.DateIterate
+import org.eclipse.osbp.xtext.entitymock.EntityMock
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter
-import org.eclipse.osbp.xtext.entitymock.EntityMockModel
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed
@@ -55,7 +55,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockPackage
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable
 import org.eclipse.osbp.xtext.entitymock.IntegerIterate
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean
@@ -74,17 +74,22 @@
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange
-import org.eclipse.xtext.common.types.JvmDeclaredType
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource
+import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataGenerator
 import org.eclipse.xtext.common.types.JvmEnumerationType
 import org.eclipse.xtext.common.types.JvmField
 import org.eclipse.xtext.common.types.JvmTypeReference
 import org.eclipse.xtext.common.types.JvmVisibility
+import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
 import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
 import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
+import org.osgi.service.component.annotations.Component
 import org.slf4j.Logger
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator
-import org.eclipse.osbp.dsl.semantic.entity.LBean
 
 /**
  * <p>Infers a JVM model from the source model.</p> 
@@ -92,6 +97,7 @@
  * <p>The JVM model should contain all elements that would appear in the Java code 
  * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>     
  */
+@SuppressWarnings("restriction")
 class EntityMockDSLJvmModelInferrer extends AbstractModelInferrer {
 
 	/**
@@ -99,122 +105,151 @@
      */
 	@Inject extension JvmTypesBuilder
 	@Inject extension DataDSLJvmModelInferrer
-//	@Inject extension IQualifiedNameProvider
-	@Inject extension EntityUtils
-//	@Inject extension AnnotationExtension
 
+	@Inject extension IQualifiedNameProvider
+	@Inject extension EntityUtils
+	
+	@Inject ModelExtensions entityExtensions
+	@Inject extension CommonUtils
+
+	//	@Inject extension AnnotationExtension
 	@Inject DataType dtType
 
 	/**
-     * get the full qualified package name for the imported entities, removing the trailing *
-     */
-	def static String getEntityPackageName(EntityMockPackage pckg) {
-		var pckgName = ""
-		for (import : pckg.imports) {
-			if (pckgName.isEmpty) {
-				pckgName = '''«import.importedNamespace»'''.toString
-				pckgName = pckgName.replace(".*", "")
+	 * The dispatch method {@code infer} is called for each instance of the
+	 * given element's type that is contained in a resource.
+	 */
+	def dispatch void infer(EntityMock mock, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
+		// --- generate one class for each mock resource
+		mock.resources?.resources?.forEach [ mockResource |
+			try {
+				mock.generateMockResource(acceptor, mockResource)
+			} catch (Exception e) {
+				e.printStackTrace();
 			}
+		]
+		// --- generate one class for each mock object defined
+		mock.objects?.objects?.forEach [ mockObject |
+			try {
+				mock.generateMockObject(acceptor, mockObject)
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		]
+		// --- generate a class for each mock entity
+		mock.entities?.entities?.forEach [ mockEntity |
+			try {
+				mock.generateMockEntity(acceptor, mockEntity)
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		]
+		// --- generate the mock generator
+		try {
+			mock.generateMockDataGenerator(acceptor)
+		} catch (Exception e) {
+			e.printStackTrace();
 		}
-		return pckgName
 	}
 
 	/**
      * generate the full qualified mock package name corresponding to the imported entities
      */
-	def static String getEntityMockName(EntityMockPackage pckg) {
-		return '''«pckg.entityPackageName»mock'''
+	def String entityMockName(EntityMock mock) {
+		return '''«(mock.eContainer as EntityMockPackage).fullyQualifiedName.toString».«mock.name»Mock'''
 	}
 
 	/**
-     * generate the class name for a temporary mock object
+     * generate the class name for a template mock object
      */
-	def String getEntityMockName(EntityMockTemporary temporary) {
-		return (temporary.object as EntityMockObject).entityMockName
+	def String entityMockName(EntityMockTemplate template, EntityMock mock) {
+		return (template.object as EntityMockObject).entityMockName(mock)
 	}
-
+	
 	/**
      * generate the class name for a mock resource class
      */
-	def String getEntityMockName(EntityMockResource resource) {
-		return '''Resource«WordUtils.capitalize(resource.name)»'''
+	def String entityMockName(EntityMockResource resource, EntityMock mock) {
+		return '''«(mock.eContainer as EntityMockPackage).fullyQualifiedName.toString».«mock.name»Resource«WordUtils.capitalize(resource.name)»'''
 	}
 
 	/**
      * generate the class name for a mock object class
      */
-	def String getEntityMockName(EntityMockObject object) {
-		return '''Object«WordUtils.capitalize(object.name)»'''
+	def String entityMockName(EntityMockObject object, EntityMock mock) {
+		return '''«(mock.eContainer as EntityMockPackage).fullyQualifiedName.toString».«mock.name»Object«WordUtils.capitalize(object.name)»'''
 	}
 
 	/**
      * generate the class name for a mock entity
      */
-	def String getEntityMockName(EntityMockEntity entity) {
-		return '''Entity«WordUtils.capitalize(entity.name)»'''
+	def String entityMockName(EntityMockEntity entity, EntityMock mock) {
+		return '''«(mock.eContainer as EntityMockPackage).fullyQualifiedName.toString».«mock.name»Entity«WordUtils.capitalize(entity.name)»'''
 	}
 
 	/**
      * get the entity name referenced by a mock entity
      */
-	def String getEntityName(EntityMockEntity entity) {
+	def String entityName(EntityMockEntity entity) {
 		return entity.entityRef.entityName
 	}
 
 	/**
      * get the entity name 
      */
-	def String getEntityName(LEntity entity) {
+	def String entityName(LEntity entity) {
 		return entity.name
 	}
 
 	/**
      * get the entity name 
      */
-	def String getEnumName(LEnum lenum) {
+	def String enumName(LEnum lenum) {
 		return lenum.name
 	}
 
 	/**
      * get the full qualified entity name referenced by a mock entity
      */
-	def String getEntityDtoFQN(EntityMockEntity entity) {
+	def String entityFQN(EntityMockEntity entity) {
+		return EntityUtils.getFQNForLEntity(entity.entityRef)
+	}
+
+	/**
+     * get the full qualified dto name referenced by a mock entity
+     */
+	def String entityDtoFQN(EntityMockEntity entity) {
 		return EntityUtils.getDtoFQNForLEntity(entity.entityRef)
 	}
 
 	/**
-     * get the full qualified entity class name referenced by a mock entity
+     * get the full qualified dto class name referenced by a mock entity
      */
-	def String getEntityDtoFQNClass(EntityMockEntity entity) {
+	def String entityDtoFQNClass(EntityMockEntity entity) {
 		return entity.entityRef.entityDtoFQNClass
 	}
 
 	/**
      * get the full qualified entity class name
      */
-	def String getEntityDtoFQNClass(LEntity entity) {
+	def String entityDtoFQNClass(LEntity entity) {
 		return '''«EntityUtils.getDtoFQNForLEntity(entity)».class'''
 	}
 
 	/**
      * generate a mock object class
      */
-	def void generateMockObject(EntityMockModel model, IJvmDeclaredTypeAcceptor acceptor, EntityMockPackage pckg,
-		EntityMockObject mockObject) {
-		acceptor.accept(model.toClass('''«pckg.entityMockName».«mockObject.entityMockName»''')) [
+	def void generateMockObject(EntityMock model, IJvmDeclaredTypeAcceptor acceptor, EntityMockObject mockObject) {
+		var mockClass = model.toClass(mockObject.entityMockName(model))
+		acceptor.accept(mockClass) [
+			fileHeader = model.documentation
 			superTypes += _typeReferenceBuilder.typeRef(ABaseMockObject)
-			// @see org.eclipse.osbp.utils.constants.GeneratorConstants.GeneratorConstants
-			documentation = '''<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>
-«mockObject.documentation»
-'''
-			final = true
-            
-   			var JvmField field = null
-   			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger)) [setInitializer([ append('''LoggerFactory.getLogger(«pckg.entityMockName».«mockObject.entityMockName».class)''') ])] 
-   			field.final = true
-   			field.static = true
+			var JvmField field = null
+			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+				setInitializer(
+					[append('''LoggerFactory.getLogger("mock")''')])]
+			field.static = true
 			members += field
-			
 			// --- class attribute for each enumeration defined, almost identical to plain values
 			for (enumeration : mockObject.enumerations) {
 				if (enumeration.usingResource instanceof EntityMockResource) {
@@ -223,13 +258,12 @@
 						_typeReferenceBuilder.typeRef(ABaseMockResource)) [
 						setInitializer(
 							[
-								append('''new «resource.entityMockName»()''')
+								append('''new «resource.entityMockName(model)»()''')
 							])
 						documentation = enumeration.documentation
 						visibility = JvmVisibility::PRIVATE
 						static = true
 					]
-				} else {
 				}
 			}
 			// --- for each attribute
@@ -281,9 +315,10 @@
 							setInitializer(
 								[
 									append(
-										'''new HashMap<«keyType», Object[]>() {{
-«StringUtils.join(enums, "\r\n")»
-}}''')
+										'''
+										new HashMap<«keyType», Object[]>() {{
+										«StringUtils.join(enums, "\r\n")»
+										}}''')
 								])
 							documentation = attribute.documentation
 							visibility = JvmVisibility::PRIVATE
@@ -390,7 +425,8 @@
 					visibility = JvmVisibility.PROTECTED
 					for (param : calculation.params) {
 						var type = param.parameterType
-//						var fqn = type.fullyQualifiedName
+
+						//						var fqn = type.fullyQualifiedName
 						parameters += param.toParameter(param.name.name, type);
 					}
 					final = true
@@ -407,18 +443,21 @@
 						var doc = enumeration.documentation
 						if (doc instanceof String && !doc.trim.isEmpty) {
 							append(
-								'''/** «doc» */
-''')
+								'''
+								/** «doc» */
+								''')
 						}
 						if (enumeration.usingResource instanceof EntityMockResource) {
 							append(
-								'''generateAttribute("«enumeration.name»", «enumeration.name»_resource.getDataRows().toArray());
-''')
+								'''
+								generateAttribute("«enumeration.name»", «enumeration.name»_resource.getDataRows().toArray());
+								''')
 						} else {
 							val lenum = enumeration.usingResource
 							append(
-								'''generateAttribute("«enumeration.name»",«EntityUtils.getDtoFQNForLEnum(lenum)».values());
-'''
+								'''
+								generateAttribute("«enumeration.name»",«EntityUtils.getDtoFQNForLEnum(lenum)».values());
+								'''
 							)
 						}
 					}
@@ -427,44 +466,48 @@
 						var doc = attribute.documentation
 						if (doc instanceof String && !doc.trim.isEmpty) {
 							append(
-								'''/** «doc» */
-''')
+								'''
+								/** «doc» */
+								''')
 						}
 						switch attribute {
 							// --- each plain value, almost the same as an enumeration
 							EntityMockObjectPlainValue: {
 								append(
-									'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+								'''
+								generateAttribute("«attribute.name»", «attribute.name»_items);
+								''')
 							}
 							EntityMockObjectResourceValue: {
 								if (attribute.resourceEnum.usingResource instanceof EntityMockResource) {
 									append(
-										'''setFixAttribute("«attribute.name»", «attribute.resourceEnum.name»_resource.getAttribute(getAttribute("«attribute.
+										'''
+										setFixAttribute("«attribute.name»", «attribute.resourceEnum.name»_resource.getAttribute(getAttribute("«attribute.
 											resourceEnum.name»").toString(), "«attribute.resourceAttribute.name»"));
-'''
+										'''
 									)
 								} else {
 									append(
-										'''setFixAttribute("«attribute.name»", getAttribute("«attribute.resourceEnum.
-											name»"));
-'''
+										'''
+										setFixAttribute("«attribute.name»", getAttribute("«attribute.resourceEnum.name»"));
+										'''
 									)
 								}
 							}
 							// --- each array value, using the previously generated enumeration
 							EntityMockObjectArrayValue: {
 								append(
-									'''generateAttribute("«attribute.name»", "«attribute.enumeration.name»", «attribute.
-										name»_items);
-'''
+									'''
+									generateAttribute("«attribute.name»", "«attribute.enumeration.name»", «attribute.name»_items);
+									'''
 								)
 							}
 							// --- generating an embedded mock object
 							EntityMockObjectEmbed: {
 								append(
-									'''generateAttribute("«attribute.name»", new «attribute.object.entityMockName»());
-''')
+									'''
+									generateAttribute("«attribute.name»", new «attribute.object.entityMockName(model)»());
+									''')
 							}
 							// --- generating using filler text depending on filler type
 							EntityMockObjectFill: {
@@ -474,120 +517,135 @@
 								switch type {
 									PropertyFillerDateFuture: {
 										append(
-											'''generateDateAttribute("«attribute.name»", 0 ,«type.dateFutureYears»);
-''')
+											'''
+											generateDateAttribute("«attribute.name»", 0 ,«type.dateFutureYears»);
+											''')
 									}
 									PropertyFillerDatePast: {
 										append(
-											'''generateDateAttribute("«attribute.name»", -«type.datePastYears», 0);
-''')
+											'''
+											generateDateAttribute("«attribute.name»", -«type.datePastYears», 0);
+											''')
 									}
 									PropertyFillerDateRange: {
 										append(
-											'''generateDateAttribute("«attribute.name»", «type.dateBeginYears», «type.
-												dateEndYears»);
-''')
+											'''
+											generateDateAttribute("«attribute.name»", «type.dateBeginYears», «type.	dateEndYears»);
+											''')
 									}
 									PropertyFillerBoolean: {
 										append(
-											'''generateBooleanAttribute("«attribute.name»");
-''')
+											'''
+											generateBooleanAttribute("«attribute.name»");
+											''')
 									}
 									PropertyFillerSignedDoubleRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateSignedAttribute("«attribute.name»", «type.decimals», «beginRange», «endRange», «type.
+											'''
+											generateSignedAttribute("«attribute.name»", «type.decimals», «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerSignedDoubleRandom: {
 										append(
-											'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+											'''
+											generateAttribute("«attribute.name»", «attribute.name»_items);
+											''')
 									}
 									PropertyFillerUnsignedDoubleRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(double)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(double)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateUnsignedAttribute("«attribute.name»", «type.decimals», «beginRange», «endRange», «type.
+											'''
+											generateUnsignedAttribute("«attribute.name»", «type.decimals», «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerUnsignedDoubleRandom: {
 										append(
-											'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+											'''
+											generateAttribute("«attribute.name»", «attribute.name»_items);
+											''')
 									}
 									PropertyFillerSignedIntegerRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(int)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(int)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateSignedAttribute("«attribute.name»", «beginRange», «endRange», «type.
+											'''
+											generateSignedAttribute("«attribute.name»", «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerSignedIntegerRandom: {
 										append(
-											'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+											'''
+											generateAttribute("«attribute.name»", «attribute.name»_items);
+											''')
 									}
 									PropertyFillerUnsignedIntegerRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(int)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(int)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateUnsignedAttribute("«attribute.name»", «beginRange», «endRange», «type.
+											'''
+											generateUnsignedAttribute("«attribute.name»", «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerUnsignedIntegerRandom: {
 										append(
-											'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+											'''
+											generateAttribute("«attribute.name»", «attribute.name»_items);
+											''')	
 									}
 									PropertyFillerTextRandom: {
 										append(
-											'''generateAttribute("«attribute.name»", «attribute.name»_items);
-''')
+											'''
+											generateAttribute("«attribute.name»", «attribute.name»_items);
+											''')
 									}
 									PropertyFillerTextParagraphs: {
 										append(
-											'''generateParagraphsAttribute("«attribute.name»", «type.count»);
-''')
+											'''
+											generateParagraphsAttribute("«attribute.name»", «type.count»);
+											''')
 									}
 									PropertyFillerTextSentences: {
 										append(
-											'''generateSentencesAttribute("«attribute.name»", «type.count»);
-''')
+											'''
+											generateSentencesAttribute("«attribute.name»", «type.count»);
+											''')
 									}
 									PropertyFillerTextWords: {
 										append(
-											'''generateWordsAttribute("«attribute.name»", «type.count»);
-''')
+											'''
+											generateWordsAttribute("«attribute.name»", «type.count»);
+											''')
 									}
 								}
 							}
@@ -598,8 +656,9 @@
 						var doc = calculation.documentation
 						if (doc instanceof String && !doc.trim.isEmpty) {
 							append(
-								'''/** «doc» */
-''')
+								'''
+								/** «doc» */
+								''')
 						}
 						var paramString = ''''''
 						for (param : calculation.params) {
@@ -615,14 +674,15 @@
 							}
 						}
 						append(
-							'''try {
-	setFixAttribute("«calculation.name»", calculate_«calculation.name»(«paramString»));
-}
-catch (NullPointerException npe) {}
-catch (Exception e) {
-    log.error(e.getLocalizedMessage()+e.getCause());
-}
-'''
+							'''
+							try {
+								setFixAttribute("«calculation.name»", calculate_«calculation.name»(«paramString»));
+							}
+							catch (NullPointerException npe) {}
+							catch (Exception e) {
+							    log.error(e.getLocalizedMessage()+e.getCause());
+							}
+							'''
 						)
 					}
 				]
@@ -660,28 +720,23 @@
 	/**
      * generate a mock entity class
      */
-	def void generateMockEntity(EntityMockModel model, IJvmDeclaredTypeAcceptor acceptor, EntityMockPackage pckg,
-		EntityMockEntity mockEntity) {
-		acceptor.accept(model.toClass('''«pckg.entityMockName».«mockEntity.entityMockName»''')) [
+	def void generateMockEntity(EntityMock model, IJvmDeclaredTypeAcceptor acceptor, EntityMockEntity mockEntity) {
+		var mockClass = model.toClass(mockEntity.entityMockName(model))
+		acceptor.accept(mockClass) [
+			fileHeader = model.documentation
 			superTypes += _typeReferenceBuilder.typeRef(ABaseMockEntity)
-            // @see org.eclipse.osbp.utils.constants.GeneratorConstants.GeneratorConstants
-			documentation = '''<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>
-«mockEntity.documentation»
-'''
-			final = true
-            
-   			var JvmField field = null
-   			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger)) [setInitializer([ append('''LoggerFactory.getLogger(«pckg.entityMockName».«mockEntity.entityMockName».class)''') ])] 
-   			field.final = true
-   			field.static = true
+			var JvmField field = null
+			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+				setInitializer(
+					[append('''LoggerFactory.getLogger("mock")''')])]
+			field.static = true
 			members += field
-			
-			if (mockEntity.byResource != null) {
-				members += pckg.toField('''«mockEntity.byResource.name»_resource''',
+			if (mockEntity.byResource !== null) {
+				members += model.toField('''«mockEntity.byResource.name»_resource''',
 					_typeReferenceBuilder.typeRef(ABaseMockResource)) [
 					setInitializer(
 						[
-							append('''new «mockEntity.byResource.entityMockName»()''')
+							append('''new «mockEntity.byResource.entityMockName(model)»()''')
 						])
 					documentation = mockEntity.byResource.documentation
 					visibility = JvmVisibility::PRIVATE
@@ -689,22 +744,22 @@
 				]
 			}
 			// --- the constructor
-			members += pckg.toConstructor [
+			members += model.toConstructor [
 				parameters +=
 					mockEntity.toParameter("mockDataGenerator", _typeReferenceBuilder.typeRef(AEntityMockDataGenerator))
-                body = [
+				body = [
 					append('''super(mockDataGenerator, "«mockEntity.entityRef.persistenceUnit»");''')
 				]
 			]
-			// --- class variables for each temporary mock object needed
-			for (temporary : mockEntity.temporaries) {
-				members += pckg.toField('''«temporary.name»_temporary''',
+			// --- class variables for each template mock object needed
+			for (template : mockEntity.templates) {
+				members += model.toField('''«template.name»_template''',
 					_typeReferenceBuilder.typeRef(ABaseMockObject)) [
 					setInitializer(
 						[
-							append('''new «temporary.entityMockName»()''')
+							append('''new «template.entityMockName(model)»()''')
 						])
-					documentation = temporary.documentation
+					documentation = template.documentation
 					visibility = JvmVisibility::PRIVATE
 					static = true
 				]
@@ -723,7 +778,7 @@
 								for (item : type.items) {
 									items.add('''"«item»"''')
 								}
-								members += pckg.toField('''«attribute.attributeRef.name»_items''',
+								members += model.toField('''«attribute.attributeRef.name»_items''',
 									_typeReferenceBuilder.typeRef(typeof(Object[]))) [
 									setInitializer(
 										[
@@ -740,7 +795,7 @@
 								for (item : type.items) {
 									items.add('''«item»''')
 								}
-								members += pckg.toField('''«attribute.attributeRef.name»_items''',
+								members += model.toField('''«attribute.attributeRef.name»_items''',
 									_typeReferenceBuilder.typeRef(typeof(double[]))) [
 									setInitializer(
 										[
@@ -757,7 +812,7 @@
 								for (item : type.items) {
 									items.add('''«item»''')
 								}
-								members += pckg.toField('''«attribute.attributeRef.name»_items''',
+								members += model.toField('''«attribute.attributeRef.name»_items''',
 									_typeReferenceBuilder.typeRef(typeof(double[]))) [
 									setInitializer(
 										[
@@ -774,7 +829,7 @@
 								for (item : type.items) {
 									items.add('''«item»''')
 								}
-								members += pckg.toField('''«attribute.attributeRef.name»_items''',
+								members += model.toField('''«attribute.attributeRef.name»_items''',
 									_typeReferenceBuilder.typeRef(typeof(int[]))) [
 									setInitializer(
 										[
@@ -791,7 +846,7 @@
 								for (item : type.items) {
 									items.add('''«item»''')
 								}
-								members += pckg.toField('''«attribute.attributeRef.name»_items''',
+								members += model.toField('''«attribute.attributeRef.name»_items''',
 									_typeReferenceBuilder.typeRef(typeof(int[]))) [
 									setInitializer(
 										[
@@ -808,8 +863,8 @@
 					}
 				}
 			}
-			if (mockEntity.byResource != null) {
-				members += pckg.toMethod('''getDataRows''', _typeReferenceBuilder.typeRef(Set)) [
+			if (mockEntity.byResource !== null) {
+				members += model.toMethod('''getDataRows''', _typeReferenceBuilder.typeRef(Set)) [
 					visibility = JvmVisibility.PUBLIC
 					final = true
 					body = [
@@ -817,39 +872,44 @@
 					]
 				]
 
-				members += pckg.toMethod('''generateEntity''', _typeReferenceBuilder.typeRef(Object)) [
+				members += model.toMethod('''generateEntity''', _typeReferenceBuilder.typeRef(Object)) [
 					visibility = JvmVisibility.PUBLIC
-					parameters += pckg.toParameter("dataRow", _typeReferenceBuilder.typeRef(Object))
+					parameters += model.toParameter("dataRow", _typeReferenceBuilder.typeRef(Object))
 					final = true
 					body = [
 						// --- generate that entity
 						append(
-							'''reset();
-«mockEntity.entityDtoFQN» internal = new «mockEntity.entityDtoFQN»();
-entity = internal;
-generateData();
-try {
-''')
+							'''
+							reset();
+							«mockEntity.entityDtoFQN» internal = new «mockEntity.entityDtoFQN»();
+							entity = internal;
+							generateData();
+							try {
+							''')
 						// --- for each entity attribute, just copy from the internal mock data
 						for (attribute : mockEntity.byResourceAttributes) {
 							append(
-								'''internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
+								'''
+									internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
 									attributeRef.baseMockDataTypeCasting(
-										'''«mockEntity.byResource.name»_resource.getAttribute(dataRow.toString(), "«attribute.resourceAttribute.name»")''')»);
-''')
+										'''
+										«mockEntity.byResource.name»_resource.getAttribute(dataRow.toString(), "«attribute.resourceAttribute.name»")''')»);
+										''')
 						}
 						append(
-							'''}
-catch (Exception e) {
-    log.error(e.getLocalizedMessage()+e.getCause());
-}
-return entity;''')
+							'''
+							}
+							catch (Exception e) {
+							    log.error(e.getLocalizedMessage()+e.getCause());
+							}
+							return entity;''')
 					]
 				]
 			}
 			// --- for each calculcation
 			for (calculation : mockEntity.calculations) {
-				members += pckg.toMethod('''calculate_«calculation.attributeRef.name»''', calculation.attributeRef.jvmTypeRef) [
+				members += model.toMethod('''calculate_«calculation.attributeRef.name»''',
+					calculation.attributeRef.jvmTypeRef) [
 					visibility = JvmVisibility.PROTECTED
 					for (param : calculation.params) {
 						parameters += param.toParameter(param.getParamName("__"), param.jvmType);
@@ -859,22 +919,23 @@
 				]
 			}
 			// --- generate a single data row in the same manner as a mock object
-			members += pckg.toMethod('''generateDataRow''', _typeReferenceBuilder.typeRef(Void::TYPE)) [
+			members += model.toMethod('''generateDataRow''', _typeReferenceBuilder.typeRef(Void::TYPE)) [
 				visibility = JvmVisibility.PROTECTED
 				final = true
 				body = [
-					// --- first generate all requested temporary mock objects
-					for (temporary : mockEntity.temporaries) {
+					// --- first generate all requested template mock objects
+					for (template : mockEntity.templates) {
 						append(
-							'''generateAttribute("«temporary.name»", «temporary.name»_temporary);
-''')
+							'''
+							generateAttribute("«template.name»", «template.name»_template);
+							''')
 					}
 					// --- now all attributes
 					for (attribute : mockEntity.attributes) {
 						switch attribute {
-							// --- referencing to temporary mock objects
+							// --- referencing to template mock objects
 							EntityMockAttributeByObject: {
-								var sourceKey = attribute.reference.temporary.name
+								var sourceKey = attribute.reference.template.name
 								for (embed : attribute.reference.embedded) {
 									sourceKey = '''«sourceKey».«embed.name»'''
 								}
@@ -894,8 +955,9 @@
 								if (refAttribute instanceof EntityMockObjectFunction)
 									sourceKey = '''«sourceKey».«(refAttribute as EntityMockObjectFunction).name»'''
 								append(
-									'''generateAttribute("«attribute.attributeRef.name»", "«sourceKey»");
-''')
+									'''
+									generateAttribute("«attribute.attributeRef.name»", "«sourceKey»");
+									''')
 							}
 							// --- filled by filler providers by filler type
 							EntityMockAttributeFiller: {
@@ -903,143 +965,161 @@
 								switch type {
 									PropertyFillerDateFuture: {
 										append(
-											'''generateDateAttribute("«attribute.attributeRef.name»", 0 ,«type.
+											'''
+											generateDateAttribute("«attribute.attributeRef.name»", 0 ,«type.
 												dateFutureYears»);
-''')
+											''')
 									}
 									PropertyFillerDatePast: {
 										append(
-											'''generateDateAttribute("«attribute.attributeRef.name»", -«type.
+											'''
+											generateDateAttribute("«attribute.attributeRef.name»", -«type.
 												datePastYears», 0);
-''')
+											''')
 									}
 									PropertyFillerDateRange: {
 										append(
-											'''generateDateAttribute("«attribute.attributeRef.name»", «type.
+											'''
+											generateDateAttribute("«attribute.attributeRef.name»", «type.
 												dateBeginYears», «type.dateEndYears»);
-''')
+											''')
 									}
 									PropertyFillerBoolean: {
 										append(
-											'''generateBooleanAttribute("«attribute.attributeRef.name»");
-''')
+											'''
+											generateBooleanAttribute("«attribute.attributeRef.name»");
+											''')
 									}
 									PropertyFillerSignedDoubleRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateSignedAttribute("«attribute.attributeRef.name»", «type.decimals», «beginRange», «endRange», «type.
+											'''
+											generateSignedAttribute("«attribute.attributeRef.name»", «type.decimals», «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerSignedDoubleRandom: {
 										append(
-											'''generateAttribute("«attribute.attributeRef.name»", «attribute.
+											'''
+											generateAttribute("«attribute.attributeRef.name»", «attribute.
 												attributeRef.name»_items);
-''')
+											''')
 									}
 									PropertyFillerUnsignedDoubleRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(double)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(double)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateUnsignedAttribute("«attribute.attributeRef.name»", «type.decimals», «beginRange», «endRange», «type.
+											'''
+											generateUnsignedAttribute("«attribute.attributeRef.name»", «type.decimals», «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerUnsignedDoubleRandom: {
 										append(
-											'''generateAttribute("«attribute.attributeRef.name»", «attribute.
+											'''
+											generateAttribute("«attribute.attributeRef.name»", «attribute.
 												attributeRef.name»_items);
-''')
+											''')
 									}
 									PropertyFillerSignedIntegerRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(int)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(int)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateSignedAttribute("«attribute.attributeRef.name»", «beginRange», «endRange», «type.
+											'''
+											generateSignedAttribute("«attribute.attributeRef.name»", «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerSignedIntegerRandom: {
 										append(
-											'''generateAttribute("«attribute.attributeRef.name»", «attribute.
+											'''
+											generateAttribute("«attribute.attributeRef.name»", «attribute.
 												attributeRef.name»_items);
-''')
+											''')
 									}
 									PropertyFillerUnsignedIntegerRange: {
 										var beginRange = '''«type.beginRange»'''
 										var endRange = '''«type.endRange»'''
-										if (type.beginRangeRef != null) {
+										if (type.beginRangeRef !== null) {
 											beginRange = '''(int)get_"«type.beginRangeRef.name»"()'''
 										}
-										if (type.endRangeRef != null) {
+										if (type.endRangeRef !== null) {
 											endRange = '''(int)get_"«type.endRangeRef.name»"()'''
 										}
 										append(
-											'''generateUnsignedAttribute("«attribute.attributeRef.name»", «beginRange», «endRange», «type.
+											'''
+											generateUnsignedAttribute("«attribute.attributeRef.name»", «beginRange», «endRange», «type.
 												rounded»);
-''')
+											''')
 									}
 									PropertyFillerUnsignedIntegerRandom: {
 										append(
-											'''generateAttribute("«attribute.attributeRef.name»", «attribute.
+											'''
+											generateAttribute("«attribute.attributeRef.name»", «attribute.
 												attributeRef.name»_items);
-''')
+											''')
 									}
 									PropertyFillerTextRandom: {
 										append(
-											'''generateAttribute("«attribute.attributeRef.name»", «attribute.
+											'''
+											generateAttribute("«attribute.attributeRef.name»", «attribute.
 												attributeRef.name»_items);
-''')
+											''')
 									}
 									PropertyFillerTextParagraphs: {
 										append(
-											'''generateParagraphsAttribute("«attribute.attributeRef.name»", «type.count»);
-''')
+											'''
+											generateParagraphsAttribute("«attribute.attributeRef.name»", «type.count»);
+											''')
 									}
 									PropertyFillerTextSentences: {
 										append(
-											'''generateSentencesAttribute("«attribute.attributeRef.name»", «type.count»);
-''')
+											'''
+											generateSentencesAttribute("«attribute.attributeRef.name»", «type.count»);
+											''')
 									}
 									PropertyFillerTextWords: {
 										append(
-											'''generateWordsAttribute("«attribute.attributeRef.name»", «type.count»);
-''')
+											'''
+											generateWordsAttribute("«attribute.attributeRef.name»", «type.count»);
+											''')
 									}
 								}
 							}
 							// --- referencing to other mock entities
 							EntityMockAttributeByReference: {
-								if	(attribute.mockedEntity == null) {
-								append(
-									'''generateAttribute("«attribute.attributeRef.name»", «EntityUtils.getDtoFQNForLEntity(attribute.attributeRef.type)».class, «
-										((attribute.optionalFor as double)/100.0)»);
-''')
-								}
-								else {
+								if (attribute.mockedEntity === null) {
 									append(
-										'''generateAttribute("«attribute.attributeRef.name»", "«attribute.mockedEntity.name»", «
-											((attribute.optionalFor as double)/100.0)»);
-	''')
+										'''
+										generateAttribute("«attribute.attributeRef.name»", «EntityUtils.
+											getDtoFQNForLEntity(attribute.attributeRef.type)».class, «((attribute.
+											optionalFor as double) / 100.0)»);
+										''')
+								} else {
+									append(
+										'''
+										generateAttribute("«attribute.attributeRef.name»", "«attribute.mockedEntity.
+											name»", «((attribute.optionalFor as double) / 100.0)»);
+										''')
 								}
 							}
 						}
@@ -1049,108 +1129,110 @@
 						var doc = calculation.documentation
 						if (doc instanceof String && !doc.trim.isEmpty) {
 							append(
-								'''/** «doc» */
-''')
+								'''
+								/** «doc» */
+								''')
 						}
 						var paramString = ''''''
 						for (param : calculation.params) {
 							if (!paramString.isEmpty) {
 								paramString = '''«paramString»,'''
 							}
-							if (param.attributeRef != null) {
+							if (param.attributeRef !== null) {
 								paramString = '''«paramString»(«param.jvmType.identifier»)getAttribute("«param.
 									getParamName(".")»")'''
-							}
-							else if (param.isReferenceOnExistingDto) {
-								paramString = '''«paramString»(«param.jvmType.identifier»)((«
-									EntityUtils.getDtoFQNForLEntity(param.referencePaths.get(0).type)
-									»)getAttribute("«
-									param.referencePaths.get(0).name
-									»", mockDataGenerator, persistenceUnit)).get«param.referenceRef.name.toFirstUpper»()'''
-							}
-							else {
+							} else if (param.isReferenceOnExistingDto) {
+								paramString = '''«paramString»(«param.jvmType.identifier»)((«EntityUtils.
+									getDtoFQNForLEntity(param.nestedAttribute.reference.type)»)getAttribute("«param.
+									nestedAttribute.attribute.name»", mockDataGenerator, persistenceUnit)).get«param.
+									nestedAttribute.reference.name.toFirstUpper»()'''
+							} else {
 								paramString = '''«paramString»(«param.jvmType.identifier»)getAttribute("«param.
 									getParamName(".")»", mockDataGenerator, persistenceUnit)'''
 							}
 						}
 						append(
-							'''try {
-	setFixAttribute("«calculation.attributeRef.name»", calculate_«calculation.attributeRef.name»(«paramString»));
-}
-catch (NullPointerException npe) {}
-catch (Exception e) {
-    log.error(e.getLocalizedMessage()+e.getCause());
-}
-'''
+							'''
+							try {
+								setFixAttribute("«calculation.attributeRef.name»", calculate_«calculation.attributeRef.name»(«paramString»));
+							}
+							catch (NullPointerException npe) {}
+							catch (Exception e) {
+							    log.error(e.getLocalizedMessage()+e.getCause());
+							}
+							'''
 						)
 					}
 				]
 			]
-			if (mockEntity.byResource == null) {
-			// --- generate an entity based on the values generated before via generateDataRow(), just copying values into the entity
-			members += pckg.toMethod('''generateEntity''', _typeReferenceBuilder.typeRef(Object)) [
-				visibility = JvmVisibility.PUBLIC
-				parameters += mockEntity.toParameter("dataRow", _typeReferenceBuilder.typeRef(Object))
-				final = true
-				body = [
-					append('''
-						reset();
-''')
-					// --- if an iterator is set
-					if	(mockEntity.iterator != null) {
-						append('''
-							setFixAttribute("«mockEntity.iterator.name»", dataRow);
-''')
-					}
-					// --- generate that entity
-					append(
-						'''«mockEntity.entityDtoFQN» internal = new «mockEntity.entityDtoFQN»();
-entity = internal;
-generateData();
-mockDataGenerator.addDtoMockData(internal, mockData);
-try {
-''')
-					// --- for each entity attribute, just copy from the internal mock data
-					for (attribute : mockEntity.attributes) {
-						switch attribute {
-							EntityMockAttributeByObject: {
-								append(
-									'''internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
-										attributeRef.baseMockDataTypeCasting(
-											'''mockData.get("«attribute.attributeRef.name»")''')»);
-''')
-							}
-							EntityMockAttributeFiller: {
-								append(
-									'''internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
-										attributeRef.baseMockDataTypeCasting(
-											'''mockData.get("«attribute.attributeRef.name»")''')»);
-''')
-							}
-							EntityMockAttributeByReference: {
-								append(
-									'''internal.set«WordUtils.capitalize(attribute.attributeRef.name)»((«EntityUtils.getDtoFQNForLEntity(attribute.
-										attributeRef.type)»)mockData.get("«attribute.attributeRef.name»"));
-''')
+			if (mockEntity.byResource === null) {
+
+				// --- generate an entity based on the values generated before via generateDataRow(), just copying values into the entity
+				members += model.toMethod('''generateEntity''', _typeReferenceBuilder.typeRef(Object)) [
+					visibility = JvmVisibility.PUBLIC
+					parameters += mockEntity.toParameter("dataRow", _typeReferenceBuilder.typeRef(Object))
+					final = true
+					body = [
+						append(
+							'''
+								reset();
+							''')
+						// --- if an iterator is set
+						if (mockEntity.iterator !== null) {
+							append(
+								'''
+									setFixAttribute("«mockEntity.iterator.name»", dataRow);
+								''')
+						}
+						// --- generate that entity
+						append(
+							'''
+							«mockEntity.entityDtoFQN» internal = new «mockEntity.entityDtoFQN»();
+							entity = internal;
+							generateData();
+							mockDataGenerator.addDtoMockData(internal, getMockData());
+							try {
+							''')
+						// --- for each entity attribute, just copy from the internal mock data
+						for (attribute : mockEntity.attributes) {
+							switch attribute {
+								EntityMockAttributeByObject: {
+									append('''	internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
+											attributeRef.baseMockDataTypeCasting(
+												'''
+												getMockData().get("«attribute.attributeRef.name»")''')»);
+												''')
+								}
+								EntityMockAttributeFiller: {
+									append('''	internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.
+											attributeRef.baseMockDataTypeCasting(
+												'''getMockData().get("«attribute.attributeRef.name»")''')»);
+										''')
+								}
+								EntityMockAttributeByReference: {
+									append('''	internal.set«WordUtils.capitalize(attribute.attributeRef.name)»((«EntityUtils.
+											getDtoFQNForLEntity(attribute.attributeRef.type)»)getMockData().get("«attribute.
+											attributeRef.name»"));
+										''')
+								}
 							}
 						}
-					}
-					// --- for each entity attribute, just copy from the internal mock data
-					for (calculation : mockEntity.calculations) {
+						// --- for each entity attribute, just copy from the internal mock data
+						for (calculation : mockEntity.calculations) {
+							append('''	internal.set«WordUtils.capitalize(calculation.attributeRef.name)»(«calculation.
+									attributeRef.baseMockDataTypeCasting(
+										'''getMockData().get("«calculation.attributeRef.name»")''')»);
+								''')
+						}
 						append(
-							'''internal.set«WordUtils.capitalize(calculation.attributeRef.name)»(«calculation.
-								attributeRef.baseMockDataTypeCasting(
-									'''mockData.get("«calculation.attributeRef.name»")''')»);
-''')
-					}
-					append(
-						'''}
-catch (Exception e) {
-    log.error(e.getLocalizedMessage()+e.getCause());
-}
-return entity;''')
+							'''
+							}
+							catch (Exception e) {
+							    log.error(e.getLocalizedMessage()+e.getCause());
+							}
+							return entity;''')
+					]
 				]
-			]
 			}
 		]
 	}
@@ -1158,9 +1240,9 @@
 	def boolean isReferenceOnExistingDto(EntityMockEntityFunctionParameter param) {
 		val entityMock = param.eContainer.eContainer as EntityMockEntity
 		for (attribute : entityMock.attributes) {
-			if	(attribute instanceof EntityMockAttributeByReference) {
-				if	(attribute.mockedEntity == null) {
-					if	(attribute.attributeRef.type.equals(param.referenceRef.eContainer)) {
+			if (attribute instanceof EntityMockAttributeByReference) {
+				if (attribute.mockedEntity === null) {
+					if (attribute.attributeRef.type.equals(param.nestedAttribute.reference.eContainer)) {
 						return true
 					}
 				}
@@ -1170,22 +1252,20 @@
 	}
 
 	def JvmTypeReference getJvmType(EntityMockEntityFunctionParameter param) {
-		if (param.attributeRef != null) {
+		if (param.attributeRef !== null) {
 			return param.attributeRef.jvmTypeRef
 		} else {
-			return param.referenceRef.typeJvm
+			return entityExtensions.toTypeReference(param.nestedAttribute.attribute)
 		}
 	}
 
 	def String getParamName(EntityMockEntityFunctionParameter param, String separator) {
 		var paramName = ''''''
-		if (param.attributeRef != null) {
+		if (param.attributeRef !== null) {
 			paramName = '''«param.attributeRef.name»'''
 		} else {
-			for (referencePath : param.referencePaths) {
-				paramName = '''«paramName»«referencePath.name»«separator»'''
-			}
-			paramName = '''«paramName»«param.referenceRef.name»'''
+			paramName = '''«param.nestedAttribute.reference.name»«separator»'''
+			paramName = '''«paramName»«param.nestedAttribute.attribute.name»'''
 		}
 		return paramName
 	}
@@ -1196,17 +1276,27 @@
 	def JvmTypeReference jvmTypeRef(LEntityAttribute attribute) {
 		var etype = dtType.getBasicType(attribute)
 		switch (etype) {
-			case BOOLEAN: return _typeReferenceBuilder.typeRef(boolean)
-			case BYTE: return _typeReferenceBuilder.typeRef(byte)
-			case DATE: return _typeReferenceBuilder.typeRef(java.util.Date)
-			case FLOAT: return _typeReferenceBuilder.typeRef(float)
-			case DOUBLE: return _typeReferenceBuilder.typeRef(double)
-			case SHORT: return _typeReferenceBuilder.typeRef(short)
-			case INTEGER: return _typeReferenceBuilder.typeRef(int)
-			case LONG: return _typeReferenceBuilder.typeRef(long)
+			case BOOLEAN:
+				return _typeReferenceBuilder.typeRef(boolean)
+			case BYTE:
+				return _typeReferenceBuilder.typeRef(byte)
+			case DATE:
+				return _typeReferenceBuilder.typeRef(java.util.Date)
+			case FLOAT:
+				return _typeReferenceBuilder.typeRef(float)
+			case DOUBLE:
+				return _typeReferenceBuilder.typeRef(double)
+			case SHORT:
+				return _typeReferenceBuilder.typeRef(short)
+			case INTEGER:
+				return _typeReferenceBuilder.typeRef(int)
+			case LONG:
+				return _typeReferenceBuilder.typeRef(long)
 			//case TIME: return _typeReferenceBuilder.typeRef(Time)
-			case STRING: return _typeReferenceBuilder.typeRef(String)
-			default: return _typeReferenceBuilder.typeRef(Object)
+			case STRING:
+				return _typeReferenceBuilder.typeRef(String)
+			default:
+				return _typeReferenceBuilder.typeRef(Object)
 		}
 	}
 
@@ -1238,92 +1328,95 @@
 	val public static ENTITY_MOCK_GENERATOR = "EntityMockGenerator"
 
 	def String asString(Date date) {
-		if	(date.yesterday) {
+		if (date.yesterday) {
 			return '''"yesterday"'''
 		}
-		if	(date.today) {
+		if (date.today) {
 			return '''"today"'''
 		}
-		if	(date.tomorrow) {
+		if (date.tomorrow) {
 			return '''"tomorrow"'''
 		}
-		return '''"'''+String.format("%04d-%02d-%02d", date.year, date.month, date.day)+'''"'''
+		return '''"''' + String.format("%04d-%02d-%02d", date.year, date.month, date.day) + '''"'''
 	}
 
 	/**
      * generate the main mock data generator for the EntityMockPackage
      */
-	def void generateMockDataGenerator(EntityMockModel model, IJvmDeclaredTypeAcceptor acceptor,
-		EntityMockPackage pckg) {
-		acceptor.accept(model.toClass('''«pckg.entityMockName».«ENTITY_MOCK_GENERATOR»''')) [
-//			@TODO... AnnotationExtension needs addAnnAttr with Class<?> parameter !!!
-//			var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Component))
-//			annotationRef.addAnnAttr(model, "service", IInitializationProvider as Class)
-//			annotationRef.addAnnAttr(model, "immediate", true)
-//			annotations += annotationRef
-			
+	def void generateMockDataGenerator(EntityMock mock, IJvmDeclaredTypeAcceptor acceptor) {
+		var mockClass = mock.toClass(mock.entityMockName)
+		acceptor.accept(mockClass) [
+			fileHeader = mock.documentation
+			var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Component))
+			annotationRef.addAnnAttr(mock, "service", _typeReferenceBuilder.typeRef(IEntityMockDataGenerator) as JvmTypeReference)
+			annotationRef.addAnnAttr(mock, "immediate", true)
+			annotations += annotationRef
 			superTypes += _typeReferenceBuilder.typeRef(AEntityMockDataGenerator)
-            it.final = true
-            
-   			var JvmField field = null
-   			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger)) [setInitializer([ append('''LoggerFactory.getLogger(«pckg.entityMockName».«ENTITY_MOCK_GENERATOR».class)''') ])] 
-   			field.final = true
-   			field.static = true
+			it.final = true
+			var JvmField field = null
+			field = mock.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+				setInitializer(
+					[append('''LoggerFactory.getLogger("mock")''')])]
+			field.final = true
+			field.static = true
 			members += field
-            
-			members += model.toMethod('''getRunWithPriority''', _typeReferenceBuilder.typeRef(int)) [
-				annotations += pckg.toAnnotation(Override)
+			members += mock.toMethod('''getRunWithPriority''', _typeReferenceBuilder.typeRef(int)) [
+				annotations += _annotationTypesBuilder.annotationRef(Override)
 				body = [
 					var count = IEntityMockDataGenerator.DEFAULT_PRIORITY;
-					if (pckg.runPriority > 0) {
-						count = pckg.runPriority
+					if (mock.runPriority > 0) {
+						count = mock.runPriority
 					}
 					append(
 						'''
-						return «count»;
+							return «count»;
 						'''
 					)
 				]
 			]
-			members += model.toMethod('''getDataInterchangeSteps''', _typeReferenceBuilder.typeRef(int)) [
-				annotations += pckg.toAnnotation(Override)
+			members += mock.toMethod('''getDataInterchangeSteps''', _typeReferenceBuilder.typeRef(int)) [
+				annotations += _annotationTypesBuilder.annotationRef(Override)
 				body = [
 					var count = 0;
-					if (pckg.datainterchanges != null) {
-						count = pckg.datainterchanges.datainterchanges.size
+					if (mock.datainterchanges !== null) {
+						count = mock.datainterchanges.datainterchanges.size
 					}
 					append(
 						'''
-						return «count»;
+							return «count»;
 						'''
 					)
 				]
 			]
-			members += model.toMethod('''getEntityMockSteps''', _typeReferenceBuilder.typeRef(int)) [
-				annotations += pckg.toAnnotation(Override)
+			members += mock.toMethod('''getEntityMockSteps''', _typeReferenceBuilder.typeRef(int)) [
+				annotations += _annotationTypesBuilder.annotationRef(Override)
 				body = [
 					var count = 0;
-					if (pckg.entities != null) {
-						count = pckg.entities.entities.size
+					if (mock.entities !== null) {
+						count = mock.entities.entities.size
 					}
 					append(
 						'''
-						return «count»;
+							return «count»;
 						'''
 					)
 				]
 			]
-			members += model.toMethod('''runDataInterchanges''', _typeReferenceBuilder.typeRef(Void::TYPE)) [
-				parameters += pckg.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
-				parameters += pckg.toParameter("entityMockDbFiller", _typeReferenceBuilder.typeRef(IEntityMockDataDbFiller))
-	   			body = [
-					if (pckg.datainterchanges != null) {
-						for (runDatainterchange : pckg.datainterchanges.datainterchanges) {
+			members += mock.toMethod('''runDataInterchanges''', _typeReferenceBuilder.typeRef(Void::TYPE)) [
+				parameters += mock.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
+				parameters += mock.toParameter("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
+				parameters += mock.toParameter("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
+				parameters += mock.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
+				parameters +=
+					mock.toParameter("entityMockDbFiller", _typeReferenceBuilder.typeRef(IEntityMockDataDbFiller))
+				body = [
+					if (mock.datainterchanges !== null) {
+						for (runDatainterchange : mock.datainterchanges.datainterchanges) {
 							append(
 								'''
 									try {
 										entityMockDbFiller.notifyInitializationStep("datainterchange «runDatainterchange.datainterchangeRef.name»", 1, 0.3);
-										«runDatainterchange.datainterchangeRef.getBasicRunConfiguration(true, runDatainterchange.getFileURL)»
+										«runDatainterchange.datainterchangeRef.getBasicRunConfiguration(true, runDatainterchange.getFileURL, "import")»
 										entityMockDbFiller.notifyInitializationStep("datainterchange «runDatainterchange.datainterchangeRef.name»", 0, 0.4);
 										«runDatainterchange.datainterchangeRef.defaultVariableName».run(entityMockDbFiller);
 										entityMockDbFiller.notifyInitializationStep("datainterchange «runDatainterchange.datainterchangeRef.name»", 0, 0.9);
@@ -1336,8 +1429,10 @@
 					}
 				]
 			]
-			members += pckg.toMethod('''getMockData''', _typeReferenceBuilder.typeRef(Map)) [
-				parameters += pckg.toParameter("entityMockDbFiller", _typeReferenceBuilder.typeRef(IEntityMockDataDbFiller))
+			members += mock.toMethod('''getMockData''', _typeReferenceBuilder.typeRef(Map)) [
+				parameters += mock.toParameter("entityMockDbFiller", _typeReferenceBuilder.typeRef(IEntityMockDataDbFiller))
+				parameters += mock.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
+				parameters += mock.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
 				body = [
 					append(
 						'''initialize();
@@ -1346,7 +1441,7 @@
 					var mockEntitiesDone = new ArrayList<EntityMockEntity>
 					// --- list of all mock entities that have to be mocked
 					var mockEntitiesToDo = new ArrayList<EntityMockEntity>
-					mockEntitiesToDo.addAll(pckg.entities?.entities)
+					mockEntitiesToDo.addAll(mock.entities?.entities)
 					var breakTodo = false
 					// --- either all mock entities are already mocked or a break condition has been reached
 					while (!mockEntitiesToDo.isEmpty && !breakTodo) {
@@ -1365,109 +1460,113 @@
 
 								if (mockEntity.iterate instanceof IntegerIterate) {
 									var iterate = mockEntity.iterate as IntegerIterate
+
 									// --- generate the mocking part
 									append(
 										'''
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 1, 0.3);
-«mockEntity.entityMockName» entity«mockEntity.name» = new «mockEntity.entityMockName»(this);
-Iterator<Integer> iterator«mockEntity.name» = new IntegerIterator(«iterate.from», «iterate.until», «iterate.step»);
-List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.6);
-while (iterator«mockEntity.name».hasNext()) {
-    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
-}
-addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.name»);
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.9);
-''')
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 1, 0.3);
+										«mockEntity.entityMockName(mock)» entity«mockEntity.name» = new «mockEntity.entityMockName(mock)»(this);
+										Iterator<Integer> iterator«mockEntity.name» = new IntegerIterator(«iterate.from», «iterate.until», «iterate.step»);
+										List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.6);
+										persistenceService.registerPersistenceUnit(entity«mockEntity.name».getPersistenceUnit(), «mockEntity.entityFQN».class);
+										while (iterator«mockEntity.name».hasNext()) {
+										    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
+										}
+										addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.
+																					name»);
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.9);
+										''')
 								}
 								if (mockEntity.iterate instanceof DateIterate) {
 									var iterate = mockEntity.iterate as DateIterate
+
 									// --- generate the mocking part
 									append(
 										'''
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 1, 0.3);
-«mockEntity.entityMockName» entity«mockEntity.name» = new «mockEntity.entityMockName»(this);
-Iterator<Date> iterator«mockEntity.name» = new DateIterator(«iterate.from.asString», «iterate.until.asString», «iterate.stepCount», "«iterate.stepType»");
-List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.6);
-while (iterator«mockEntity.name».hasNext()) {
-    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
-}
-addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.name»);
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.9);
-''')
-								}
-								else if (mockEntity.byResource != null) {
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 1, 0.3);
+										«mockEntity.entityMockName(mock)» entity«mockEntity.name» = new «mockEntity.entityMockName(mock)»(this);
+										Iterator<Date> iterator«mockEntity.name» = new DateIterator(«iterate.from.asString», «iterate.until.asString», «iterate.
+																					stepCount», "«iterate.stepType»");
+										List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.6);
+										persistenceService.registerPersistenceUnit(entity«mockEntity.name».getPersistenceUnit(), «mockEntity.entityFQN».class);
+										while (iterator«mockEntity.name».hasNext()) {
+										    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
+										}
+										addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.
+																					name»);
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.9);
+										''')
+								} else if (mockEntity.byResource !== null) {
 
 									// --- generate the copy part
 									// --- generate the mocking part
 									append(
 										'''
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 1, 0.3);
-«mockEntity.entityMockName» entity«mockEntity.name» = new «mockEntity.entityMockName»(this);
-List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
-Iterator iterator«mockEntity.name» = entity«mockEntity.name».getDataRows().iterator();
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.6);
-while (iterator«mockEntity.name».hasNext()) {
-    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
-}
-addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.name»);
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.9);
-''')
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 1, 0.3);
+										«mockEntity.entityMockName(mock)» entity«mockEntity.name» = new «mockEntity.entityMockName(mock)»(this);
+										List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
+										Iterator iterator«mockEntity.name» = entity«mockEntity.name».getDataRows().iterator();
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.6);
+										persistenceService.registerPersistenceUnit(entity«mockEntity.name».getPersistenceUnit(), «mockEntity.entityFQN».class);
+										while (iterator«mockEntity.name».hasNext()) {
+										    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
+										}
+										addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.
+																					name»);
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.9);
+										''')
 
 									// --- if blob mapping has to be generated too
 									if (mockEntity.createBlobMapping) {
 										append(
 											'''
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»Blobs", 0, 0.93);
-List list«mockEntity.name»Blobs = new ArrayList<org.eclipse.osbp.utils.blob.dtos.BlobDto>();
-BlobTypingAPI «mockEntity.name»BlobTypingAPI = new BlobTypingAPI();
-BlobUpload «mockEntity.name»BlobUpload = new BlobUpload();
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»Blobs", 0, 0.96);
-for (Object list«mockEntity.name»Object : list«mockEntity.name») {
-    if  (list«mockEntity.name»Object instanceof org.eclipse.osbp.utils.blob.dtos.BlobMappingDto) {
-        org.eclipse.osbp.utils.blob.dtos.BlobMappingDto blobMappingDto = (org.eclipse.osbp.utils.blob.dtos.BlobMappingDto)list«mockEntity.
-												name»Object;
-        try {
-            InputStream inputStream = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream("/resources/entitymock/"+blobMappingDto.getFileName()));
-            if  (inputStream != null) {
-                List<org.eclipse.osbp.utils.blob.dtos.BlobDto> blobs = «mockEntity.name»BlobUpload.createBlobMappingBlobs(
-                    inputStream,
-                    «mockEntity.name»BlobTypingAPI.getMimeTypeContentTypeById(blobMappingDto.getMimeTypeId()),
-                    «mockEntity.name»BlobTypingAPI,
-                    blobMappingDto.getId()
-                );
-                blobMappingDto.setBlobsRef(blobs);
-                for (org.eclipse.osbp.utils.blob.dtos.BlobDto blob : blobs) {
-                    list«mockEntity.name»Blobs.add(blob);
-                }
-            }
-        }
-        catch (Exception e) {
-            log.error(e.getLocalizedMessage()+e.getCause());
-        }
-    }
-}
-addMockObjects("«mockEntity.name»Blobs", org.eclipse.osbp.utils.blob.dtos.BlobDto.class, "blob", list«mockEntity.name»Blobs);
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»Blobs", 0, 0.99);
-''')
+											entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»Blobs", 0, 0.93);
+											List list«mockEntity.name»Blobs = new ArrayList<org.eclipse.osbp.blob.dtos.BlobDto>();
+											entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»Blobs", 0, 0.96);
+											for (Object list«mockEntity.name»Object : list«mockEntity.name») {
+											    if  (list«mockEntity.name»Object instanceof org.eclipse.osbp.blob.dtos.BlobMappingDto) {
+											        org.eclipse.osbp.blob.dtos.BlobMappingDto blobMappingDto = (org.eclipse.osbp.blob.dtos.BlobMappingDto)list«mockEntity.
+																							name»Object;
+											        try {
+											            InputStream inputStream = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream("/resources/entitymock/"+blobMappingDto.getFileName()));
+											            if  (inputStream != null) {
+											                List<Object> blobs = blobService.createBlobMappingBlobs(inputStream, blobMappingDto.getMimeTypeId());
+											                for(Object obj:blobs) {
+												                blobMappingDto.addToBlobsRef((org.eclipse.osbp.blob.dtos.BlobDto)obj);
+											                    list«mockEntity.name»Blobs.add((org.eclipse.osbp.blob.dtos.BlobDto)obj);
+											                }
+											            }
+											        }
+											        catch (Exception e) {
+											            log.error(e.getLocalizedMessage()+e.getCause());
+											        }
+											    }
+											}
+											addMockObjects("«mockEntity.name»Blobs", org.eclipse.osbp.blob.dtos.BlobDto.class, "blob", list«mockEntity.name»Blobs);
+											entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»Blobs", 0, 0.99);
+											''')
 									}
 								} else {
 
 									// --- generate the mocking part
 									append(
 										'''
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 1, 0.3);
-«mockEntity.entityMockName» entity«mockEntity.name» = new «mockEntity.entityMockName»(this);
-Iterator<Integer> iterator«mockEntity.name» = new IntegerIterator(1, fillerProvider.signedinteger(«mockEntity.minRows», «mockEntity.maxRows»));
-List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.6);
-while (iterator«mockEntity.name».hasNext()) {
-    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
-}
-addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.name»);
-entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName»", 0, 0.9);
-''')
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 1, 0.3);
+										«mockEntity.entityMockName(mock)» entity«mockEntity.name» = new «mockEntity.entityMockName(mock)»(this);
+										Iterator<Integer> iterator«mockEntity.name» = new IntegerIterator(1, getFillerProvider().signedinteger(«mockEntity.minRows», «mockEntity.
+																					maxRows»));
+										List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.6);
+										persistenceService.registerPersistenceUnit(entity«mockEntity.name».getPersistenceUnit(), «mockEntity.entityFQN».class);
+										while (iterator«mockEntity.name».hasNext()) {
+										    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
+										}
+										addMockObjects("«mockEntity.name»", «mockEntity.entityDtoFQNClass», "«mockEntity.entityRef.persistenceUnit»", list«mockEntity.
+																					name»);
+										entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.9);
+										''')
 								}
 
 								// --- remember this mock entity as being mocked
@@ -1483,78 +1582,18 @@
 					}
 					append(
 						'''
-return mockDataClassMap;''')
+						return mockDataClassMap;''')
 				]
 			]
 		]
 	}
 
 	/**
-	 * The dispatch method {@code infer} is called for each instance of the
-	 * given element's type that is contained in a resource.
-	 * 
-	 * @param element
-	 *            the model to create one or more
-	 *            {@link JvmDeclaredType declared
-	 *            types} from.
-	 * @param acceptor
-	 *            each created
-	 *            {@link JvmDeclaredType type}
-	 *            without a container should be passed to the acceptor in order
-	 *            get attached to the current resource. The acceptor's
-	 *            {@link IJvmDeclaredTypeAcceptor#accept(org.eclipse.xtext.common.types.JvmDeclaredType)
-	 *            accept(..)} method takes the constructed empty type for the
-	 *            pre-indexing phase. This one is further initialized in the
-	 *            indexing phase using the closure you pass to the returned
-	 *            {@link IPostIndexingInitializing#initializeLater(org.eclipse.xtext.xbase.lib.Procedures.Procedure1)
-	 *            initializeLater(..)}.
-	 * @param isPreIndexingPhase
-	 *            whether the method is called in a pre-indexing phase, i.e.
-	 *            when the global index is not yet fully updated. You must not
-	 *            rely on linking using the index if isPreIndexingPhase is
-	 *            <code>true</code>.
-	 */
-	def dispatch void infer(EntityMockModel model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
-		model.packages.forEach [ pckg |
-			// --- generate one class for each mock resource
-			pckg.resources?.resources?.forEach [ mockResource |
-				try {
-					generateMockResource(model, acceptor, pckg, mockResource)
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			]
-			// --- generate one class for each mock object defined
-			pckg.objects?.objects?.forEach [ mockObject |
-				try {
-					generateMockObject(model, acceptor, pckg, mockObject)
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			]
-			// --- generate a class for each mock entity
-			pckg.entities?.entities?.forEach [ mockEntity |
-				try {
-					generateMockEntity(model, acceptor, pckg, mockEntity)
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			]
-			// --- generate the mock generator
-			try {
-				generateMockDataGenerator(model, acceptor, pckg)
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		]
-	}
-
-	/**
      * checks if the mockEntityTodo can be handled, considering all requested references to other mock entities,
      * which may already been mocked
      */
 	def boolean canBeHandled(EntityMockEntity mockEntityTodo, ArrayList<EntityMockEntity> mockEntitiesDone) {
-		if (mockEntityTodo.byResource != null) {
+		if (mockEntityTodo.byResource !== null) {
 			return true
 		}
 		for (attribute : mockEntityTodo.attributes) {
@@ -1562,8 +1601,10 @@
 			// --- check every reference to another mock entity
 			if (attribute instanceof EntityMockAttributeByReference) {
 				var referencedMockEntity = (attribute as EntityMockAttributeByReference).mockedEntity
+
 				// --- if the referenced entity should be mocked and it not has been mocked so far
-				if ((referencedMockEntity != null) && !mockEntitiesDone.contains(referencedMockEntity)) {
+				if ((referencedMockEntity !== null) && !mockEntitiesDone.contains(referencedMockEntity)) {
+
 					// --- if any referenced entity has not been mocked so far, this mock entity can't be mocked at this time
 					return false
 				}
@@ -1575,31 +1616,28 @@
 	/**
      * generate a mock object class
      */
-	def void generateMockResource(EntityMockModel model, IJvmDeclaredTypeAcceptor acceptor, EntityMockPackage pckg,
-		EntityMockResource mockResource) {
-		acceptor.accept(model.toClass('''«pckg.entityMockName».«mockResource.entityMockName»''')) [
+	def void generateMockResource(EntityMock model, IJvmDeclaredTypeAcceptor acceptor, EntityMockResource mockResource) {
+		var mockClass = model.toClass(mockResource.entityMockName(model))
+		acceptor.accept(mockClass) [
+			fileHeader = model.documentation
 			superTypes += _typeReferenceBuilder.typeRef(ABaseMockResource)
-			// @see org.eclipse.osbp.utils.constants.GeneratorConstants.GeneratorConstants
-			documentation = '''<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>
-«mockResource.documentation»
-'''
-			final = true
-            
-   			var JvmField field = null
-   			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger)) [setInitializer([ append('''LoggerFactory.getLogger(«pckg.entityMockName».«mockResource.entityMockName».class)''') ])] 
-   			field.final = true
-   			field.static = true
+			var JvmField field = null
+			field = model.toField("log", _typeReferenceBuilder.typeRef(Logger))[
+				setInitializer(
+					[append('''LoggerFactory.getLogger("mock")''')])]
+			field.final = true
+			field.static = true
 			members += field
-			
-			members += pckg.toConstructor [
+			members += model.toConstructor [
 				body = [
 					val List<String> attributes = new ArrayList
 					for (attribute : mockResource.attributes) {
 						attributes.add('''"«attribute.name»"''')
 					}
 					append(
-						'''setAttributes(«StringUtils.join(attributes, ",")»);
-''')
+						'''
+						setAttributes(«StringUtils.join(attributes, ",")»);
+						''')
 					for (datarow : mockResource.datarows) {
 						val List<String> values = new ArrayList
 						values.add('''"«datarow.name»"''')
@@ -1607,8 +1645,9 @@
 							values.add('''"«value»"''')
 						}
 						append(
-							'''addDataRow(«StringUtils.join(values, ",")»);
-''')
+							'''
+							addDataRow(«StringUtils.join(values, ",")»);
+							''')
 					}
 				]
 			]
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLImportSectionNamespaceScopeProvider.java b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLImportSectionNamespaceScopeProvider.java
new file mode 100644
index 0000000..7ae8d53
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLImportSectionNamespaceScopeProvider.java
@@ -0,0 +1,25 @@
+package org.eclipse.osbp.xtext.entitymock.scoping;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
+import org.eclipse.osbp.xtext.oxtype.scoping.eobject.OXEObjectImportSectionNamespaceScopeProvider;
+import org.eclipse.xtext.scoping.impl.ImportNormalizer;
+
+@SuppressWarnings("restriction")
+public class EntityMockDSLImportSectionNamespaceScopeProvider extends
+		OXEObjectImportSectionNamespaceScopeProvider {
+
+	protected List<ImportNormalizer> internalGetImportedNamespaceResolvers(
+			EObject context, boolean ignoreCase) {
+
+		List<ImportNormalizer> result = super
+				.internalGetImportedNamespaceResolvers(context, ignoreCase);
+
+		if (!(context instanceof EntityMockPackage))
+			return result;
+
+		return result;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.xtend
index 5358f11..fe00558 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.xtend
@@ -12,386 +12,434 @@
  * 
  * 
  *  This copyright notice shows up in the generated Java code
- *
+ * 
  */
- 
+
 package org.eclipse.osbp.xtext.entitymock.scoping
 
+import java.util.ArrayList
+import java.util.List
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.osbp.dsl.semantic.entity.LEntity
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
+import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntities
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum
+import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue
 import org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute
+import org.eclipse.osbp.xtext.entitymock.EntityMockResource
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow
-import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute
-import java.util.ArrayList
-import java.util.List
-import org.eclipse.emf.ecore.EObject
-import org.eclipse.emf.ecore.EReference
 import org.eclipse.xtext.resource.EObjectDescription
 import org.eclipse.xtext.resource.IEObjectDescription
 import org.eclipse.xtext.scoping.IScope
 import org.eclipse.xtext.scoping.impl.MapBasedScope
-import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider
-import org.eclipse.osbp.dsl.semantic.entity.LEntity
-import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
-import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
-import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction
-import org.eclipse.osbp.xtext.entitymock.EntityMockResource
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute
 
 /**
  * This class contains custom scoping description.
  * 
  * see : http://www.eclipse.org/Xtext/documentation.html#scoping
  * on how and when to use it 
- *
+ * 
  */
-class EntityMockDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider {
+class EntityMockDSLScopeProvider extends AbstractEntityMockDSLScopeProvider {
 	override IScope getScope(EObject context, EReference reference) {
-		if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION) {
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION) {
 			return getScope_MockObjectEnum(context)
 		}
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW) {
-            return getScope_MockObjectEnumValue(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED) {
-            return getScope_MockObjectEmbed(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE) {
-            return getScope_MockObjectAttribute(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF) {
-            return getLEntityAttributes(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY__ITERATOR) {
-            return getLEntityAttributes(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) {
-            return getLEntityAttributes(context)
-        }
-        if (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF) {
-            return getLEntityReferences(context)
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF) {
-            switch context {
-                case EntityMockAttributeByObject: return MapBasedScope.createScope(IScope.NULLSCOPE, (context.eContainer as EntityMockEntity).getEntityAttributes(null))
-                case EntityMockEntity:            return MapBasedScope.createScope(IScope.NULLSCOPE, (context as EntityMockEntity).getEntityAttributes(null))
-            }
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) {
-            switch context {
-                case EntityMockAttributeFiller:   return MapBasedScope.createScope(IScope.NULLSCOPE, (context.eContainer as EntityMockEntity).getEntityAttributes(null))
-                case EntityMockEntities:          return MapBasedScope.createScope(IScope.NULLSCOPE, (context as EntityMockEntities).getEntityAttributes(null))
-            }
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF) {
-            switch context {
-                case EntityMockAttributeByReference:  return MapBasedScope.createScope(IScope.NULLSCOPE, (context.eContainer as EntityMockEntity).getEntityAttributes(null))
-                case EntityMockEntities:              return MapBasedScope.createScope(IScope.NULLSCOPE, (context as EntityMockEntities).getEntityAttributes(null))
-            }
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY) {
-            return getScope_MockAttributeReferencedMockedEntity(context)
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE) {
-            return getScope_MockAttributeResourceAttribute(context)
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE) {
-            return getScope_MockEntityResourceAttribute(context)
-        }
-        if  (reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF) {
-            return getLEntityAttributes(context)
-        }
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW) {
+			return getScope_MockObjectEnumValue(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED) {
+			return getScope_MockObjectEmbed(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE) {
+			return getScope_MockObjectAttribute(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF) {
+			return getEntityAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY__ITERATOR) {
+			return getEntityAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) {
+			return getEntityAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION__ATTRIBUTE_REF) {
+			return getEntityAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF) {
+			return getNestedAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE) {
+			return getNestedAttributes(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE) {
+			return getNestedAttributesAttribute(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE) {
+			return getEntityReferences(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF) {
+			return getEntityReferences(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF) {
+			switch context {
+				EntityMockAttributeByObject: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context.eContainer as EntityMockEntity).getEntityAttributes(null))
+				EntityMockEntity: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context as EntityMockEntity).getEntityAttributes(null))
+			}
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF) {
+			switch context {
+				EntityMockAttributeFiller: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context.eContainer as EntityMockEntity).getEntityAttributes(null))
+				EntityMockEntities: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context as EntityMockEntities).getEntityAttributes(null))
+			}
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF) {
+			switch context {
+				EntityMockAttributeByReference: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context.eContainer as EntityMockEntity).getEntityAttributes(null))
+				EntityMockEntities: return MapBasedScope.createScope(IScope.NULLSCOPE,
+					(context as EntityMockEntities).getEntityAttributes(null))
+			}
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY) {
+			return getScope_MockAttributeReferencedMockedEntity(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE) {
+			return getScope_MockAttributeResourceAttribute(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE) {
+			return getScope_MockEntityResourceAttribute(context)
+		}
+		if (reference === EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF) {
+			return getEntityAttributes(context)
+		}
 		super.getScope(context, reference)
 	}
 
-    def LEntity getCCEntityRef(EObject context) {
-        var eObj = context
-        while (!(eObj instanceof EntityMockEntity)) {
-            eObj = eObj.eContainer()
-        }
-        if (eObj != null) {
-            return (eObj as EntityMockEntity).entityRef
-        } else {
-            return null
-        }
+	def LEntity getEntityRef(EObject context) {
+		var eObj = context
+		while (eObj !== null && !(eObj instanceof EntityMockEntity)) {
+			eObj = eObj.eContainer()
+		}
+		if (eObj !== null) {
+			return (eObj as EntityMockEntity).entityRef
+		} else {
+			return null
+		}
 
-    }
+	}
 
-    def IScope getLEntityAttributes(EObject context) {
-        var result = <IEObjectDescription>newArrayList
-        var entity = context.CCEntityRef
-        if (entity != null){
-            for (LEntityAttribute attr : entity.allAttributes) {
-                if  (attr.name != null) {
-                    result.add(EObjectDescription.create(attr.name, (attr as LEntityAttribute)))
-                }
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
+	def IScope getNestedAttributesAttribute(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var reference = (context as EntityMockEntityNestedAttribute).reference
+		if (reference !== null && reference.type != null) {
+			for (a : reference.type.allAttributes) {
+				result.add(EObjectDescription.create(a.name, a))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
-    def IScope getLEntityReferences(EObject context) {
-        var result = <IEObjectDescription>newArrayList
-        var entity = context.CCEntityRef
-        if (entity != null){
-            for (LEntityReference ref : entity.allReferences) {
-                if  (ref.name != null) {
-                    result.add(EObjectDescription.create(ref.name, (ref as LEntityReference)))
-                }
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
+	def IScope getNestedAttributes(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var entity = context.entityRef
+		if (entity !== null) {
+			for (f : entity.allFeatures) {
+				switch (f) {
+					LEntityAttribute:
+						result.add(EObjectDescription.create(f.name, f))
+					LEntityReference:
+						result.add(EObjectDescription.create(f.name, f))
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
-    /**
-     * get all available entity attributes contained in EntityMockEntities and add them to result
-     */
-    def ArrayList<IEObjectDescription> getEntityAttributes(EntityMockEntities mockEntities, ArrayList<IEObjectDescription> result) {
-        var iresult = result
-        if  (iresult == null) {
-            iresult = <IEObjectDescription>newArrayList
-        }
-        if (mockEntities != null){
-            for (mockEntity : mockEntities.entities) {
-                iresult = mockEntity.getEntityAttributes(iresult)
-            }
-        }
-        return iresult
-    }
+	def IScope getEntityAttributes(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var entity = context.entityRef
+		if (entity !== null) {
+			for (LEntityAttribute attr : entity.allAttributes) {
+				result.add(EObjectDescription.create(attr.name, attr))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
-    /**
-     * get all available entity attributes contained in EntityMockEntity and add them to result
-     */
-    def ArrayList<IEObjectDescription> getEntityAttributes(EntityMockEntity mockEntity, ArrayList<IEObjectDescription> result) {
-        var iresult = result
-        if  (iresult == null) {
-            iresult = <IEObjectDescription>newArrayList
-        }
-        if (mockEntity != null) {
-            iresult = mockEntity.entityRef.getEntityAttributes(iresult)
-        }
-        return iresult
-    }
+	def IScope getEntityReferences(EObject context) {
+		var result = <IEObjectDescription>newArrayList
+		var entity = context.entityRef
+		if (entity !== null) {
+			for (LEntityReference ref : entity.allReferences) {
+				if (ref.name !== null) {
+					result.add(EObjectDescription.create(ref.name, (ref as LEntityReference)))
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
-    /**
-     * get all available entity attributes contained in LEntity and add them to result
-     */
-    def ArrayList<IEObjectDescription> getEntityAttributes(LEntity entity, ArrayList<IEObjectDescription> result) {
-        var iresult = result
-        if  (iresult == null) {
-            iresult = <IEObjectDescription>newArrayList
-        }
-        if (entity != null){
-            for (LEntityAttribute attribute : entity.allAttributes) {
-                if (attribute.name != null) {
-                    iresult.add(EObjectDescription.create(attribute.name, attribute))
-                }
-            }
-        }
-        return iresult
-    }
+	/**
+	 * get all available entity attributes contained in EntityMockEntities and add them to result
+	 */
+	def ArrayList<IEObjectDescription> getEntityAttributes(EntityMockEntities mockEntities,
+		ArrayList<IEObjectDescription> result) {
+		var iresult = result
+		if (iresult === null) {
+			iresult = <IEObjectDescription>newArrayList
+		}
+		if (mockEntities !== null) {
+			for (mockEntity : mockEntities.entities) {
+				iresult = mockEntity.getEntityAttributes(iresult)
+			}
+		}
+		return iresult
+	}
 
-    /**
-     * get all available entity attributes contained in LEntity and return them as an IScope
-     */
-    def IScope getLEntity_attributeRef(EObject context, LEntity entity) {
-        var result = <IEObjectDescription>newArrayList
-        if (entity != null){
-            for (LEntityAttribute attribute : entity.allAttributes) {
-                if (attribute.name != null) {
-                    result.add(EObjectDescription.create(attribute.name, attribute))
-                }
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available mock objects and add them as an IScope
-     */
-    def IScope getScope_MockObjectEmbed(EObject object) {
-        val result = <IEObjectDescription>newArrayList
-        var emroa = null as EntityMockReferencedObjectAttribute
-        if  (object instanceof EntityMockReferencedObjectAttribute) {
-            emroa = object
-        }
-        if  (object instanceof EntityMockAttributeByObject) {
-            emroa = object.reference
-        }
-        var mockObject = emroa.temporary.object
+	/**
+	 * get all available entity attributes contained in EntityMockEntity and add them to result
+	 */
+	def ArrayList<IEObjectDescription> getEntityAttributes(EntityMockEntity mockEntity,
+		ArrayList<IEObjectDescription> result) {
+		var iresult = result
+		if (iresult === null) {
+			iresult = <IEObjectDescription>newArrayList
+		}
+		if (mockEntity !== null) {
+			iresult = mockEntity.entityRef.getEntityAttributes(iresult)
+		}
+		return iresult
+	}
+
+	/**
+	 * get all available entity attributes contained in LEntity and add them to result
+	 */
+	def ArrayList<IEObjectDescription> getEntityAttributes(LEntity entity, ArrayList<IEObjectDescription> result) {
+		var iresult = result
+		if (iresult === null) {
+			iresult = <IEObjectDescription>newArrayList
+		}
+		if (entity !== null) {
+			for (LEntityAttribute attribute : entity.allAttributes) {
+				if (attribute.name !== null) {
+					iresult.add(EObjectDescription.create(attribute.name, attribute))
+				}
+			}
+		}
+		return iresult
+	}
+
+	/**
+	 * get all available mock objects and add them as an IScope
+	 */
+	def IScope getScope_MockObjectEmbed(EObject object) {
+		val result = <IEObjectDescription>newArrayList
+		var emroa = null as EntityMockReferencedObjectAttribute
+		if (object instanceof EntityMockReferencedObjectAttribute) {
+			emroa = object
+		}
+		if (object instanceof EntityMockAttributeByObject) {
+			emroa = object.reference
+		}
+		var mockObject = emroa.template.object
 //        emroa.embedded.forEach ([ embed | {
-//            if  (embed.name != null) {
+//            if  (embed.name !== null) {
 //                result.add(EObjectDescription.create(embed.name, embed))
 //            }
 //        }])
-        getScope_MockObjectRecursiveEmbed(result, mockObject)
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available mock objects recursively and add them to result
-     */	
+		getScope_MockObjectRecursiveEmbed(result, mockObject)
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	/**
+	 * get all available mock objects recursively and add them to result
+	 */
 	def void getScope_MockObjectRecursiveEmbed(List<IEObjectDescription> result, EntityMockObject mockObject) {
-        if  (mockObject != null) {
-            for (attribute : mockObject.attributes) {
-                if  (attribute instanceof EntityMockObjectEmbed) {
-                    result.add(EObjectDescription.create(attribute.name, attribute))
-                    getScope_MockObjectRecursiveEmbed(result, attribute.object)
-                }
-            }
-        }
+		if (mockObject !== null) {
+			for (attribute : mockObject.attributes) {
+				if (attribute instanceof EntityMockObjectEmbed) {
+					result.add(EObjectDescription.create(attribute.name, attribute))
+					getScope_MockObjectRecursiveEmbed(result, attribute.object)
+				}
+			}
+		}
 	}
-	
-    /**
-     * get all available enumerations and attributes of a mock object recursively and add them as an IScope
-     */ 
-    def IScope getScope_MockObjectAttribute(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var emroa = null as EntityMockReferencedObjectAttribute
-        if  (object instanceof EntityMockReferencedObjectAttribute) {
-            emroa = object
-        }
-        if  (object instanceof EntityMockAttributeByObject) {
-            emroa = object.reference
-        }
-        var mockObject = emroa.temporary.object
-        if  (!emroa.embedded.isEmpty) {
-            mockObject = emroa.embedded.last.object
-        }
-        if  (mockObject != null) {
-            for (enumeration : mockObject.enumerations) {
-                result.add(EObjectDescription.create((enumeration as EntityMockObjectEnum).name, (enumeration as EntityMockObjectEnum)))
-            }
-            for (attribute : mockObject.attributes) {
-                if  (attribute instanceof EntityMockObjectEmbed) {
-                    //getScope_MockObjectAttribute(prefix+(attribute as IEntityMockObjectAttribute).name+"_", attribute.object, result)
-                }
-                else {
-                    result.add(EObjectDescription.create((attribute as IEntityMockObjectAttribute).name, (attribute as IEntityMockObjectAttribute)))
-                }
-            }
-            for (calculation : mockObject.calculations) {
-                result.add(EObjectDescription.create((calculation as EntityMockObjectFunction).name, (calculation as EntityMockObjectFunction)))
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available enumerations of a mock object and add them as an IScope
-     */ 
+
+	/**
+	 * get all available enumerations and attributes of a mock object recursively and add them as an IScope
+	 */
+	def IScope getScope_MockObjectAttribute(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var emroa = null as EntityMockReferencedObjectAttribute
+		if (object instanceof EntityMockReferencedObjectAttribute) {
+			emroa = object
+		}
+		if (object instanceof EntityMockAttributeByObject) {
+			emroa = object.reference
+		}
+		var mockObject = emroa.template.object
+		if (!emroa.embedded.isEmpty) {
+			mockObject = emroa.embedded.last.object
+		}
+		if (mockObject !== null) {
+			for (enumeration : mockObject.enumerations) {
+				result.add(
+					EObjectDescription.create((enumeration as EntityMockObjectEnum).name,
+						(enumeration as EntityMockObjectEnum)))
+			}
+			for (attribute : mockObject.attributes) {
+				if (attribute instanceof EntityMockObjectEmbed) {
+					// getScope_MockObjectAttribute(prefix+(attribute as IEntityMockObjectAttribute).name+"_", attribute.object, result)
+				} else {
+					result.add(
+						EObjectDescription.create((attribute as IEntityMockObjectAttribute).name,
+							(attribute as IEntityMockObjectAttribute)))
+				}
+			}
+			for (calculation : mockObject.calculations) {
+				result.add(
+					EObjectDescription.create((calculation as EntityMockObjectFunction).name,
+						(calculation as EntityMockObjectFunction)))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	/**
+	 * get all available enumerations of a mock object and add them as an IScope
+	 */
 	def IScope getScope_MockObjectEnum(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var mockObject = object.eContainer
-        if  (mockObject instanceof EntityMockObject) {
-            for (objectEnum : mockObject.enumerations) {
-                result.add(EObjectDescription.create((objectEnum as EntityMockObjectEnum).name, (objectEnum as EntityMockObjectEnum)))
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+		var result = <IEObjectDescription>newArrayList
+		var mockObject = object.eContainer
+		if (mockObject instanceof EntityMockObject) {
+			for (objectEnum : mockObject.enumerations) {
+				result.add(
+					EObjectDescription.create((objectEnum as EntityMockObjectEnum).name,
+						(objectEnum as EntityMockObjectEnum)))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
 	}
-    
-    /**
-     * get all available enumeration values of a mock object enumeration and add them as an IScope
-     */ 
-    def IScope getScope_MockObjectEnumValue(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var mockValueItem = object
-        while (!(mockValueItem instanceof EntityMockObjectArrayValue) && (mockValueItem != null)) {
-            mockValueItem = mockValueItem.eContainer
-        }
-        if  (mockValueItem instanceof EntityMockObjectArrayValue) {
-        	if	(mockValueItem.enumeration.usingResource instanceof EntityMockResource) {
-    			val resource = mockValueItem.enumeration.usingResource as EntityMockResource
-        		for (datarow : resource.datarows) {
-            		result.add(EObjectDescription.create((datarow as EntityMockResourceDataRow).name, (datarow as EntityMockResourceDataRow)))
-        		}
-    		}
-    		else {
-    			val lenum = mockValueItem.enumeration.usingResource
-        		for (datarow : lenum.literals) {
-            		result.add(EObjectDescription.create(datarow.name, datarow))
-        		}
-        	}
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available mocked entities fitting the referencing entity attribute and add them as an IScope
-     */ 
-    def IScope getScope_MockAttributeReferencedMockedEntity(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var attributeByReference = null as EntityMockAttributeByReference
-        if  (object instanceof EntityMockAttributeByReference) {
-            attributeByReference = object
-        }
-        if  (attributeByReference != null) {
-            var requested_entityRef = attributeByReference.attributeRef.type
-            if	(requested_entityRef != null) {
-	            var mockEntities = object.eContainer
-            	while (!(mockEntities instanceof EntityMockEntities) && (mockEntities !=null)) {
-                	mockEntities = mockEntities.eContainer
-	            }
-    	        if  (mockEntities instanceof EntityMockEntities) {
-        	        for (mockEntity : mockEntities.entities) {
-            	        if  (requested_entityRef.equals(mockEntity.entityRef)) {
-                	        result.add(EObjectDescription.create((mockEntity as EntityMockEntity).name, (mockEntity as EntityMockEntity)))
-                    	}
-	                }
-    	        }
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available enumeration values of a mock object enumeration and add them as an IScope
-     */ 
-    def IScope getScope_MockAttributeResourceAttribute(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var objectResourceValue = object
-        while (!(objectResourceValue instanceof EntityMockObjectResourceValue) && (objectResourceValue != null)) {
-            objectResourceValue = objectResourceValue.eContainer
-        }
-        if  (objectResourceValue instanceof EntityMockObjectResourceValue) {
-        	if	(objectResourceValue.resourceEnum.usingResource instanceof EntityMockResource) {
-    			val resource = objectResourceValue.resourceEnum.usingResource as EntityMockResource
-        		for (attribute : resource.attributes) {
-	                result.add(EObjectDescription.create((attribute as EntityMockResourceAttribute).name, (attribute as EntityMockResourceAttribute)))
-        		}
-    		}
-    		else {
-    			val lenum = objectResourceValue.resourceEnum.usingResource
-                result.add(EObjectDescription.create("name", lenum))
-        	}
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
-    
-    /**
-     * get all available enumeration values of a mock object enumeration and add them as an IScope
-     */ 
-    def IScope getScope_MockEntityResourceAttribute(EObject object) {
-        var result = <IEObjectDescription>newArrayList
-        var mockEntity = object
-        while (!(mockEntity instanceof EntityMockEntity) && (mockEntity != null)) {
-            mockEntity = mockEntity.eContainer
-        }
-        if  (mockEntity instanceof EntityMockEntity) {
-            for (attribute : mockEntity.byResource.attributes) {
-                result.add(EObjectDescription.create((attribute as EntityMockResourceAttribute).name, (attribute as EntityMockResourceAttribute)))
-            }
-        }
-        return MapBasedScope.createScope(IScope.NULLSCOPE, result)
-    }
+
+	/**
+	 * get all available enumeration values of a mock object enumeration and add them as an IScope
+	 */
+	def IScope getScope_MockObjectEnumValue(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var mockValueItem = object
+		while (!(mockValueItem instanceof EntityMockObjectArrayValue) && (mockValueItem !== null)) {
+			mockValueItem = mockValueItem.eContainer
+		}
+		if (mockValueItem instanceof EntityMockObjectArrayValue) {
+			if (mockValueItem.enumeration.usingResource instanceof EntityMockResource) {
+				val resource = mockValueItem.enumeration.usingResource as EntityMockResource
+				for (datarow : resource.datarows) {
+					result.add(
+						EObjectDescription.create((datarow as EntityMockResourceDataRow).name,
+							(datarow as EntityMockResourceDataRow)))
+				}
+			} else {
+				val lenum = mockValueItem.enumeration.usingResource
+				for (datarow : lenum.literals) {
+					result.add(EObjectDescription.create(datarow.name, datarow))
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	/**
+	 * get all available mocked entities fitting the referencing entity attribute and add them as an IScope
+	 */
+	def IScope getScope_MockAttributeReferencedMockedEntity(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var attributeByReference = null as EntityMockAttributeByReference
+		if (object instanceof EntityMockAttributeByReference) {
+			attributeByReference = object
+		}
+		if (attributeByReference !== null) {
+			var requested_entityRef = attributeByReference.attributeRef.type
+			if (requested_entityRef !== null) {
+				var mockEntities = object.eContainer
+				while (!(mockEntities instanceof EntityMockEntities) && (mockEntities != null)) {
+					mockEntities = mockEntities.eContainer
+				}
+				if (mockEntities instanceof EntityMockEntities) {
+					for (mockEntity : mockEntities.entities) {
+						if (requested_entityRef.equals(mockEntity.entityRef)) {
+							result.add(
+								EObjectDescription.create((mockEntity as EntityMockEntity).name,
+									(mockEntity as EntityMockEntity)))
+						}
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	/**
+	 * get all available enumeration values of a mock object enumeration and add them as an IScope
+	 */
+	def IScope getScope_MockAttributeResourceAttribute(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var objectResourceValue = object
+		while (!(objectResourceValue instanceof EntityMockObjectResourceValue) && (objectResourceValue !== null)) {
+			objectResourceValue = objectResourceValue.eContainer
+		}
+		if (objectResourceValue instanceof EntityMockObjectResourceValue) {
+			if (objectResourceValue.resourceEnum.usingResource instanceof EntityMockResource) {
+				val resource = objectResourceValue.resourceEnum.usingResource as EntityMockResource
+				for (attribute : resource.attributes) {
+					result.add(
+						EObjectDescription.create((attribute as EntityMockResourceAttribute).name,
+							(attribute as EntityMockResourceAttribute)))
+				}
+			} else {
+				val lenum = objectResourceValue.resourceEnum.usingResource
+				result.add(EObjectDescription.create("name", lenum))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+
+	/**
+	 * get all available enumeration values of a mock object enumeration and add them as an IScope
+	 */
+	def IScope getScope_MockEntityResourceAttribute(EObject object) {
+		var result = <IEObjectDescription>newArrayList
+		var mockEntity = object
+		while (!(mockEntity instanceof EntityMockEntity) && (mockEntity !== null)) {
+			mockEntity = mockEntity.eContainer
+		}
+		if (mockEntity instanceof EntityMockEntity) {
+			for (attribute : mockEntity.byResource.attributes) {
+				result.add(
+					EObjectDescription.create((attribute as EntityMockResourceAttribute).name,
+						(attribute as EntityMockResourceAttribute)))
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.xtend
index ac512aa..27afa51 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.xtend
@@ -16,7 +16,12 @@
  */
  
 package org.eclipse.osbp.xtext.entitymock.validation
-//import org.eclipse.xtext.validation.Check
+
+import org.eclipse.emf.common.util.EList
+import org.eclipse.osbp.xtext.entitymock.EntityMock
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage
+import org.eclipse.osbp.xtext.entitymock.EntityMockPackage
+import org.eclipse.xtext.validation.Check
 
 /**
  * Custom validation rules. 
@@ -25,14 +30,28 @@
  */
 class EntityMockDSLValidator extends AbstractEntityMockDSLValidator {
 
-//  public static val INVALID_NAME = 'invalidName'
-//
-//	@Check
-//	def checkGreetingStartsWithCapital(Greeting greeting) {
-//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
-//			warning('Name should start with a capital', 
-//					MyDslPackage.Literals.GREETING__NAME,
-//					INVALID_NAME)
-//		}
-//	}
+	@Check
+	def void checkDuplicateElementId(EntityMock mock){ 
+		var eObj = mock.eContainer()
+		while (!(eObj instanceof EntityMockPackage)) {
+			eObj = eObj.eContainer
+		}
+		if (eObj!==null){
+			var mockPackage = eObj as EntityMockPackage;
+			if (findDuplicateChartNames(mockPackage.mocks, mock.getName()) !== null){
+				error("Duplicate name '".concat(mock.getName()).concat("'!"), EntityMockDSLPackage.Literals.ENTITY_MOCK__NAME)
+			}
+		}
+	}
+		
+	def private EntityMock findDuplicateChartNames(
+			EList<EntityMock> mocks, String mockName) {
+		var tempSet = <String>newHashSet()
+		for (EntityMock mock : mocks){
+		   if (!tempSet.add(mock.name) && (mock.name.equals(mockName))){
+			   return mock
+		   }
+		}
+		return null
+	}
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/valueconverter/EntityMockQualifiedNameProvider.java b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/valueconverter/EntityMockQualifiedNameProvider.java
index c99c71a..2cdf228 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/valueconverter/EntityMockQualifiedNameProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/valueconverter/EntityMockQualifiedNameProvider.java
@@ -76,14 +76,14 @@
 		return fqn;
 	}
 
-	// this method evaluates the cross referenced name of an object without causing cyclic lazy linking errors
-	private String getCrossReferenceName(EObject obj, EStructuralFeature feature) {
-		List<INode> nodes = NodeModelUtils.findNodesForFeature(obj, feature);
-		if (nodes.size() == 0) {
-			return null;
-		}
-		return NodeModelUtils.getTokenText(nodes.get(0));
-	}
+//	// this method evaluates the cross referenced name of an object without causing cyclic lazy linking errors
+//	private String getCrossReferenceName(EObject obj, EStructuralFeature feature) {
+//		List<INode> nodes = NodeModelUtils.findNodesForFeature(obj, feature);
+//		if (nodes.size() == 0) {
+//			return null;
+//		}
+//		return NodeModelUtils.getTokenText(nodes.get(0));
+//	}
 
 //	private String getPackageName(EObject obj) {
 //		EObject o = obj.eContainer();
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/.gitignore
new file mode 100644
index 0000000..bbaf8e8
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/.gitignore
@@ -0,0 +1,5 @@
+/.EntityMockDSLFormatter.xtendbin
+/.EntityMockDSLJvmModelInferrer.xtendbin
+/.EntityMockDSLScopeProvider.xtendbin
+/.EntityMockDSLValidator.xtendbin
+/.EntityMockDslGenerator.xtendbin
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/.gitignore
new file mode 100644
index 0000000..2911724
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLFormatter.java
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.java
index 0a2fd9f..7cd1a85 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/formatting/EntityMockDSLFormatter.java
@@ -15,14 +15,13 @@
 package org.eclipse.osbp.xtext.entitymock.formatting;
 
 import com.google.inject.Inject;
-import org.eclipse.osbp.utils.xtext.GenericFormatter;
+import org.eclipse.osbp.xtext.oxtype.formatting.GenericFormatter;
+import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
 import org.eclipse.xtext.AbstractRule;
-import org.eclipse.xtext.Grammar;
 import org.eclipse.xtext.GrammarUtil;
 import org.eclipse.xtext.ParserRule;
 import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
 import org.eclipse.xtext.formatting.impl.FormattingConfig;
-import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;
 
 /**
  * This class contains custom formatting description.
@@ -35,20 +34,16 @@
 @SuppressWarnings("all")
 public class EntityMockDSLFormatter extends AbstractDeclarativeFormatter {
   @Inject
-  private XtypeGrammarAccess grammarAccess;
+  private OXtypeGrammarAccess grammarAccess;
   
+  @Override
   protected void configureFormatting(final FormattingConfig c) {
     final GenericFormatter genericFormatter = new GenericFormatter();
-    Grammar _grammar = this.grammar.getGrammar();
-    AbstractRule _findRuleForName = GrammarUtil.findRuleForName(_grammar, "EntityModelImport");
+    AbstractRule _findRuleForName = GrammarUtil.findRuleForName(this.grammar.getGrammar(), "EntityModelImport");
     ParserRule importDef = ((ParserRule) _findRuleForName);
-    Grammar _grammar_1 = this.grammar.getGrammar();
-    AbstractRule _findRuleForName_1 = GrammarUtil.findRuleForName(_grammar_1, "EntityMockResourceAttribute");
+    AbstractRule _findRuleForName_1 = GrammarUtil.findRuleForName(this.grammar.getGrammar(), "EntityMockResourceAttribute");
     ParserRule resourceAttr = ((ParserRule) _findRuleForName_1);
-    FormattingConfig.NoLinewrapLocator _setNoLinewrap = c.setNoLinewrap();
-    _setNoLinewrap.around(importDef);
-    FormattingConfig.NoLinewrapLocator _setNoLinewrap_1 = c.setNoLinewrap();
-    _setNoLinewrap_1.around(resourceAttr);
+    c.setNoLinewrap().around(resourceAttr);
     genericFormatter.genericFormatting(c, this.grammar, this.grammarAccess);
   }
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/.gitignore
new file mode 100644
index 0000000..2905b2d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/.gitignore
@@ -0,0 +1 @@
+/EntityMockDslGenerator.java
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.java
index 3e9a23d..dade116 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/generator/EntityMockDslGenerator.java
@@ -16,32 +16,34 @@
 
 import com.google.inject.Inject;
 import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
-import org.eclipse.emf.common.util.EList;
+import java.util.Properties;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.osbp.utils.blob.component.BlobTypingAPI;
-import org.eclipse.osbp.utils.blob.component.BlobUpload;
-import org.eclipse.osbp.utils.entitymock.ABaseMockEntity;
-import org.eclipse.osbp.utils.entitymock.ABaseMockObject;
-import org.eclipse.osbp.utils.entitymock.ABaseMockResource;
-import org.eclipse.osbp.utils.entitymock.AEntityMockDataGenerator;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataDbFiller;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator;
-import org.eclipse.osbp.utils.entitymock.Iterators;
-import org.eclipse.osbp.utils.entitymock.MockedEntityDto;
+import org.eclipse.osbp.blob.service.BlobService;
+import org.eclipse.osbp.blob.service.BlobTypingAPI;
+import org.eclipse.osbp.preferences.ProductConfiguration;
+import org.eclipse.osbp.ui.api.customfields.IBlobService;
 import org.eclipse.osbp.xtext.addons.AdvancedJvmModelGenerator;
 import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils;
-import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
-import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
-import org.eclipse.osbp.xtext.entitymock.jvmmodel.EntityMockDSLJvmModelInferrer;
-import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource;
+import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator;
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller;
+import org.eclipse.osbp.xtext.entitymock.common.Iterators;
+import org.eclipse.osbp.xtext.entitymock.common.MockedEntityDto;
 import org.eclipse.xtext.generator.IFileSystemAccess;
 import org.eclipse.xtext.xbase.compiler.GeneratorConfig;
 import org.eclipse.xtext.xbase.compiler.ImportManager;
@@ -56,72 +58,20 @@
   @Extension
   private BasicDslGeneratorUtils _basicDslGeneratorUtils;
   
+  @Override
   public void doGenerate(final Resource input, final IFileSystemAccess fsa) {
-    EList<EObject> _contents = input.getContents();
-    EObject _get = _contents.get(0);
-    final EntityMockModel model = ((EntityMockModel) _get);
-    EList<EntityMockPackage> _packages = model.getPackages();
-    for (final EntityMockPackage pckg : _packages) {
-      this.generateOsgiInf(pckg, fsa);
-    }
     super.doGenerate(input, fsa);
   }
   
   /**
-   * Generate an OSGI INF xml file defining the generated Entity Mock Data Generator via Declarative Service
-   * @param pckg the package defining the generator
-   * @param fsa file system access
-   */
-  public void generateOsgiInf(final EntityMockPackage pckg, final IFileSystemAccess fsa) {
-    StringConcatenation _builder = new StringConcatenation();
-    String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-    _builder.append(_entityMockName, "");
-    _builder.append(".");
-    _builder.append(EntityMockDSLJvmModelInferrer.ENTITY_MOCK_GENERATOR, "");
-    final String generatorName = _builder.toString();
-    StringConcatenation _builder_1 = new StringConcatenation();
-    _builder_1.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-    _builder_1.newLine();
-    _builder_1.append("<scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" immediate=\"true\" name=\"");
-    _builder_1.append(generatorName, "");
-    _builder_1.append("\">");
-    _builder_1.newLineIfNotEmpty();
-    _builder_1.append("   ");
-    _builder_1.append("<implementation class=\"");
-    _builder_1.append(generatorName, "   ");
-    _builder_1.append("\"/>");
-    _builder_1.newLineIfNotEmpty();
-    _builder_1.append("   ");
-    _builder_1.append("<service>");
-    _builder_1.newLine();
-    _builder_1.append("      ");
-    _builder_1.append("<provide interface=\"");
-    String _canonicalName = IEntityMockDataGenerator.class.getCanonicalName();
-    _builder_1.append(_canonicalName, "      ");
-    _builder_1.append("\"/>");
-    _builder_1.newLineIfNotEmpty();
-    _builder_1.append("   ");
-    _builder_1.append("</service>");
-    _builder_1.newLine();
-    _builder_1.append("</scr:component>");
-    _builder_1.newLine();
-    String str = _builder_1.toString();
-    StringConcatenation _builder_2 = new StringConcatenation();
-    _builder_2.append("../OSGI-INF/");
-    _builder_2.append(generatorName, "");
-    _builder_2.append(".xml");
-    fsa.generateFile(_builder_2.toString(), str);
-  }
-  
-  /**
    * add all relevant Java import statements for necessary classes
    */
+  @Override
   public TreeAppendable createAppendable(final EObject context, final ImportManager importManager, final GeneratorConfig config) {
     TreeAppendable _xblockexpression = null;
     {
-      Resource _eResource = context.eResource();
-      this.setBuilder(_eResource);
-      this._basicDslGeneratorUtils.addImportFor(this, importManager, this._typeReferenceBuilder, Iterator.class, Iterators.DateIterator.class, Iterators.IntegerIterator.class, ABaseMockEntity.class, ABaseMockObject.class, ABaseMockResource.class, AEntityMockDataGenerator.class, MockedEntityDto.class, Date.class, ArrayList.class, HashMap.class, LinkedHashMap.class, List.class, BlobTypingAPI.class, BlobUpload.class, InputStream.class, BufferedInputStream.class, Logger.class, LoggerFactory.class, IEntityMockDataDbFiller.class);
+      this.setBuilder(context.eResource());
+      this._basicDslGeneratorUtils.addImportFor(this, importManager, this._typeReferenceBuilder, Iterator.class, Iterators.DateIterator.class, Iterators.IntegerIterator.class, ABaseMockEntity.class, ABaseMockObject.class, ABaseMockResource.class, AEntityMockDataGenerator.class, MockedEntityDto.class, Date.class, ArrayList.class, HashMap.class, LinkedHashMap.class, List.class, BlobTypingAPI.class, BlobService.class, InputStream.class, BufferedInputStream.class, Logger.class, LoggerFactory.class, IEntityMockDataDbFiller.class, IOException.class, File.class, FileInputStream.class, Properties.class, ProductConfiguration.class, PrintWriter.class, StringWriter.class, IBlobService.class);
       _xblockexpression = super.createAppendable(context, importManager, config);
     }
     return _xblockexpression;
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/.gitignore
new file mode 100644
index 0000000..7c9bfda
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLJvmModelInferrer.java
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
index cd807b7..e027e80 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
@@ -14,7 +14,6 @@
  */
 package org.eclipse.osbp.xtext.entitymock.jvmmodel;
 
-import com.google.common.base.Objects;
 import com.google.inject.Inject;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -27,28 +26,25 @@
 import org.apache.commons.lang.WordUtils;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.core.api.persistence.IPersistenceService;
+import org.eclipse.osbp.datainterchange.api.IDataInterchange;
+import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
-import org.eclipse.osbp.dsl.semantic.common.types.LImport;
 import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
 import org.eclipse.osbp.dsl.semantic.entity.LBean;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
-import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
-import org.eclipse.osbp.persistence.IPersistenceService;
+import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
+import org.eclipse.osbp.ui.api.customfields.IBlobService;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
+import org.eclipse.osbp.utils.annotation.CommonUtils;
 import org.eclipse.osbp.utils.common.EntityUtils;
 import org.eclipse.osbp.utils.entityhelper.DataType;
-import org.eclipse.osbp.utils.entitymock.ABaseMockEntity;
-import org.eclipse.osbp.utils.entitymock.ABaseMockObject;
-import org.eclipse.osbp.utils.entitymock.ABaseMockResource;
-import org.eclipse.osbp.utils.entitymock.AEntityMockDataGenerator;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataDbFiller;
-import org.eclipse.osbp.utils.entitymock.IEntityMockDataGenerator;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
 import org.eclipse.osbp.xtext.datainterchange.jvmmodel.DataDSLJvmModelInferrer;
 import org.eclipse.osbp.xtext.entitymock.DateIterate;
 import org.eclipse.osbp.xtext.entitymock.EDateStepType;
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
@@ -57,7 +53,6 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
-import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed;
@@ -70,12 +65,11 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjects;
 import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
-import org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
+import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable;
@@ -100,10 +94,15 @@
 import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange;
 import org.eclipse.osbp.xtext.entitymock.RunningDataInterchange;
 import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject;
+import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource;
+import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator;
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller;
+import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataGenerator;
 import org.eclipse.xtend2.lib.StringConcatenation;
 import org.eclipse.xtext.common.types.JvmAnnotationReference;
 import org.eclipse.xtext.common.types.JvmConstructor;
-import org.eclipse.xtext.common.types.JvmDeclaredType;
 import org.eclipse.xtext.common.types.JvmEnumerationType;
 import org.eclipse.xtext.common.types.JvmField;
 import org.eclipse.xtext.common.types.JvmFormalParameter;
@@ -113,7 +112,7 @@
 import org.eclipse.xtext.common.types.JvmType;
 import org.eclipse.xtext.common.types.JvmTypeReference;
 import org.eclipse.xtext.common.types.JvmVisibility;
-import org.eclipse.xtext.xbase.XExpression;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
 import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer;
 import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
@@ -122,6 +121,7 @@
 import org.eclipse.xtext.xbase.lib.Extension;
 import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
 import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 
 /**
@@ -130,7 +130,7 @@
  * <p>The JVM model should contain all elements that would appear in the Java code
  * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>
  */
-@SuppressWarnings("all")
+@SuppressWarnings("restriction")
 public class EntityMockDSLJvmModelInferrer extends AbstractModelInferrer {
   /**
    * convenience API to build and initialize JVM types and their members.
@@ -145,132 +145,222 @@
   
   @Inject
   @Extension
+  private IQualifiedNameProvider _iQualifiedNameProvider;
+  
+  @Inject
+  @Extension
   private EntityUtils _entityUtils;
   
   @Inject
+  private ModelExtensions entityExtensions;
+  
+  @Inject
+  @Extension
+  private CommonUtils _commonUtils;
+  
+  @Inject
   private DataType dtType;
   
   /**
-   * get the full qualified package name for the imported entities, removing the trailing
+   * The dispatch method {@code infer} is called for each instance of the
+   * given element's type that is contained in a resource.
    */
-  public static String getEntityPackageName(final EntityMockPackage pckg) {
-    String pckgName = "";
-    EList<LImport> _imports = pckg.getImports();
-    for (final LImport import_ : _imports) {
-      boolean _isEmpty = pckgName.isEmpty();
-      if (_isEmpty) {
-        StringConcatenation _builder = new StringConcatenation();
-        String _importedNamespace = import_.getImportedNamespace();
-        _builder.append(_importedNamespace, "");
-        String _string = _builder.toString();
-        pckgName = _string;
-        String _replace = pckgName.replace(".*", "");
-        pckgName = _replace;
+  protected void _infer(final EntityMock mock, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
+    EntityMockResources _resources = mock.getResources();
+    EList<EntityMockResource> _resources_1 = null;
+    if (_resources!=null) {
+      _resources_1=_resources.getResources();
+    }
+    if (_resources_1!=null) {
+      final Consumer<EntityMockResource> _function = (EntityMockResource mockResource) -> {
+        try {
+          this.generateMockResource(mock, acceptor, mockResource);
+        } catch (final Throwable _t) {
+          if (_t instanceof Exception) {
+            final Exception e = (Exception)_t;
+            e.printStackTrace();
+          } else {
+            throw Exceptions.sneakyThrow(_t);
+          }
+        }
+      };
+      _resources_1.forEach(_function);
+    }
+    EntityMockObjects _objects = mock.getObjects();
+    EList<EntityMockObject> _objects_1 = null;
+    if (_objects!=null) {
+      _objects_1=_objects.getObjects();
+    }
+    if (_objects_1!=null) {
+      final Consumer<EntityMockObject> _function_1 = (EntityMockObject mockObject) -> {
+        try {
+          this.generateMockObject(mock, acceptor, mockObject);
+        } catch (final Throwable _t) {
+          if (_t instanceof Exception) {
+            final Exception e = (Exception)_t;
+            e.printStackTrace();
+          } else {
+            throw Exceptions.sneakyThrow(_t);
+          }
+        }
+      };
+      _objects_1.forEach(_function_1);
+    }
+    EntityMockEntities _entities = mock.getEntities();
+    EList<EntityMockEntity> _entities_1 = null;
+    if (_entities!=null) {
+      _entities_1=_entities.getEntities();
+    }
+    if (_entities_1!=null) {
+      final Consumer<EntityMockEntity> _function_2 = (EntityMockEntity mockEntity) -> {
+        try {
+          this.generateMockEntity(mock, acceptor, mockEntity);
+        } catch (final Throwable _t) {
+          if (_t instanceof Exception) {
+            final Exception e = (Exception)_t;
+            e.printStackTrace();
+          } else {
+            throw Exceptions.sneakyThrow(_t);
+          }
+        }
+      };
+      _entities_1.forEach(_function_2);
+    }
+    try {
+      this.generateMockDataGenerator(mock, acceptor);
+    } catch (final Throwable _t) {
+      if (_t instanceof Exception) {
+        final Exception e = (Exception)_t;
+        e.printStackTrace();
+      } else {
+        throw Exceptions.sneakyThrow(_t);
       }
     }
-    return pckgName;
   }
   
   /**
    * generate the full qualified mock package name corresponding to the imported entities
    */
-  public static String getEntityMockName(final EntityMockPackage pckg) {
+  public String entityMockName(final EntityMock mock) {
     StringConcatenation _builder = new StringConcatenation();
-    String _entityPackageName = EntityMockDSLJvmModelInferrer.getEntityPackageName(pckg);
-    _builder.append(_entityPackageName, "");
-    _builder.append("mock");
+    EObject _eContainer = mock.eContainer();
+    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
+    _builder.append(_string);
+    _builder.append(".");
+    String _name = mock.getName();
+    _builder.append(_name);
+    _builder.append("Mock");
     return _builder.toString();
   }
   
   /**
-   * generate the class name for a temporary mock object
+   * generate the class name for a template mock object
    */
-  public String getEntityMockName(final EntityMockTemporary temporary) {
-    EntityMockObject _object = temporary.getObject();
-    return this.getEntityMockName(((EntityMockObject) _object));
+  public String entityMockName(final EntityMockTemplate template, final EntityMock mock) {
+    EntityMockObject _object = template.getObject();
+    return this.entityMockName(((EntityMockObject) _object), mock);
   }
   
   /**
    * generate the class name for a mock resource class
    */
-  public String getEntityMockName(final EntityMockResource resource) {
+  public String entityMockName(final EntityMockResource resource, final EntityMock mock) {
     StringConcatenation _builder = new StringConcatenation();
+    EObject _eContainer = mock.eContainer();
+    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
+    _builder.append(_string);
+    _builder.append(".");
+    String _name = mock.getName();
+    _builder.append(_name);
     _builder.append("Resource");
-    String _name = resource.getName();
-    String _capitalize = WordUtils.capitalize(_name);
-    _builder.append(_capitalize, "");
+    String _capitalize = WordUtils.capitalize(resource.getName());
+    _builder.append(_capitalize);
     return _builder.toString();
   }
   
   /**
    * generate the class name for a mock object class
    */
-  public String getEntityMockName(final EntityMockObject object) {
+  public String entityMockName(final EntityMockObject object, final EntityMock mock) {
     StringConcatenation _builder = new StringConcatenation();
+    EObject _eContainer = mock.eContainer();
+    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
+    _builder.append(_string);
+    _builder.append(".");
+    String _name = mock.getName();
+    _builder.append(_name);
     _builder.append("Object");
-    String _name = object.getName();
-    String _capitalize = WordUtils.capitalize(_name);
-    _builder.append(_capitalize, "");
+    String _capitalize = WordUtils.capitalize(object.getName());
+    _builder.append(_capitalize);
     return _builder.toString();
   }
   
   /**
    * generate the class name for a mock entity
    */
-  public String getEntityMockName(final EntityMockEntity entity) {
+  public String entityMockName(final EntityMockEntity entity, final EntityMock mock) {
     StringConcatenation _builder = new StringConcatenation();
+    EObject _eContainer = mock.eContainer();
+    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
+    _builder.append(_string);
+    _builder.append(".");
+    String _name = mock.getName();
+    _builder.append(_name);
     _builder.append("Entity");
-    String _name = entity.getName();
-    String _capitalize = WordUtils.capitalize(_name);
-    _builder.append(_capitalize, "");
+    String _capitalize = WordUtils.capitalize(entity.getName());
+    _builder.append(_capitalize);
     return _builder.toString();
   }
   
   /**
    * get the entity name referenced by a mock entity
    */
-  public String getEntityName(final EntityMockEntity entity) {
-    LEntity _entityRef = entity.getEntityRef();
-    return this.getEntityName(_entityRef);
+  public String entityName(final EntityMockEntity entity) {
+    return this.entityName(entity.getEntityRef());
   }
   
   /**
    * get the entity name
    */
-  public String getEntityName(final LEntity entity) {
+  public String entityName(final LEntity entity) {
     return entity.getName();
   }
   
   /**
    * get the entity name
    */
-  public String getEnumName(final LEnum lenum) {
+  public String enumName(final LEnum lenum) {
     return lenum.getName();
   }
   
   /**
    * get the full qualified entity name referenced by a mock entity
    */
-  public String getEntityDtoFQN(final EntityMockEntity entity) {
-    LEntity _entityRef = entity.getEntityRef();
-    return EntityUtils.getDtoFQNForLEntity(_entityRef);
+  public String entityFQN(final EntityMockEntity entity) {
+    return EntityUtils.getFQNForLEntity(entity.getEntityRef());
   }
   
   /**
-   * get the full qualified entity class name referenced by a mock entity
+   * get the full qualified dto name referenced by a mock entity
    */
-  public String getEntityDtoFQNClass(final EntityMockEntity entity) {
-    LEntity _entityRef = entity.getEntityRef();
-    return this.getEntityDtoFQNClass(_entityRef);
+  public String entityDtoFQN(final EntityMockEntity entity) {
+    return EntityUtils.getDtoFQNForLEntity(entity.getEntityRef());
+  }
+  
+  /**
+   * get the full qualified dto class name referenced by a mock entity
+   */
+  public String entityDtoFQNClass(final EntityMockEntity entity) {
+    return this.entityDtoFQNClass(entity.getEntityRef());
   }
   
   /**
    * get the full qualified entity class name
    */
-  public String getEntityDtoFQNClass(final LEntity entity) {
+  public String entityDtoFQNClass(final LEntity entity) {
     StringConcatenation _builder = new StringConcatenation();
     String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(entity);
-    _builder.append(_dtoFQNForLEntity, "");
+    _builder.append(_dtoFQNForLEntity);
     _builder.append(".class");
     return _builder.toString();
   }
@@ -278,1152 +368,1009 @@
   /**
    * generate a mock object class
    */
-  public void generateMockObject(final EntityMockModel model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockPackage pckg, final EntityMockObject mockObject) {
-    StringConcatenation _builder = new StringConcatenation();
-    String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-    _builder.append(_entityMockName, "");
-    _builder.append(".");
-    String _entityMockName_1 = this.getEntityMockName(mockObject);
-    _builder.append(_entityMockName_1, "");
-    JvmGenericType _class = this._jvmTypesBuilder.toClass(model, _builder.toString());
-    final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
-      public void apply(final JvmGenericType it) {
-        EList<JvmTypeReference> _superTypes = it.getSuperTypes();
-        JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockObject.class);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
-        StringConcatenation _builder = new StringConcatenation();
-        _builder.append("<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>");
-        _builder.newLine();
-        String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(mockObject);
-        _builder.append(_documentation, "");
-        _builder.newLineIfNotEmpty();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _builder.toString());
-        it.setFinal(true);
-        JvmField field = null;
-        JvmTypeReference _typeRef_1 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Logger.class);
-        final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
-          public void apply(final JvmField it) {
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("LoggerFactory.getLogger(");
-                String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-                _builder.append(_entityMockName, "");
-                _builder.append(".");
-                String _entityMockName_1 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockObject);
-                _builder.append(_entityMockName_1, "");
-                _builder.append(".class)");
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-          }
+  public void generateMockObject(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockObject mockObject) {
+    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockObject, model));
+    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
+      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
+      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockObject.class);
+      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
+      JvmField field = null;
+      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
+        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("LoggerFactory.getLogger(\"mock\")");
+          it_2.append(_builder);
         };
-        JvmField _field = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(model, "log", _typeRef_1, _function);
-        field = _field;
-        field.setFinal(true);
-        field.setStatic(true);
-        EList<JvmMember> _members = it.getMembers();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
-        EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
-        for (final EntityMockObjectEnum enumeration : _enumerations) {
-          LEnum _usingResource = enumeration.getUsingResource();
-          if ((_usingResource instanceof EntityMockResource)) {
-            LEnum _usingResource_1 = enumeration.getUsingResource();
-            final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
-            EList<JvmMember> _members_1 = it.getMembers();
-            StringConcatenation _builder_1 = new StringConcatenation();
-            String _name = enumeration.getName();
-            _builder_1.append(_name, "");
-            _builder_1.append("_resource");
-            JvmTypeReference _typeRef_2 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockResource.class);
-            final Procedure1<JvmField> _function_1 = new Procedure1<JvmField>() {
-              public void apply(final JvmField it) {
-                final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                  public void apply(final ITreeAppendable it) {
-                    StringConcatenation _builder = new StringConcatenation();
-                    _builder.append("new ");
-                    String _entityMockName = EntityMockDSLJvmModelInferrer.this.getEntityMockName(resource);
-                    _builder.append(_entityMockName, "");
-                    _builder.append("()");
-                    it.append(_builder);
-                  }
-                };
-                EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(enumeration);
-                EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                it.setVisibility(JvmVisibility.PRIVATE);
-                it.setStatic(true);
-              }
+        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
+      };
+      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
+      field.setStatic(true);
+      EList<JvmMember> _members = it.getMembers();
+      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+      EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
+      for (final EntityMockObjectEnum enumeration : _enumerations) {
+        LEnum _usingResource = enumeration.getUsingResource();
+        if ((_usingResource instanceof EntityMockResource)) {
+          LEnum _usingResource_1 = enumeration.getUsingResource();
+          final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
+          EList<JvmMember> _members_1 = it.getMembers();
+          StringConcatenation _builder = new StringConcatenation();
+          String _name = enumeration.getName();
+          _builder.append(_name);
+          _builder.append("_resource");
+          final Procedure1<JvmField> _function_2 = (JvmField it_1) -> {
+            final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
+              StringConcatenation _builder_1 = new StringConcatenation();
+              _builder_1.append("new ");
+              String _entityMockName = this.entityMockName(resource, model);
+              _builder_1.append(_entityMockName);
+              _builder_1.append("()");
+              it_2.append(_builder_1);
             };
-            JvmField _field_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_1.toString(), _typeRef_2, _function_1);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field_1);
-          } else {
-          }
+            this._jvmTypesBuilder.setInitializer(it_1, _function_3);
+            this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(enumeration));
+            it_1.setVisibility(JvmVisibility.PRIVATE);
+            it_1.setStatic(true);
+          };
+          JvmField _field = this._jvmTypesBuilder.toField(mockObject, _builder.toString(), 
+            this._typeReferenceBuilder.typeRef(ABaseMockResource.class), _function_2);
+          this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field);
         }
-        EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
-        for (final IEntityMockObjectAttribute attribute : _attributes) {
-          boolean _matched = false;
-          if (!_matched) {
-            if (attribute instanceof EntityMockObjectPlainValue) {
-              _matched=true;
-              final List<String> items = new ArrayList<String>();
-              EList<String> _values = ((EntityMockObjectPlainValue)attribute).getValues();
-              for (final String value : _values) {
-                StringConcatenation _builder_2 = new StringConcatenation();
-                _builder_2.append("\"");
-                _builder_2.append(value, "");
-                _builder_2.append("\"");
-                items.add(_builder_2.toString());
-              }
-              EList<JvmMember> _members_2 = it.getMembers();
-              StringConcatenation _builder_3 = new StringConcatenation();
-              String _name_1 = ((EntityMockObjectPlainValue)attribute).getName();
-              _builder_3.append(_name_1, "");
-              _builder_3.append("_items");
-              JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object[].class);
-              final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                public void apply(final JvmField it) {
-                  final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                    public void apply(final ITreeAppendable it) {
-                      StringConcatenation _builder = new StringConcatenation();
-                      _builder.append("{");
-                      String _join = StringUtils.join(items, ",");
-                      _builder.append(_join, "");
-                      _builder.append("}");
-                      it.append(_builder);
-                    }
-                  };
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                  String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                  it.setVisibility(JvmVisibility.PRIVATE);
-                  it.setStatic(true);
-                }
-              };
-              JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-            }
+      }
+      EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
+      for (final IEntityMockObjectAttribute attribute : _attributes) {
+        boolean _matched = false;
+        if (attribute instanceof EntityMockObjectPlainValue) {
+          _matched=true;
+          final List<String> items = new ArrayList<String>();
+          EList<String> _values = ((EntityMockObjectPlainValue)attribute).getValues();
+          for (final String value : _values) {
+            StringConcatenation _builder_1 = new StringConcatenation();
+            _builder_1.append("\"");
+            _builder_1.append(value);
+            _builder_1.append("\"");
+            items.add(_builder_1.toString());
           }
-          if (!_matched) {
-            if (attribute instanceof EntityMockObjectResourceValue) {
-              _matched=true;
-            }
-          }
-          if (!_matched) {
-            if (attribute instanceof EntityMockObjectArrayValue) {
-              _matched=true;
-              final List<String> enums = new ArrayList<String>();
-              String _xifexpression = null;
-              EntityMockObjectEnum _enumeration = ((EntityMockObjectArrayValue)attribute).getEnumeration();
-              LEnum _usingResource_2 = _enumeration.getUsingResource();
-              if ((_usingResource_2 instanceof EntityMockResource)) {
-                _xifexpression = "String";
-              } else {
-                StringConcatenation _builder_2 = new StringConcatenation();
-                EntityMockObjectEnum _enumeration_1 = ((EntityMockObjectArrayValue)attribute).getEnumeration();
-                LEnum _usingResource_3 = _enumeration_1.getUsingResource();
-                String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(_usingResource_3);
-                _builder_2.append(_dtoFQNForLEnum, "");
-                _xifexpression = _builder_2.toString();
-              }
-              final String keyType = _xifexpression;
-              EList<EntityMockObjectItemValue> _items = ((EntityMockObjectArrayValue)attribute).getItems();
-              for (final EntityMockObjectItemValue enumItem : _items) {
-                {
-                  final List<String> items = new ArrayList<String>();
-                  EList<String> _values = enumItem.getValues();
-                  for (final String value : _values) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append("\"");
-                    _builder_3.append(value, "");
-                    _builder_3.append("\"");
-                    items.add(_builder_3.toString());
-                  }
-                  LEnumLiteral _datarow = enumItem.getDatarow();
-                  if ((_datarow instanceof EntityMockResourceDataRow)) {
-                    StringConcatenation _builder_4 = new StringConcatenation();
-                    _builder_4.append("put(\"");
-                    LEnumLiteral _datarow_1 = enumItem.getDatarow();
-                    String _name_1 = _datarow_1.getName();
-                    _builder_4.append(_name_1, "");
-                    _builder_4.append("\", new Object[] {");
-                    String _join = StringUtils.join(items, ",");
-                    _builder_4.append(_join, "");
-                    _builder_4.append("});");
-                    enums.add(_builder_4.toString());
-                  } else {
-                    StringConcatenation _builder_5 = new StringConcatenation();
-                    _builder_5.append("put(");
-                    _builder_5.append(keyType, "");
-                    _builder_5.append(".");
-                    LEnumLiteral _datarow_2 = enumItem.getDatarow();
-                    String _name_2 = _datarow_2.getName();
-                    _builder_5.append(_name_2, "");
-                    _builder_5.append(", new Object[] {");
-                    String _join_1 = StringUtils.join(items, ",");
-                    _builder_5.append(_join_1, "");
-                    _builder_5.append("});");
-                    enums.add(_builder_5.toString());
-                  }
-                }
-              }
-              EList<JvmMember> _members_2 = it.getMembers();
-              StringConcatenation _builder_3 = new StringConcatenation();
-              String _name_1 = ((EntityMockObjectArrayValue)attribute).getName();
-              _builder_3.append(_name_1, "");
-              _builder_3.append("_items");
-              JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Map.class);
-              final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                public void apply(final JvmField it) {
-                  final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                    public void apply(final ITreeAppendable it) {
-                      StringConcatenation _builder = new StringConcatenation();
-                      _builder.append("new HashMap<");
-                      _builder.append(keyType, "");
-                      _builder.append(", Object[]>() {{");
-                      _builder.newLineIfNotEmpty();
-                      String _join = StringUtils.join(enums, "\r\n");
-                      _builder.append(_join, "");
-                      _builder.newLineIfNotEmpty();
-                      _builder.append("}}");
-                      it.append(_builder);
-                    }
-                  };
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                  String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                  it.setVisibility(JvmVisibility.PRIVATE);
-                  it.setStatic(true);
-                }
-              };
-              JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-            }
-          }
-          if (!_matched) {
-            if (attribute instanceof EntityMockObjectEmbed) {
-              _matched=true;
-            }
-          }
-          if (!_matched) {
-            if (attribute instanceof EntityMockObjectFill) {
-              _matched=true;
-              PropertyFillerType type = ((EntityMockObjectFill)attribute).getFillerType();
-              boolean _matched_1 = false;
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerTextRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
-                  for (final String item : _items) {
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append("\"");
-                    _builder_2.append(item, "");
-                    _builder_2.append("\"");
-                    items.add(_builder_2.toString());
-                  }
-                  EList<JvmMember> _members_2 = it.getMembers();
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                  _builder_3.append(_name_1, "");
-                  _builder_3.append("_items");
-                  JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object[].class);
-                  final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerSignedDoubleRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
-                  for (final Double item : _items) {
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append(item, "");
-                    items.add(_builder_2.toString());
-                  }
-                  EList<JvmMember> _members_2 = it.getMembers();
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                  _builder_3.append(_name_1, "");
-                  _builder_3.append("_items");
-                  JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(double[].class);
-                  final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerUnsignedDoubleRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
-                  for (final Double item : _items) {
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append(item, "");
-                    items.add(_builder_2.toString());
-                  }
-                  EList<JvmMember> _members_2 = it.getMembers();
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                  _builder_3.append(_name_1, "");
-                  _builder_3.append("_items");
-                  JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(double[].class);
-                  final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerSignedIntegerRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
-                  for (final Integer item : _items) {
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append(item, "");
-                    items.add(_builder_2.toString());
-                  }
-                  EList<JvmMember> _members_2 = it.getMembers();
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                  _builder_3.append(_name_1, "");
-                  _builder_3.append("_items");
-                  JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int[].class);
-                  final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerUnsignedIntegerRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
-                  for (final Integer item : _items) {
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append(item, "");
-                    items.add(_builder_2.toString());
-                  }
-                  EList<JvmMember> _members_2 = it.getMembers();
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                  _builder_3.append(_name_1, "");
-                  _builder_3.append("_items");
-                  JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int[].class);
-                  final Procedure1<JvmField> _function_2 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(mockObject, _builder_3.toString(), _typeRef_3, _function_2);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_2);
-                }
-              }
-            }
-          }
-        }
-        EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
-        for (final EntityMockObjectFunction calculation : _calculations) {
           EList<JvmMember> _members_2 = it.getMembers();
           StringConcatenation _builder_2 = new StringConcatenation();
-          _builder_2.append("calculate_");
-          String _name_1 = calculation.getName();
-          _builder_2.append(_name_1, "");
-          JvmTypeReference _oftype = calculation.getOftype();
-          final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
-            public void apply(final JvmOperation it) {
-              it.setVisibility(JvmVisibility.PROTECTED);
-              EList<EntityMockObjectFunctionParameter> _params = calculation.getParams();
+          String _name_1 = ((EntityMockObjectPlainValue)attribute).getName();
+          _builder_2.append(_name_1);
+          _builder_2.append("_items");
+          final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+            final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+              StringConcatenation _builder_3 = new StringConcatenation();
+              _builder_3.append("{");
+              String _join = StringUtils.join(items, ",");
+              _builder_3.append(_join);
+              _builder_3.append("}");
+              it_2.append(_builder_3);
+            };
+            this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+            this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+            it_1.setVisibility(JvmVisibility.PRIVATE);
+            it_1.setStatic(true);
+          };
+          JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+            this._typeReferenceBuilder.typeRef(Object[].class), _function_3);
+          this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockObjectResourceValue) {
+            _matched=true;
+          }
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockObjectArrayValue) {
+            _matched=true;
+            final List<String> enums = new ArrayList<String>();
+            String _xifexpression = null;
+            LEnum _usingResource_2 = ((EntityMockObjectArrayValue)attribute).getEnumeration().getUsingResource();
+            if ((_usingResource_2 instanceof EntityMockResource)) {
+              _xifexpression = "String";
+            } else {
+              StringConcatenation _builder_1 = new StringConcatenation();
+              String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(((EntityMockObjectArrayValue)attribute).getEnumeration().getUsingResource());
+              _builder_1.append(_dtoFQNForLEnum);
+              _xifexpression = _builder_1.toString();
+            }
+            final String keyType = _xifexpression;
+            EList<EntityMockObjectItemValue> _items = ((EntityMockObjectArrayValue)attribute).getItems();
+            for (final EntityMockObjectItemValue enumItem : _items) {
+              {
+                final List<String> items = new ArrayList<String>();
+                EList<String> _values = enumItem.getValues();
+                for (final String value : _values) {
+                  StringConcatenation _builder_2 = new StringConcatenation();
+                  _builder_2.append("\"");
+                  _builder_2.append(value);
+                  _builder_2.append("\"");
+                  items.add(_builder_2.toString());
+                }
+                LEnumLiteral _datarow = enumItem.getDatarow();
+                if ((_datarow instanceof EntityMockResourceDataRow)) {
+                  StringConcatenation _builder_3 = new StringConcatenation();
+                  _builder_3.append("put(\"");
+                  String _name_1 = enumItem.getDatarow().getName();
+                  _builder_3.append(_name_1);
+                  _builder_3.append("\", new Object[] {");
+                  String _join = StringUtils.join(items, ",");
+                  _builder_3.append(_join);
+                  _builder_3.append("});");
+                  enums.add(_builder_3.toString());
+                } else {
+                  StringConcatenation _builder_4 = new StringConcatenation();
+                  _builder_4.append("put(");
+                  _builder_4.append(keyType);
+                  _builder_4.append(".");
+                  String _name_2 = enumItem.getDatarow().getName();
+                  _builder_4.append(_name_2);
+                  _builder_4.append(", new Object[] {");
+                  String _join_1 = StringUtils.join(items, ",");
+                  _builder_4.append(_join_1);
+                  _builder_4.append("});");
+                  enums.add(_builder_4.toString());
+                }
+              }
+            }
+            EList<JvmMember> _members_2 = it.getMembers();
+            StringConcatenation _builder_2 = new StringConcatenation();
+            String _name_1 = ((EntityMockObjectArrayValue)attribute).getName();
+            _builder_2.append(_name_1);
+            _builder_2.append("_items");
+            final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+              final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("new HashMap<");
+                _builder_3.append(keyType);
+                _builder_3.append(", Object[]>() {{");
+                _builder_3.newLineIfNotEmpty();
+                String _join = StringUtils.join(enums, "\r\n");
+                _builder_3.append(_join);
+                _builder_3.newLineIfNotEmpty();
+                _builder_3.append("}}");
+                it_2.append(_builder_3);
+              };
+              this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+              this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+              it_1.setVisibility(JvmVisibility.PRIVATE);
+              it_1.setStatic(true);
+            };
+            JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Map.class), _function_3);
+            this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+          }
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockObjectEmbed) {
+            _matched=true;
+          }
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockObjectFill) {
+            _matched=true;
+            PropertyFillerType type = ((EntityMockObjectFill)attribute).getFillerType();
+            boolean _matched_1 = false;
+            if (type instanceof PropertyFillerTextRandom) {
+              _matched_1=true;
+              final List<String> items = new ArrayList<String>();
+              EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
+              for (final String item : _items) {
+                StringConcatenation _builder_1 = new StringConcatenation();
+                _builder_1.append("\"");
+                _builder_1.append(item);
+                _builder_1.append("\"");
+                items.add(_builder_1.toString());
+              }
+              EList<JvmMember> _members_2 = it.getMembers();
+              StringConcatenation _builder_2 = new StringConcatenation();
+              String _name_1 = ((EntityMockObjectFill)attribute).getName();
+              _builder_2.append(_name_1);
+              _builder_2.append("_items");
+              final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+                final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                  StringConcatenation _builder_3 = new StringConcatenation();
+                  _builder_3.append("{");
+                  String _join = StringUtils.join(items, ",");
+                  _builder_3.append(_join);
+                  _builder_3.append("}");
+                  it_2.append(_builder_3);
+                };
+                this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+                this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                it_1.setVisibility(JvmVisibility.PRIVATE);
+                it_1.setStatic(true);
+              };
+              JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+                this._typeReferenceBuilder.typeRef(Object[].class), _function_3);
+              this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerSignedDoubleRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
+                for (final Double item : _items) {
+                  StringConcatenation _builder_1 = new StringConcatenation();
+                  _builder_1.append(item);
+                  items.add(_builder_1.toString());
+                }
+                EList<JvmMember> _members_2 = it.getMembers();
+                StringConcatenation _builder_2 = new StringConcatenation();
+                String _name_1 = ((EntityMockObjectFill)attribute).getName();
+                _builder_2.append(_name_1);
+                _builder_2.append("_items");
+                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_3 = new StringConcatenation();
+                    _builder_3.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_3.append(_join);
+                    _builder_3.append("}");
+                    it_2.append(_builder_3);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+                  this._typeReferenceBuilder.typeRef(double[].class), _function_3);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+              }
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerUnsignedDoubleRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
+                for (final Double item : _items) {
+                  StringConcatenation _builder_1 = new StringConcatenation();
+                  _builder_1.append(item);
+                  items.add(_builder_1.toString());
+                }
+                EList<JvmMember> _members_2 = it.getMembers();
+                StringConcatenation _builder_2 = new StringConcatenation();
+                String _name_1 = ((EntityMockObjectFill)attribute).getName();
+                _builder_2.append(_name_1);
+                _builder_2.append("_items");
+                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_3 = new StringConcatenation();
+                    _builder_3.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_3.append(_join);
+                    _builder_3.append("}");
+                    it_2.append(_builder_3);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+                  this._typeReferenceBuilder.typeRef(double[].class), _function_3);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+              }
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerSignedIntegerRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
+                for (final Integer item : _items) {
+                  StringConcatenation _builder_1 = new StringConcatenation();
+                  _builder_1.append(item);
+                  items.add(_builder_1.toString());
+                }
+                EList<JvmMember> _members_2 = it.getMembers();
+                StringConcatenation _builder_2 = new StringConcatenation();
+                String _name_1 = ((EntityMockObjectFill)attribute).getName();
+                _builder_2.append(_name_1);
+                _builder_2.append("_items");
+                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_3 = new StringConcatenation();
+                    _builder_3.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_3.append(_join);
+                    _builder_3.append("}");
+                    it_2.append(_builder_3);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+                  this._typeReferenceBuilder.typeRef(int[].class), _function_3);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+              }
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerUnsignedIntegerRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
+                for (final Integer item : _items) {
+                  StringConcatenation _builder_1 = new StringConcatenation();
+                  _builder_1.append(item);
+                  items.add(_builder_1.toString());
+                }
+                EList<JvmMember> _members_2 = it.getMembers();
+                StringConcatenation _builder_2 = new StringConcatenation();
+                String _name_1 = ((EntityMockObjectFill)attribute).getName();
+                _builder_2.append(_name_1);
+                _builder_2.append("_items");
+                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_3 = new StringConcatenation();
+                    _builder_3.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_3.append(_join);
+                    _builder_3.append("}");
+                    it_2.append(_builder_3);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
+                  this._typeReferenceBuilder.typeRef(int[].class), _function_3);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
+              }
+            }
+          }
+        }
+      }
+      EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
+      for (final EntityMockObjectFunction calculation : _calculations) {
+        EList<JvmMember> _members_2 = it.getMembers();
+        StringConcatenation _builder_1 = new StringConcatenation();
+        _builder_1.append("calculate_");
+        String _name_1 = calculation.getName();
+        _builder_1.append(_name_1);
+        final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
+          it_1.setVisibility(JvmVisibility.PROTECTED);
+          EList<EntityMockObjectFunctionParameter> _params = calculation.getParams();
+          for (final EntityMockObjectFunctionParameter param : _params) {
+            {
+              JvmTypeReference type = param.getParameterType();
+              EList<JvmFormalParameter> _parameters = it_1.getParameters();
+              JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(param, this.getName(param.getName()), type);
+              this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+            }
+          }
+          it_1.setFinal(true);
+          this._jvmTypesBuilder.setBody(it_1, calculation.getBody());
+        };
+        JvmOperation _method = this._jvmTypesBuilder.toMethod(mockObject, _builder_1.toString(), calculation.getOftype(), _function_3);
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method);
+      }
+      EList<JvmMember> _members_3 = it.getMembers();
+      StringConcatenation _builder_2 = new StringConcatenation();
+      _builder_2.append("generateDataRow");
+      final Procedure1<JvmOperation> _function_4 = (JvmOperation it_1) -> {
+        it_1.setVisibility(JvmVisibility.PROTECTED);
+        it_1.setFinal(true);
+        final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
+          EList<EntityMockObjectEnum> _enumerations_1 = mockObject.getEnumerations();
+          for (final EntityMockObjectEnum enumeration_1 : _enumerations_1) {
+            {
+              String doc = this._jvmTypesBuilder.getDocumentation(enumeration_1);
+              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("/** ");
+                _builder_3.append(doc);
+                _builder_3.append(" */");
+                _builder_3.newLineIfNotEmpty();
+                it_2.append(_builder_3);
+              }
+              LEnum _usingResource_2 = enumeration_1.getUsingResource();
+              if ((_usingResource_2 instanceof EntityMockResource)) {
+                StringConcatenation _builder_4 = new StringConcatenation();
+                _builder_4.append("generateAttribute(\"");
+                String _name_2 = enumeration_1.getName();
+                _builder_4.append(_name_2);
+                _builder_4.append("\", ");
+                String _name_3 = enumeration_1.getName();
+                _builder_4.append(_name_3);
+                _builder_4.append("_resource.getDataRows().toArray());");
+                _builder_4.newLineIfNotEmpty();
+                it_2.append(_builder_4);
+              } else {
+                final LEnum lenum = enumeration_1.getUsingResource();
+                StringConcatenation _builder_5 = new StringConcatenation();
+                _builder_5.append("generateAttribute(\"");
+                String _name_4 = enumeration_1.getName();
+                _builder_5.append(_name_4);
+                _builder_5.append("\",");
+                String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(lenum);
+                _builder_5.append(_dtoFQNForLEnum);
+                _builder_5.append(".values());");
+                _builder_5.newLineIfNotEmpty();
+                it_2.append(_builder_5);
+              }
+            }
+          }
+          EList<IEntityMockObjectAttribute> _attributes_1 = mockObject.getAttributes();
+          for (final IEntityMockObjectAttribute attribute_1 : _attributes_1) {
+            {
+              String doc = this._jvmTypesBuilder.getDocumentation(attribute_1);
+              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("/** ");
+                _builder_3.append(doc);
+                _builder_3.append(" */");
+                _builder_3.newLineIfNotEmpty();
+                it_2.append(_builder_3);
+              }
+              boolean _matched_1 = false;
+              if (attribute_1 instanceof EntityMockObjectPlainValue) {
+                _matched_1=true;
+                StringConcatenation _builder_4 = new StringConcatenation();
+                _builder_4.append("generateAttribute(\"");
+                String _name_2 = ((EntityMockObjectPlainValue)attribute_1).getName();
+                _builder_4.append(_name_2);
+                _builder_4.append("\", ");
+                String _name_3 = ((EntityMockObjectPlainValue)attribute_1).getName();
+                _builder_4.append(_name_3);
+                _builder_4.append("_items);");
+                _builder_4.newLineIfNotEmpty();
+                it_2.append(_builder_4);
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockObjectResourceValue) {
+                  _matched_1=true;
+                  LEnum _usingResource_2 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getUsingResource();
+                  if ((_usingResource_2 instanceof EntityMockResource)) {
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("setFixAttribute(\"");
+                    String _name_2 = ((EntityMockObjectResourceValue)attribute_1).getName();
+                    _builder_4.append(_name_2);
+                    _builder_4.append("\", ");
+                    String _name_3 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
+                    _builder_4.append(_name_3);
+                    _builder_4.append("_resource.getAttribute(getAttribute(\"");
+                    String _name_4 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
+                    _builder_4.append(_name_4);
+                    _builder_4.append("\").toString(), \"");
+                    String _name_5 = ((EntityMockObjectResourceValue)attribute_1).getResourceAttribute().getName();
+                    _builder_4.append(_name_5);
+                    _builder_4.append("\"));");
+                    _builder_4.newLineIfNotEmpty();
+                    it_2.append(_builder_4);
+                  } else {
+                    StringConcatenation _builder_5 = new StringConcatenation();
+                    _builder_5.append("setFixAttribute(\"");
+                    String _name_6 = ((EntityMockObjectResourceValue)attribute_1).getName();
+                    _builder_5.append(_name_6);
+                    _builder_5.append("\", getAttribute(\"");
+                    String _name_7 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
+                    _builder_5.append(_name_7);
+                    _builder_5.append("\"));");
+                    _builder_5.newLineIfNotEmpty();
+                    it_2.append(_builder_5);
+                  }
+                }
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockObjectArrayValue) {
+                  _matched_1=true;
+                  StringConcatenation _builder_4 = new StringConcatenation();
+                  _builder_4.append("generateAttribute(\"");
+                  String _name_2 = ((EntityMockObjectArrayValue)attribute_1).getName();
+                  _builder_4.append(_name_2);
+                  _builder_4.append("\", \"");
+                  String _name_3 = ((EntityMockObjectArrayValue)attribute_1).getEnumeration().getName();
+                  _builder_4.append(_name_3);
+                  _builder_4.append("\", ");
+                  String _name_4 = ((EntityMockObjectArrayValue)attribute_1).getName();
+                  _builder_4.append(_name_4);
+                  _builder_4.append("_items);");
+                  _builder_4.newLineIfNotEmpty();
+                  it_2.append(_builder_4);
+                }
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockObjectEmbed) {
+                  _matched_1=true;
+                  StringConcatenation _builder_4 = new StringConcatenation();
+                  _builder_4.append("generateAttribute(\"");
+                  String _name_2 = ((EntityMockObjectEmbed)attribute_1).getName();
+                  _builder_4.append(_name_2);
+                  _builder_4.append("\", new ");
+                  String _entityMockName = this.entityMockName(((EntityMockObjectEmbed)attribute_1).getObject(), model);
+                  _builder_4.append(_entityMockName);
+                  _builder_4.append("());");
+                  _builder_4.newLineIfNotEmpty();
+                  it_2.append(_builder_4);
+                }
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockObjectFill) {
+                  _matched_1=true;
+                  PropertyFillerType type = ((EntityMockObjectFill)attribute_1).getFillerType();
+                  boolean _matched_2 = false;
+                  if (type instanceof PropertyFillerDateFuture) {
+                    _matched_2=true;
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("generateDateAttribute(\"");
+                    String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                    _builder_4.append(_name_2);
+                    _builder_4.append("\", 0 ,");
+                    int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
+                    _builder_4.append(_dateFutureYears);
+                    _builder_4.append(");");
+                    _builder_4.newLineIfNotEmpty();
+                    it_2.append(_builder_4);
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerDatePast) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateDateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", -");
+                      int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
+                      _builder_4.append(_datePastYears);
+                      _builder_4.append(", 0);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerDateRange) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateDateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
+                      _builder_4.append(_dateBeginYears);
+                      _builder_4.append(", ");
+                      int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
+                      _builder_4.append(_dateEndYears);
+                      _builder_4.append(");");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerBoolean) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateBooleanAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\");");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerSignedDoubleRange) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
+                      _builder_4.append(_beginRange);
+                      String beginRange = _builder_4.toString();
+                      StringConcatenation _builder_5 = new StringConcatenation();
+                      double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
+                      _builder_5.append(_endRange);
+                      String endRange = _builder_5.toString();
+                      LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
+                      boolean _tripleNotEquals = (_beginRangeRef != null);
+                      if (_tripleNotEquals) {
+                        StringConcatenation _builder_6 = new StringConcatenation();
+                        _builder_6.append("get_\"");
+                        String _name_2 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef().getName();
+                        _builder_6.append(_name_2);
+                        _builder_6.append("\"()");
+                        beginRange = _builder_6.toString();
+                      }
+                      LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
+                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
+                      if (_tripleNotEquals_1) {
+                        StringConcatenation _builder_7 = new StringConcatenation();
+                        _builder_7.append("get_\"");
+                        String _name_3 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef().getName();
+                        _builder_7.append(_name_3);
+                        _builder_7.append("\"()");
+                        endRange = _builder_7.toString();
+                      }
+                      StringConcatenation _builder_8 = new StringConcatenation();
+                      _builder_8.append("generateSignedAttribute(\"");
+                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_8.append(_name_4);
+                      _builder_8.append("\", ");
+                      int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
+                      _builder_8.append(_decimals);
+                      _builder_8.append(", ");
+                      _builder_8.append(beginRange);
+                      _builder_8.append(", ");
+                      _builder_8.append(endRange);
+                      _builder_8.append(", ");
+                      double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
+                      _builder_8.append(_rounded);
+                      _builder_8.append(");");
+                      _builder_8.newLineIfNotEmpty();
+                      it_2.append(_builder_8);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerSignedDoubleRandom) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_3);
+                      _builder_4.append("_items);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerUnsignedDoubleRange) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
+                      _builder_4.append(_beginRange);
+                      String beginRange = _builder_4.toString();
+                      StringConcatenation _builder_5 = new StringConcatenation();
+                      double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
+                      _builder_5.append(_endRange);
+                      String endRange = _builder_5.toString();
+                      LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
+                      boolean _tripleNotEquals = (_beginRangeRef != null);
+                      if (_tripleNotEquals) {
+                        StringConcatenation _builder_6 = new StringConcatenation();
+                        _builder_6.append("(double)get_\"");
+                        String _name_2 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef().getName();
+                        _builder_6.append(_name_2);
+                        _builder_6.append("\"()");
+                        beginRange = _builder_6.toString();
+                      }
+                      LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
+                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
+                      if (_tripleNotEquals_1) {
+                        StringConcatenation _builder_7 = new StringConcatenation();
+                        _builder_7.append("(double)get_\"");
+                        String _name_3 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef().getName();
+                        _builder_7.append(_name_3);
+                        _builder_7.append("\"()");
+                        endRange = _builder_7.toString();
+                      }
+                      StringConcatenation _builder_8 = new StringConcatenation();
+                      _builder_8.append("generateUnsignedAttribute(\"");
+                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_8.append(_name_4);
+                      _builder_8.append("\", ");
+                      int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
+                      _builder_8.append(_decimals);
+                      _builder_8.append(", ");
+                      _builder_8.append(beginRange);
+                      _builder_8.append(", ");
+                      _builder_8.append(endRange);
+                      _builder_8.append(", ");
+                      double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
+                      _builder_8.append(_rounded);
+                      _builder_8.append(");");
+                      _builder_8.newLineIfNotEmpty();
+                      it_2.append(_builder_8);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerUnsignedDoubleRandom) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_3);
+                      _builder_4.append("_items);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerSignedIntegerRange) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
+                      _builder_4.append(_beginRange);
+                      String beginRange = _builder_4.toString();
+                      StringConcatenation _builder_5 = new StringConcatenation();
+                      int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
+                      _builder_5.append(_endRange);
+                      String endRange = _builder_5.toString();
+                      LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
+                      boolean _tripleNotEquals = (_beginRangeRef != null);
+                      if (_tripleNotEquals) {
+                        StringConcatenation _builder_6 = new StringConcatenation();
+                        _builder_6.append("(int)get_\"");
+                        String _name_2 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef().getName();
+                        _builder_6.append(_name_2);
+                        _builder_6.append("\"()");
+                        beginRange = _builder_6.toString();
+                      }
+                      LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
+                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
+                      if (_tripleNotEquals_1) {
+                        StringConcatenation _builder_7 = new StringConcatenation();
+                        _builder_7.append("(int)get_\"");
+                        String _name_3 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef().getName();
+                        _builder_7.append(_name_3);
+                        _builder_7.append("\"()");
+                        endRange = _builder_7.toString();
+                      }
+                      StringConcatenation _builder_8 = new StringConcatenation();
+                      _builder_8.append("generateSignedAttribute(\"");
+                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_8.append(_name_4);
+                      _builder_8.append("\", ");
+                      _builder_8.append(beginRange);
+                      _builder_8.append(", ");
+                      _builder_8.append(endRange);
+                      _builder_8.append(", ");
+                      int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
+                      _builder_8.append(_rounded);
+                      _builder_8.append(");");
+                      _builder_8.newLineIfNotEmpty();
+                      it_2.append(_builder_8);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerSignedIntegerRandom) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_3);
+                      _builder_4.append("_items);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerUnsignedIntegerRange) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
+                      _builder_4.append(_beginRange);
+                      String beginRange = _builder_4.toString();
+                      StringConcatenation _builder_5 = new StringConcatenation();
+                      int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
+                      _builder_5.append(_endRange);
+                      String endRange = _builder_5.toString();
+                      LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
+                      boolean _tripleNotEquals = (_beginRangeRef != null);
+                      if (_tripleNotEquals) {
+                        StringConcatenation _builder_6 = new StringConcatenation();
+                        _builder_6.append("(int)get_\"");
+                        String _name_2 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef().getName();
+                        _builder_6.append(_name_2);
+                        _builder_6.append("\"()");
+                        beginRange = _builder_6.toString();
+                      }
+                      LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
+                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
+                      if (_tripleNotEquals_1) {
+                        StringConcatenation _builder_7 = new StringConcatenation();
+                        _builder_7.append("(int)get_\"");
+                        String _name_3 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef().getName();
+                        _builder_7.append(_name_3);
+                        _builder_7.append("\"()");
+                        endRange = _builder_7.toString();
+                      }
+                      StringConcatenation _builder_8 = new StringConcatenation();
+                      _builder_8.append("generateUnsignedAttribute(\"");
+                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_8.append(_name_4);
+                      _builder_8.append("\", ");
+                      _builder_8.append(beginRange);
+                      _builder_8.append(", ");
+                      _builder_8.append(endRange);
+                      _builder_8.append(", ");
+                      int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
+                      _builder_8.append(_rounded);
+                      _builder_8.append(");");
+                      _builder_8.newLineIfNotEmpty();
+                      it_2.append(_builder_8);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerUnsignedIntegerRandom) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_3);
+                      _builder_4.append("_items);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerTextRandom) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_3);
+                      _builder_4.append("_items);");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerTextParagraphs) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateParagraphsAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      int _count = ((PropertyFillerTextParagraphs)type).getCount();
+                      _builder_4.append(_count);
+                      _builder_4.append(");");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerTextSentences) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateSentencesAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      int _count = ((PropertyFillerTextSentences)type).getCount();
+                      _builder_4.append(_count);
+                      _builder_4.append(");");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                  if (!_matched_2) {
+                    if (type instanceof PropertyFillerTextWords) {
+                      _matched_2=true;
+                      StringConcatenation _builder_4 = new StringConcatenation();
+                      _builder_4.append("generateWordsAttribute(\"");
+                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
+                      _builder_4.append(_name_2);
+                      _builder_4.append("\", ");
+                      int _count = ((PropertyFillerTextWords)type).getCount();
+                      _builder_4.append(_count);
+                      _builder_4.append(");");
+                      _builder_4.newLineIfNotEmpty();
+                      it_2.append(_builder_4);
+                    }
+                  }
+                }
+              }
+            }
+          }
+          EList<EntityMockObjectFunction> _calculations_1 = mockObject.getCalculations();
+          for (final EntityMockObjectFunction calculation_1 : _calculations_1) {
+            {
+              String doc = this._jvmTypesBuilder.getDocumentation(calculation_1);
+              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("/** ");
+                _builder_3.append(doc);
+                _builder_3.append(" */");
+                _builder_3.newLineIfNotEmpty();
+                it_2.append(_builder_3);
+              }
+              StringConcatenation _builder_4 = new StringConcatenation();
+              String paramString = _builder_4.toString();
+              EList<EntityMockObjectFunctionParameter> _params = calculation_1.getParams();
               for (final EntityMockObjectFunctionParameter param : _params) {
                 {
-                  JvmTypeReference type = param.getParameterType();
-                  EList<JvmFormalParameter> _parameters = it.getParameters();
-                  IEntityMockObjectUsable _name = param.getName();
-                  String _name_1 = EntityMockDSLJvmModelInferrer.this.getName(_name);
-                  JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(param, _name_1, type);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                  boolean _isEmpty = paramString.isEmpty();
+                  boolean _not = (!_isEmpty);
+                  if (_not) {
+                    StringConcatenation _builder_5 = new StringConcatenation();
+                    _builder_5.append(paramString);
+                    _builder_5.append(",");
+                    paramString = _builder_5.toString();
+                  }
+                  JvmType _type = param.getParameterType().getType();
+                  if ((_type instanceof JvmEnumerationType)) {
+                    StringConcatenation _builder_6 = new StringConcatenation();
+                    _builder_6.append(paramString);
+                    _builder_6.append(" ");
+                    String _identifier = param.getParameterType().getIdentifier();
+                    _builder_6.append(_identifier);
+                    _builder_6.append(".valueOf(getAttribute(\"");
+                    String _name_2 = this.getName(param.getName());
+                    _builder_6.append(_name_2);
+                    _builder_6.append("\").toString())");
+                    paramString = _builder_6.toString();
+                  } else {
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append(paramString);
+                    _builder_7.append("(");
+                    String _identifier_1 = param.getParameterType().getIdentifier();
+                    _builder_7.append(_identifier_1);
+                    _builder_7.append(")getAttribute(\"");
+                    String _name_3 = this.getName(param.getName());
+                    _builder_7.append(_name_3);
+                    _builder_7.append("\")");
+                    paramString = _builder_7.toString();
+                  }
                 }
               }
-              it.setFinal(true);
-              XExpression _body = calculation.getBody();
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _body);
+              StringConcatenation _builder_5 = new StringConcatenation();
+              _builder_5.append("try {");
+              _builder_5.newLine();
+              _builder_5.append("\t");
+              _builder_5.append("setFixAttribute(\"");
+              String _name_2 = calculation_1.getName();
+              _builder_5.append(_name_2, "\t");
+              _builder_5.append("\", calculate_");
+              String _name_3 = calculation_1.getName();
+              _builder_5.append(_name_3, "\t");
+              _builder_5.append("(");
+              _builder_5.append(paramString, "\t");
+              _builder_5.append("));");
+              _builder_5.newLineIfNotEmpty();
+              _builder_5.append("}");
+              _builder_5.newLine();
+              _builder_5.append("catch (NullPointerException npe) {}");
+              _builder_5.newLine();
+              _builder_5.append("catch (Exception e) {");
+              _builder_5.newLine();
+              _builder_5.append("    ");
+              _builder_5.append("log.error(e.getLocalizedMessage()+e.getCause());");
+              _builder_5.newLine();
+              _builder_5.append("}");
+              _builder_5.newLine();
+              it_2.append(_builder_5);
             }
-          };
-          JvmOperation _method = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(mockObject, _builder_2.toString(), _oftype, _function_2);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method);
-        }
-        EList<JvmMember> _members_3 = it.getMembers();
-        StringConcatenation _builder_3 = new StringConcatenation();
-        _builder_3.append("generateDataRow");
-        JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
-        final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            it.setVisibility(JvmVisibility.PROTECTED);
-            it.setFinal(true);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
-                for (final EntityMockObjectEnum enumeration : _enumerations) {
-                  {
-                    String doc = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(enumeration);
-                    boolean _and = false;
-                    if (!(doc instanceof String)) {
-                      _and = false;
-                    } else {
-                      String _trim = doc.trim();
-                      boolean _isEmpty = _trim.isEmpty();
-                      boolean _not = (!_isEmpty);
-                      _and = _not;
-                    }
-                    if (_and) {
-                      StringConcatenation _builder = new StringConcatenation();
-                      _builder.append("/** ");
-                      _builder.append(doc, "");
-                      _builder.append(" */");
-                      _builder.newLineIfNotEmpty();
-                      it.append(_builder);
-                    }
-                    LEnum _usingResource = enumeration.getUsingResource();
-                    if ((_usingResource instanceof EntityMockResource)) {
-                      StringConcatenation _builder_1 = new StringConcatenation();
-                      _builder_1.append("generateAttribute(\"");
-                      String _name = enumeration.getName();
-                      _builder_1.append(_name, "");
-                      _builder_1.append("\", ");
-                      String _name_1 = enumeration.getName();
-                      _builder_1.append(_name_1, "");
-                      _builder_1.append("_resource.getDataRows().toArray());");
-                      _builder_1.newLineIfNotEmpty();
-                      it.append(_builder_1);
-                    } else {
-                      final LEnum lenum = enumeration.getUsingResource();
-                      StringConcatenation _builder_2 = new StringConcatenation();
-                      _builder_2.append("generateAttribute(\"");
-                      String _name_2 = enumeration.getName();
-                      _builder_2.append(_name_2, "");
-                      _builder_2.append("\",");
-                      String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(lenum);
-                      _builder_2.append(_dtoFQNForLEnum, "");
-                      _builder_2.append(".values());");
-                      _builder_2.newLineIfNotEmpty();
-                      it.append(_builder_2);
-                    }
-                  }
-                }
-                EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
-                for (final IEntityMockObjectAttribute attribute : _attributes) {
-                  {
-                    String doc = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                    boolean _and = false;
-                    if (!(doc instanceof String)) {
-                      _and = false;
-                    } else {
-                      String _trim = doc.trim();
-                      boolean _isEmpty = _trim.isEmpty();
-                      boolean _not = (!_isEmpty);
-                      _and = _not;
-                    }
-                    if (_and) {
-                      StringConcatenation _builder = new StringConcatenation();
-                      _builder.append("/** ");
-                      _builder.append(doc, "");
-                      _builder.append(" */");
-                      _builder.newLineIfNotEmpty();
-                      it.append(_builder);
-                    }
-                    boolean _matched = false;
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockObjectPlainValue) {
-                        _matched=true;
-                        StringConcatenation _builder_1 = new StringConcatenation();
-                        _builder_1.append("generateAttribute(\"");
-                        String _name = ((EntityMockObjectPlainValue)attribute).getName();
-                        _builder_1.append(_name, "");
-                        _builder_1.append("\", ");
-                        String _name_1 = ((EntityMockObjectPlainValue)attribute).getName();
-                        _builder_1.append(_name_1, "");
-                        _builder_1.append("_items);");
-                        _builder_1.newLineIfNotEmpty();
-                        it.append(_builder_1);
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockObjectResourceValue) {
-                        _matched=true;
-                        EntityMockObjectEnum _resourceEnum = ((EntityMockObjectResourceValue)attribute).getResourceEnum();
-                        LEnum _usingResource = _resourceEnum.getUsingResource();
-                        if ((_usingResource instanceof EntityMockResource)) {
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("setFixAttribute(\"");
-                          String _name = ((EntityMockObjectResourceValue)attribute).getName();
-                          _builder_1.append(_name, "");
-                          _builder_1.append("\", ");
-                          EntityMockObjectEnum _resourceEnum_1 = ((EntityMockObjectResourceValue)attribute).getResourceEnum();
-                          String _name_1 = _resourceEnum_1.getName();
-                          _builder_1.append(_name_1, "");
-                          _builder_1.append("_resource.getAttribute(getAttribute(\"");
-                          EntityMockObjectEnum _resourceEnum_2 = ((EntityMockObjectResourceValue)attribute).getResourceEnum();
-                          String _name_2 = _resourceEnum_2.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\").toString(), \"");
-                          EntityMockResourceAttribute _resourceAttribute = ((EntityMockObjectResourceValue)attribute).getResourceAttribute();
-                          String _name_3 = _resourceAttribute.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("\"));");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        } else {
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          _builder_2.append("setFixAttribute(\"");
-                          String _name_4 = ((EntityMockObjectResourceValue)attribute).getName();
-                          _builder_2.append(_name_4, "");
-                          _builder_2.append("\", getAttribute(\"");
-                          EntityMockObjectEnum _resourceEnum_3 = ((EntityMockObjectResourceValue)attribute).getResourceEnum();
-                          String _name_5 = _resourceEnum_3.getName();
-                          _builder_2.append(_name_5, "");
-                          _builder_2.append("\"));");
-                          _builder_2.newLineIfNotEmpty();
-                          it.append(_builder_2);
-                        }
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockObjectArrayValue) {
-                        _matched=true;
-                        StringConcatenation _builder_1 = new StringConcatenation();
-                        _builder_1.append("generateAttribute(\"");
-                        String _name = ((EntityMockObjectArrayValue)attribute).getName();
-                        _builder_1.append(_name, "");
-                        _builder_1.append("\", \"");
-                        EntityMockObjectEnum _enumeration = ((EntityMockObjectArrayValue)attribute).getEnumeration();
-                        String _name_1 = _enumeration.getName();
-                        _builder_1.append(_name_1, "");
-                        _builder_1.append("\", ");
-                        String _name_2 = ((EntityMockObjectArrayValue)attribute).getName();
-                        _builder_1.append(_name_2, "");
-                        _builder_1.append("_items);");
-                        _builder_1.newLineIfNotEmpty();
-                        it.append(_builder_1);
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockObjectEmbed) {
-                        _matched=true;
-                        StringConcatenation _builder_1 = new StringConcatenation();
-                        _builder_1.append("generateAttribute(\"");
-                        String _name = ((EntityMockObjectEmbed)attribute).getName();
-                        _builder_1.append(_name, "");
-                        _builder_1.append("\", new ");
-                        EntityMockObject _object = ((EntityMockObjectEmbed)attribute).getObject();
-                        String _entityMockName = EntityMockDSLJvmModelInferrer.this.getEntityMockName(_object);
-                        _builder_1.append(_entityMockName, "");
-                        _builder_1.append("());");
-                        _builder_1.newLineIfNotEmpty();
-                        it.append(_builder_1);
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockObjectFill) {
-                        _matched=true;
-                        PropertyFillerType type = ((EntityMockObjectFill)attribute).getFillerType();
-                        boolean _matched_1 = false;
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerDateFuture) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateDateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", 0 ,");
-                            int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
-                            _builder_1.append(_dateFutureYears, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerDatePast) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateDateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", -");
-                            int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
-                            _builder_1.append(_datePastYears, "");
-                            _builder_1.append(", 0);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerDateRange) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateDateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
-                            _builder_1.append(_dateBeginYears, "");
-                            _builder_1.append(", ");
-                            int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
-                            _builder_1.append(_dateEndYears, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerBoolean) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateBooleanAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerSignedDoubleRange) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
-                            _builder_1.append(_beginRange, "");
-                            String beginRange = _builder_1.toString();
-                            StringConcatenation _builder_2 = new StringConcatenation();
-                            double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
-                            _builder_2.append(_endRange, "");
-                            String endRange = _builder_2.toString();
-                            LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
-                            boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                            if (_notEquals) {
-                              StringConcatenation _builder_3 = new StringConcatenation();
-                              _builder_3.append("get_\"");
-                              LEntityAttribute _beginRangeRef_1 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
-                              String _name = _beginRangeRef_1.getName();
-                              _builder_3.append(_name, "");
-                              _builder_3.append("\"()");
-                              beginRange = _builder_3.toString();
-                            }
-                            LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
-                            boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                            if (_notEquals_1) {
-                              StringConcatenation _builder_4 = new StringConcatenation();
-                              _builder_4.append("get_\"");
-                              LEntityAttribute _endRangeRef_1 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
-                              String _name_1 = _endRangeRef_1.getName();
-                              _builder_4.append(_name_1, "");
-                              _builder_4.append("\"()");
-                              endRange = _builder_4.toString();
-                            }
-                            StringConcatenation _builder_5 = new StringConcatenation();
-                            _builder_5.append("generateSignedAttribute(\"");
-                            String _name_2 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_5.append(_name_2, "");
-                            _builder_5.append("\", ");
-                            int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
-                            _builder_5.append(_decimals, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(beginRange, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(endRange, "");
-                            _builder_5.append(", ");
-                            double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
-                            _builder_5.append(_rounded, "");
-                            _builder_5.append(");");
-                            _builder_5.newLineIfNotEmpty();
-                            it.append(_builder_5);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerSignedDoubleRandom) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append("_items);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerUnsignedDoubleRange) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
-                            _builder_1.append(_beginRange, "");
-                            String beginRange = _builder_1.toString();
-                            StringConcatenation _builder_2 = new StringConcatenation();
-                            double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
-                            _builder_2.append(_endRange, "");
-                            String endRange = _builder_2.toString();
-                            LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
-                            boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                            if (_notEquals) {
-                              StringConcatenation _builder_3 = new StringConcatenation();
-                              _builder_3.append("(double)get_\"");
-                              LEntityAttribute _beginRangeRef_1 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
-                              String _name = _beginRangeRef_1.getName();
-                              _builder_3.append(_name, "");
-                              _builder_3.append("\"()");
-                              beginRange = _builder_3.toString();
-                            }
-                            LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
-                            boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                            if (_notEquals_1) {
-                              StringConcatenation _builder_4 = new StringConcatenation();
-                              _builder_4.append("(double)get_\"");
-                              LEntityAttribute _endRangeRef_1 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
-                              String _name_1 = _endRangeRef_1.getName();
-                              _builder_4.append(_name_1, "");
-                              _builder_4.append("\"()");
-                              endRange = _builder_4.toString();
-                            }
-                            StringConcatenation _builder_5 = new StringConcatenation();
-                            _builder_5.append("generateUnsignedAttribute(\"");
-                            String _name_2 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_5.append(_name_2, "");
-                            _builder_5.append("\", ");
-                            int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
-                            _builder_5.append(_decimals, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(beginRange, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(endRange, "");
-                            _builder_5.append(", ");
-                            double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
-                            _builder_5.append(_rounded, "");
-                            _builder_5.append(");");
-                            _builder_5.newLineIfNotEmpty();
-                            it.append(_builder_5);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerUnsignedDoubleRandom) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append("_items);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerSignedIntegerRange) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
-                            _builder_1.append(_beginRange, "");
-                            String beginRange = _builder_1.toString();
-                            StringConcatenation _builder_2 = new StringConcatenation();
-                            int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
-                            _builder_2.append(_endRange, "");
-                            String endRange = _builder_2.toString();
-                            LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
-                            boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                            if (_notEquals) {
-                              StringConcatenation _builder_3 = new StringConcatenation();
-                              _builder_3.append("(int)get_\"");
-                              LEntityAttribute _beginRangeRef_1 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
-                              String _name = _beginRangeRef_1.getName();
-                              _builder_3.append(_name, "");
-                              _builder_3.append("\"()");
-                              beginRange = _builder_3.toString();
-                            }
-                            LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
-                            boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                            if (_notEquals_1) {
-                              StringConcatenation _builder_4 = new StringConcatenation();
-                              _builder_4.append("(int)get_\"");
-                              LEntityAttribute _endRangeRef_1 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
-                              String _name_1 = _endRangeRef_1.getName();
-                              _builder_4.append(_name_1, "");
-                              _builder_4.append("\"()");
-                              endRange = _builder_4.toString();
-                            }
-                            StringConcatenation _builder_5 = new StringConcatenation();
-                            _builder_5.append("generateSignedAttribute(\"");
-                            String _name_2 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_5.append(_name_2, "");
-                            _builder_5.append("\", ");
-                            _builder_5.append(beginRange, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(endRange, "");
-                            _builder_5.append(", ");
-                            int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
-                            _builder_5.append(_rounded, "");
-                            _builder_5.append(");");
-                            _builder_5.newLineIfNotEmpty();
-                            it.append(_builder_5);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerSignedIntegerRandom) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append("_items);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerUnsignedIntegerRange) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
-                            _builder_1.append(_beginRange, "");
-                            String beginRange = _builder_1.toString();
-                            StringConcatenation _builder_2 = new StringConcatenation();
-                            int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
-                            _builder_2.append(_endRange, "");
-                            String endRange = _builder_2.toString();
-                            LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
-                            boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                            if (_notEquals) {
-                              StringConcatenation _builder_3 = new StringConcatenation();
-                              _builder_3.append("(int)get_\"");
-                              LEntityAttribute _beginRangeRef_1 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
-                              String _name = _beginRangeRef_1.getName();
-                              _builder_3.append(_name, "");
-                              _builder_3.append("\"()");
-                              beginRange = _builder_3.toString();
-                            }
-                            LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
-                            boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                            if (_notEquals_1) {
-                              StringConcatenation _builder_4 = new StringConcatenation();
-                              _builder_4.append("(int)get_\"");
-                              LEntityAttribute _endRangeRef_1 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
-                              String _name_1 = _endRangeRef_1.getName();
-                              _builder_4.append(_name_1, "");
-                              _builder_4.append("\"()");
-                              endRange = _builder_4.toString();
-                            }
-                            StringConcatenation _builder_5 = new StringConcatenation();
-                            _builder_5.append("generateUnsignedAttribute(\"");
-                            String _name_2 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_5.append(_name_2, "");
-                            _builder_5.append("\", ");
-                            _builder_5.append(beginRange, "");
-                            _builder_5.append(", ");
-                            _builder_5.append(endRange, "");
-                            _builder_5.append(", ");
-                            int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
-                            _builder_5.append(_rounded, "");
-                            _builder_5.append(");");
-                            _builder_5.newLineIfNotEmpty();
-                            it.append(_builder_5);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerUnsignedIntegerRandom) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append("_items);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerTextRandom) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            String _name_1 = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append("_items);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerTextParagraphs) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateParagraphsAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            int _count = ((PropertyFillerTextParagraphs)type).getCount();
-                            _builder_1.append(_count, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerTextSentences) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateSentencesAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            int _count = ((PropertyFillerTextSentences)type).getCount();
-                            _builder_1.append(_count, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                        if (!_matched_1) {
-                          if (type instanceof PropertyFillerTextWords) {
-                            _matched_1=true;
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("generateWordsAttribute(\"");
-                            String _name = ((EntityMockObjectFill)attribute).getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append("\", ");
-                            int _count = ((PropertyFillerTextWords)type).getCount();
-                            _builder_1.append(_count, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-                EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
-                for (final EntityMockObjectFunction calculation : _calculations) {
-                  {
-                    String doc = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(calculation);
-                    boolean _and = false;
-                    if (!(doc instanceof String)) {
-                      _and = false;
-                    } else {
-                      String _trim = doc.trim();
-                      boolean _isEmpty = _trim.isEmpty();
-                      boolean _not = (!_isEmpty);
-                      _and = _not;
-                    }
-                    if (_and) {
-                      StringConcatenation _builder = new StringConcatenation();
-                      _builder.append("/** ");
-                      _builder.append(doc, "");
-                      _builder.append(" */");
-                      _builder.newLineIfNotEmpty();
-                      it.append(_builder);
-                    }
-                    StringConcatenation _builder_1 = new StringConcatenation();
-                    String paramString = _builder_1.toString();
-                    EList<EntityMockObjectFunctionParameter> _params = calculation.getParams();
-                    for (final EntityMockObjectFunctionParameter param : _params) {
-                      {
-                        boolean _isEmpty_1 = paramString.isEmpty();
-                        boolean _not_1 = (!_isEmpty_1);
-                        if (_not_1) {
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          _builder_2.append(paramString, "");
-                          _builder_2.append(",");
-                          paramString = _builder_2.toString();
-                        }
-                        JvmTypeReference _parameterType = param.getParameterType();
-                        JvmType _type = _parameterType.getType();
-                        if ((_type instanceof JvmEnumerationType)) {
-                          StringConcatenation _builder_3 = new StringConcatenation();
-                          _builder_3.append(paramString, "");
-                          _builder_3.append(" ");
-                          JvmTypeReference _parameterType_1 = param.getParameterType();
-                          String _identifier = _parameterType_1.getIdentifier();
-                          _builder_3.append(_identifier, "");
-                          _builder_3.append(".valueOf(getAttribute(\"");
-                          IEntityMockObjectUsable _name = param.getName();
-                          String _name_1 = EntityMockDSLJvmModelInferrer.this.getName(_name);
-                          _builder_3.append(_name_1, "");
-                          _builder_3.append("\").toString())");
-                          paramString = _builder_3.toString();
-                        } else {
-                          StringConcatenation _builder_4 = new StringConcatenation();
-                          _builder_4.append(paramString, "");
-                          _builder_4.append("(");
-                          JvmTypeReference _parameterType_2 = param.getParameterType();
-                          String _identifier_1 = _parameterType_2.getIdentifier();
-                          _builder_4.append(_identifier_1, "");
-                          _builder_4.append(")getAttribute(\"");
-                          IEntityMockObjectUsable _name_2 = param.getName();
-                          String _name_3 = EntityMockDSLJvmModelInferrer.this.getName(_name_2);
-                          _builder_4.append(_name_3, "");
-                          _builder_4.append("\")");
-                          paramString = _builder_4.toString();
-                        }
-                      }
-                    }
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append("try {");
-                    _builder_2.newLine();
-                    _builder_2.append("\t");
-                    _builder_2.append("setFixAttribute(\"");
-                    String _name = calculation.getName();
-                    _builder_2.append(_name, "\t");
-                    _builder_2.append("\", calculate_");
-                    String _name_1 = calculation.getName();
-                    _builder_2.append(_name_1, "\t");
-                    _builder_2.append("(");
-                    _builder_2.append(paramString, "\t");
-                    _builder_2.append("));");
-                    _builder_2.newLineIfNotEmpty();
-                    _builder_2.append("}");
-                    _builder_2.newLine();
-                    _builder_2.append("catch (NullPointerException npe) {}");
-                    _builder_2.newLine();
-                    _builder_2.append("catch (Exception e) {");
-                    _builder_2.newLine();
-                    _builder_2.append("    ");
-                    _builder_2.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                    _builder_2.newLine();
-                    _builder_2.append("}");
-                    _builder_2.newLine();
-                    it.append(_builder_2);
-                  }
-                }
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
           }
         };
-        JvmOperation _method_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(mockObject, _builder_3.toString(), _typeRef_3, _function_3);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_1);
-      }
+        this._jvmTypesBuilder.setBody(it_1, _function_5);
+      };
+      JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(mockObject, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_4);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_1);
     };
-    acceptor.<JvmGenericType>accept(_class, _function);
+    acceptor.<JvmGenericType>accept(mockClass, _function);
   }
   
   public String getName(final IEntityMockObjectUsable attribute) {
     boolean _matched = false;
-    if (!_matched) {
-      if (attribute instanceof EntityMockObjectFunction) {
-        _matched=true;
-        StringConcatenation _builder = new StringConcatenation();
-        String _name = ((EntityMockObjectFunction)attribute).getName();
-        _builder.append(_name, "");
-        return _builder.toString();
-      }
+    if (attribute instanceof EntityMockObjectFunction) {
+      _matched=true;
+      StringConcatenation _builder = new StringConcatenation();
+      String _name = ((EntityMockObjectFunction)attribute).getName();
+      _builder.append(_name);
+      return _builder.toString();
     }
     if (!_matched) {
       if (attribute instanceof EntityMockObjectEnum) {
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectEnum)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1432,7 +1379,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectPlainValue)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1441,7 +1388,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectArrayValue)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1450,7 +1397,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectEmbed)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1459,7 +1406,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectFill)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1468,7 +1415,7 @@
         _matched=true;
         StringConcatenation _builder = new StringConcatenation();
         String _name = ((EntityMockObjectResourceValue)attribute).getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         return _builder.toString();
       }
     }
@@ -1478,1375 +1425,1180 @@
   /**
    * generate a mock entity class
    */
-  public void generateMockEntity(final EntityMockModel model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockPackage pckg, final EntityMockEntity mockEntity) {
-    StringConcatenation _builder = new StringConcatenation();
-    String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-    _builder.append(_entityMockName, "");
-    _builder.append(".");
-    String _entityMockName_1 = this.getEntityMockName(mockEntity);
-    _builder.append(_entityMockName_1, "");
-    JvmGenericType _class = this._jvmTypesBuilder.toClass(model, _builder.toString());
-    final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
-      public void apply(final JvmGenericType it) {
-        EList<JvmTypeReference> _superTypes = it.getSuperTypes();
-        JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockEntity.class);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
+  public void generateMockEntity(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockEntity mockEntity) {
+    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockEntity, model));
+    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
+      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
+      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockEntity.class);
+      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
+      JvmField field = null;
+      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
+        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("LoggerFactory.getLogger(\"mock\")");
+          it_2.append(_builder);
+        };
+        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
+      };
+      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
+      field.setStatic(true);
+      EList<JvmMember> _members = it.getMembers();
+      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+      EntityMockResource _byResource = mockEntity.getByResource();
+      boolean _tripleNotEquals = (_byResource != null);
+      if (_tripleNotEquals) {
+        EList<JvmMember> _members_1 = it.getMembers();
         StringConcatenation _builder = new StringConcatenation();
-        _builder.append("<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>");
-        _builder.newLine();
-        String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(mockEntity);
-        _builder.append(_documentation, "");
-        _builder.newLineIfNotEmpty();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _builder.toString());
-        it.setFinal(true);
-        JvmField field = null;
-        JvmTypeReference _typeRef_1 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Logger.class);
-        final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
-          public void apply(final JvmField it) {
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("LoggerFactory.getLogger(");
-                String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-                _builder.append(_entityMockName, "");
-                _builder.append(".");
-                String _entityMockName_1 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                _builder.append(_entityMockName_1, "");
-                _builder.append(".class)");
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-          }
+        String _name = mockEntity.getByResource().getName();
+        _builder.append(_name);
+        _builder.append("_resource");
+        final Procedure1<JvmField> _function_2 = (JvmField it_1) -> {
+          final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
+            StringConcatenation _builder_1 = new StringConcatenation();
+            _builder_1.append("new ");
+            String _entityMockName = this.entityMockName(mockEntity.getByResource(), model);
+            _builder_1.append(_entityMockName);
+            _builder_1.append("()");
+            it_2.append(_builder_1);
+          };
+          this._jvmTypesBuilder.setInitializer(it_1, _function_3);
+          this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(mockEntity.getByResource()));
+          it_1.setVisibility(JvmVisibility.PRIVATE);
+          it_1.setStatic(true);
         };
-        JvmField _field = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(model, "log", _typeRef_1, _function);
-        field = _field;
-        field.setFinal(true);
-        field.setStatic(true);
-        EList<JvmMember> _members = it.getMembers();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
-        EntityMockResource _byResource = mockEntity.getByResource();
-        boolean _notEquals = (!Objects.equal(_byResource, null));
-        if (_notEquals) {
-          EList<JvmMember> _members_1 = it.getMembers();
+        JvmField _field = this._jvmTypesBuilder.toField(model, _builder.toString(), 
+          this._typeReferenceBuilder.typeRef(ABaseMockResource.class), _function_2);
+        this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field);
+      }
+      EList<JvmMember> _members_2 = it.getMembers();
+      final Procedure1<JvmConstructor> _function_3 = (JvmConstructor it_1) -> {
+        EList<JvmFormalParameter> _parameters = it_1.getParameters();
+        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mockEntity, "mockDataGenerator", this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
           StringConcatenation _builder_1 = new StringConcatenation();
-          EntityMockResource _byResource_1 = mockEntity.getByResource();
-          String _name = _byResource_1.getName();
-          _builder_1.append(_name, "");
-          _builder_1.append("_resource");
-          JvmTypeReference _typeRef_2 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockResource.class);
-          final Procedure1<JvmField> _function_1 = new Procedure1<JvmField>() {
-            public void apply(final JvmField it) {
-              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                public void apply(final ITreeAppendable it) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("new ");
-                  EntityMockResource _byResource = mockEntity.getByResource();
-                  String _entityMockName = EntityMockDSLJvmModelInferrer.this.getEntityMockName(_byResource);
-                  _builder.append(_entityMockName, "");
-                  _builder.append("()");
-                  it.append(_builder);
-                }
-              };
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-              EntityMockResource _byResource = mockEntity.getByResource();
-              String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(_byResource);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-              it.setVisibility(JvmVisibility.PRIVATE);
-              it.setStatic(true);
-            }
-          };
-          JvmField _field_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_1.toString(), _typeRef_2, _function_1);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field_1);
-        }
-        EList<JvmMember> _members_2 = it.getMembers();
-        final Procedure1<JvmConstructor> _function_2 = new Procedure1<JvmConstructor>() {
-          public void apply(final JvmConstructor it) {
-            EList<JvmFormalParameter> _parameters = it.getParameters();
-            JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class);
-            JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(mockEntity, "mockDataGenerator", _typeRef);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("super(mockDataGenerator, \"");
-                LEntity _entityRef = mockEntity.getEntityRef();
-                String _persistenceUnit = _entityRef.getPersistenceUnit();
-                _builder.append(_persistenceUnit, "");
-                _builder.append("\");");
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
+          _builder_1.append("super(mockDataGenerator, \"");
+          String _persistenceUnit = mockEntity.getEntityRef().getPersistenceUnit();
+          _builder_1.append(_persistenceUnit);
+          _builder_1.append("\");");
+          it_2.append(_builder_1);
         };
-        JvmConstructor _constructor = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toConstructor(pckg, _function_2);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_2, _constructor);
-        EList<EntityMockTemporary> _temporaries = mockEntity.getTemporaries();
-        for (final EntityMockTemporary temporary : _temporaries) {
-          EList<JvmMember> _members_3 = it.getMembers();
-          StringConcatenation _builder_2 = new StringConcatenation();
-          String _name_1 = temporary.getName();
-          _builder_2.append(_name_1, "");
-          _builder_2.append("_temporary");
-          JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockObject.class);
-          final Procedure1<JvmField> _function_3 = new Procedure1<JvmField>() {
-            public void apply(final JvmField it) {
-              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                public void apply(final ITreeAppendable it) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("new ");
-                  String _entityMockName = EntityMockDSLJvmModelInferrer.this.getEntityMockName(temporary);
-                  _builder.append(_entityMockName, "");
-                  _builder.append("()");
-                  it.append(_builder);
-                }
-              };
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-              String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(temporary);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-              it.setVisibility(JvmVisibility.PRIVATE);
-              it.setStatic(true);
-            }
+        this._jvmTypesBuilder.setBody(it_1, _function_4);
+      };
+      JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(model, _function_3);
+      this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_2, _constructor);
+      EList<EntityMockTemplate> _templates = mockEntity.getTemplates();
+      for (final EntityMockTemplate template : _templates) {
+        EList<JvmMember> _members_3 = it.getMembers();
+        StringConcatenation _builder_1 = new StringConcatenation();
+        String _name_1 = template.getName();
+        _builder_1.append(_name_1);
+        _builder_1.append("_template");
+        final Procedure1<JvmField> _function_4 = (JvmField it_1) -> {
+          final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
+            StringConcatenation _builder_2 = new StringConcatenation();
+            _builder_2.append("new ");
+            String _entityMockName = this.entityMockName(template, model);
+            _builder_2.append(_entityMockName);
+            _builder_2.append("()");
+            it_2.append(_builder_2);
           };
-          JvmField _field_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_2.toString(), _typeRef_3, _function_3);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_3, _field_2);
-        }
-        EList<IEntityMockAttribute> _attributes = mockEntity.getAttributes();
-        for (final IEntityMockAttribute attribute : _attributes) {
-          boolean _matched = false;
-          if (!_matched) {
-            if (attribute instanceof EntityMockAttributeByObject) {
-              _matched=true;
-            }
-          }
-          if (!_matched) {
-            if (attribute instanceof EntityMockAttributeFiller) {
-              _matched=true;
-              PropertyFillerType type = ((EntityMockAttributeFiller)attribute).getFillerType();
-              boolean _matched_1 = false;
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerTextRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
-                  for (final String item : _items) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append("\"");
-                    _builder_3.append(item, "");
-                    _builder_3.append("\"");
-                    items.add(_builder_3.toString());
-                  }
-                  EList<JvmMember> _members_4 = it.getMembers();
-                  StringConcatenation _builder_4 = new StringConcatenation();
-                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                  String _name_2 = _attributeRef.getName();
-                  _builder_4.append(_name_2, "");
-                  _builder_4.append("_items");
-                  JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object[].class);
-                  final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_4.toString(), _typeRef_4, _function_4);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_3);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerSignedDoubleRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
-                  for (final Double item : _items) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append(item, "");
-                    items.add(_builder_3.toString());
-                  }
-                  EList<JvmMember> _members_4 = it.getMembers();
-                  StringConcatenation _builder_4 = new StringConcatenation();
-                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                  String _name_2 = _attributeRef.getName();
-                  _builder_4.append(_name_2, "");
-                  _builder_4.append("_items");
-                  JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(double[].class);
-                  final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_4.toString(), _typeRef_4, _function_4);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_3);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerUnsignedDoubleRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
-                  for (final Double item : _items) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append(item, "");
-                    items.add(_builder_3.toString());
-                  }
-                  EList<JvmMember> _members_4 = it.getMembers();
-                  StringConcatenation _builder_4 = new StringConcatenation();
-                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                  String _name_2 = _attributeRef.getName();
-                  _builder_4.append(_name_2, "");
-                  _builder_4.append("_items");
-                  JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(double[].class);
-                  final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_4.toString(), _typeRef_4, _function_4);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_3);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerSignedIntegerRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
-                  for (final Integer item : _items) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append(item, "");
-                    items.add(_builder_3.toString());
-                  }
-                  EList<JvmMember> _members_4 = it.getMembers();
-                  StringConcatenation _builder_4 = new StringConcatenation();
-                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                  String _name_2 = _attributeRef.getName();
-                  _builder_4.append(_name_2, "");
-                  _builder_4.append("_items");
-                  JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int[].class);
-                  final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_4.toString(), _typeRef_4, _function_4);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_3);
-                }
-              }
-              if (!_matched_1) {
-                if (type instanceof PropertyFillerUnsignedIntegerRandom) {
-                  _matched_1=true;
-                  final List<String> items = new ArrayList<String>();
-                  EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
-                  for (final Integer item : _items) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append(item, "");
-                    items.add(_builder_3.toString());
-                  }
-                  EList<JvmMember> _members_4 = it.getMembers();
-                  StringConcatenation _builder_4 = new StringConcatenation();
-                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                  String _name_2 = _attributeRef.getName();
-                  _builder_4.append(_name_2, "");
-                  _builder_4.append("_items");
-                  JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int[].class);
-                  final Procedure1<JvmField> _function_4 = new Procedure1<JvmField>() {
-                    public void apply(final JvmField it) {
-                      final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                        public void apply(final ITreeAppendable it) {
-                          StringConcatenation _builder = new StringConcatenation();
-                          _builder.append("{");
-                          String _join = StringUtils.join(items, ",");
-                          _builder.append(_join, "");
-                          _builder.append("}");
-                          it.append(_builder);
-                        }
-                      };
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
-                      String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(attribute);
-                      EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _documentation);
-                      it.setVisibility(JvmVisibility.PRIVATE);
-                      it.setStatic(true);
-                    }
-                  };
-                  JvmField _field_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(pckg, _builder_4.toString(), _typeRef_4, _function_4);
-                  EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_3);
-                }
-              }
-            }
-          }
-          if (!_matched) {
-            if (attribute instanceof EntityMockAttributeByReference) {
-              _matched=true;
-            }
-          }
-        }
-        EntityMockResource _byResource_2 = mockEntity.getByResource();
-        boolean _notEquals_1 = (!Objects.equal(_byResource_2, null));
-        if (_notEquals_1) {
-          EList<JvmMember> _members_4 = it.getMembers();
-          StringConcatenation _builder_3 = new StringConcatenation();
-          _builder_3.append("getDataRows");
-          JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Set.class);
-          final Procedure1<JvmOperation> _function_4 = new Procedure1<JvmOperation>() {
-            public void apply(final JvmOperation it) {
-              it.setVisibility(JvmVisibility.PUBLIC);
-              it.setFinal(true);
-              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                public void apply(final ITreeAppendable it) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("return ");
-                  EntityMockResource _byResource = mockEntity.getByResource();
-                  String _name = _byResource.getName();
-                  _builder.append(_name, "");
-                  _builder.append("_resource.getDataRows();");
-                  it.append(_builder);
-                }
-              };
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-            }
-          };
-          JvmOperation _method = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_3.toString(), _typeRef_4, _function_4);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method);
-          EList<JvmMember> _members_5 = it.getMembers();
-          StringConcatenation _builder_4 = new StringConcatenation();
-          _builder_4.append("generateEntity");
-          JvmTypeReference _typeRef_5 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
-          final Procedure1<JvmOperation> _function_5 = new Procedure1<JvmOperation>() {
-            public void apply(final JvmOperation it) {
-              it.setVisibility(JvmVisibility.PUBLIC);
-              EList<JvmFormalParameter> _parameters = it.getParameters();
-              JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
-              JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(pckg, "dataRow", _typeRef);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-              it.setFinal(true);
-              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                public void apply(final ITreeAppendable it) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("reset();");
-                  _builder.newLine();
-                  String _entityDtoFQN = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                  _builder.append(_entityDtoFQN, "");
-                  _builder.append(" internal = new ");
-                  String _entityDtoFQN_1 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                  _builder.append(_entityDtoFQN_1, "");
-                  _builder.append("();");
-                  _builder.newLineIfNotEmpty();
-                  _builder.append("entity = internal;");
-                  _builder.newLine();
-                  _builder.append("generateData();");
-                  _builder.newLine();
-                  _builder.append("try {");
-                  _builder.newLine();
-                  it.append(_builder);
-                  EList<EntityMockByResourceAttribute> _byResourceAttributes = mockEntity.getByResourceAttributes();
-                  for (final EntityMockByResourceAttribute attribute : _byResourceAttributes) {
-                    StringConcatenation _builder_1 = new StringConcatenation();
-                    _builder_1.append("internal.set");
-                    LEntityAttribute _attributeRef = attribute.getAttributeRef();
-                    String _name = _attributeRef.getName();
-                    String _capitalize = WordUtils.capitalize(_name);
-                    _builder_1.append(_capitalize, "");
-                    _builder_1.append("(");
-                    LEntityAttribute _attributeRef_1 = attribute.getAttributeRef();
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    EntityMockResource _byResource = mockEntity.getByResource();
-                    String _name_1 = _byResource.getName();
-                    _builder_2.append(_name_1, "");
-                    _builder_2.append("_resource.getAttribute(dataRow.toString(), \"");
-                    EntityMockResourceAttribute _resourceAttribute = attribute.getResourceAttribute();
-                    String _name_2 = _resourceAttribute.getName();
-                    _builder_2.append(_name_2, "");
-                    _builder_2.append("\")");
-                    String _baseMockDataTypeCasting = EntityMockDSLJvmModelInferrer.this.baseMockDataTypeCasting(_attributeRef_1, _builder_2.toString());
-                    _builder_1.append(_baseMockDataTypeCasting, "");
-                    _builder_1.append(");");
-                    _builder_1.newLineIfNotEmpty();
-                    it.append(_builder_1);
-                  }
-                  StringConcatenation _builder_3 = new StringConcatenation();
-                  _builder_3.append("}");
-                  _builder_3.newLine();
-                  _builder_3.append("catch (Exception e) {");
-                  _builder_3.newLine();
-                  _builder_3.append("    ");
-                  _builder_3.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                  _builder_3.newLine();
-                  _builder_3.append("}");
-                  _builder_3.newLine();
-                  _builder_3.append("return entity;");
-                  it.append(_builder_3);
-                }
-              };
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-            }
-          };
-          JvmOperation _method_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_4.toString(), _typeRef_5, _function_5);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_1);
-        }
-        EList<EntityMockEntityFunction> _calculations = mockEntity.getCalculations();
-        for (final EntityMockEntityFunction calculation : _calculations) {
-          EList<JvmMember> _members_6 = it.getMembers();
-          StringConcatenation _builder_5 = new StringConcatenation();
-          _builder_5.append("calculate_");
-          LEntityAttribute _attributeRef = calculation.getAttributeRef();
-          String _name_2 = _attributeRef.getName();
-          _builder_5.append(_name_2, "");
-          LEntityAttribute _attributeRef_1 = calculation.getAttributeRef();
-          JvmTypeReference _jvmTypeRef = EntityMockDSLJvmModelInferrer.this.jvmTypeRef(_attributeRef_1);
-          final Procedure1<JvmOperation> _function_6 = new Procedure1<JvmOperation>() {
-            public void apply(final JvmOperation it) {
-              it.setVisibility(JvmVisibility.PROTECTED);
-              EList<EntityMockEntityFunctionParameter> _params = calculation.getParams();
-              for (final EntityMockEntityFunctionParameter param : _params) {
-                EList<JvmFormalParameter> _parameters = it.getParameters();
-                String _paramName = EntityMockDSLJvmModelInferrer.this.getParamName(param, "__");
-                JvmTypeReference _jvmType = EntityMockDSLJvmModelInferrer.this.getJvmType(param);
-                JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(param, _paramName, _jvmType);
-                EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-              }
-              it.setFinal(true);
-              XExpression _body = calculation.getBody();
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _body);
-            }
-          };
-          JvmOperation _method_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_5.toString(), _jvmTypeRef, _function_6);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, _method_2);
-        }
-        EList<JvmMember> _members_7 = it.getMembers();
-        StringConcatenation _builder_6 = new StringConcatenation();
-        _builder_6.append("generateDataRow");
-        JvmTypeReference _typeRef_6 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
-        final Procedure1<JvmOperation> _function_7 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            it.setVisibility(JvmVisibility.PROTECTED);
-            it.setFinal(true);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                EList<EntityMockTemporary> _temporaries = mockEntity.getTemporaries();
-                for (final EntityMockTemporary temporary : _temporaries) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("generateAttribute(\"");
-                  String _name = temporary.getName();
-                  _builder.append(_name, "");
-                  _builder.append("\", ");
-                  String _name_1 = temporary.getName();
-                  _builder.append(_name_1, "");
-                  _builder.append("_temporary);");
-                  _builder.newLineIfNotEmpty();
-                  it.append(_builder);
-                }
-                EList<IEntityMockAttribute> _attributes = mockEntity.getAttributes();
-                for (final IEntityMockAttribute attribute : _attributes) {
-                  boolean _matched = false;
-                  if (!_matched) {
-                    if (attribute instanceof EntityMockAttributeByObject) {
-                      _matched=true;
-                      EntityMockReferencedObjectAttribute _reference = ((EntityMockAttributeByObject)attribute).getReference();
-                      EntityMockTemporary _temporary = _reference.getTemporary();
-                      String sourceKey = _temporary.getName();
-                      EntityMockReferencedObjectAttribute _reference_1 = ((EntityMockAttributeByObject)attribute).getReference();
-                      EList<EntityMockObjectEmbed> _embedded = _reference_1.getEmbedded();
-                      for (final EntityMockObjectEmbed embed : _embedded) {
-                        StringConcatenation _builder_1 = new StringConcatenation();
-                        _builder_1.append(sourceKey, "");
-                        _builder_1.append(".");
-                        String _name_2 = embed.getName();
-                        _builder_1.append(_name_2, "");
-                        sourceKey = _builder_1.toString();
-                      }
-                      EntityMockReferencedObjectAttribute _reference_2 = ((EntityMockAttributeByObject)attribute).getReference();
-                      final IEntityMockObjectUsable refAttribute = _reference_2.getAttribute();
-                      if ((refAttribute instanceof EntityMockObjectEnum)) {
-                        StringConcatenation _builder_2 = new StringConcatenation();
-                        _builder_2.append(sourceKey, "");
-                        _builder_2.append(".");
-                        String _name_3 = ((EntityMockObjectEnum) refAttribute).getName();
-                        _builder_2.append(_name_3, "");
-                        sourceKey = _builder_2.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectPlainValue)) {
-                        StringConcatenation _builder_3 = new StringConcatenation();
-                        _builder_3.append(sourceKey, "");
-                        _builder_3.append(".");
-                        String _name_4 = ((EntityMockObjectPlainValue) refAttribute).getName();
-                        _builder_3.append(_name_4, "");
-                        sourceKey = _builder_3.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectResourceValue)) {
-                        StringConcatenation _builder_4 = new StringConcatenation();
-                        _builder_4.append(sourceKey, "");
-                        _builder_4.append(".");
-                        String _name_5 = ((EntityMockObjectResourceValue) refAttribute).getName();
-                        _builder_4.append(_name_5, "");
-                        sourceKey = _builder_4.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectArrayValue)) {
-                        StringConcatenation _builder_5 = new StringConcatenation();
-                        _builder_5.append(sourceKey, "");
-                        _builder_5.append(".");
-                        String _name_6 = ((EntityMockObjectArrayValue) refAttribute).getName();
-                        _builder_5.append(_name_6, "");
-                        sourceKey = _builder_5.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectEmbed)) {
-                        StringConcatenation _builder_6 = new StringConcatenation();
-                        _builder_6.append(sourceKey, "");
-                        _builder_6.append(".");
-                        String _name_7 = ((EntityMockObjectEmbed) refAttribute).getName();
-                        _builder_6.append(_name_7, "");
-                        sourceKey = _builder_6.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectFill)) {
-                        StringConcatenation _builder_7 = new StringConcatenation();
-                        _builder_7.append(sourceKey, "");
-                        _builder_7.append(".");
-                        String _name_8 = ((EntityMockObjectFill) refAttribute).getName();
-                        _builder_7.append(_name_8, "");
-                        sourceKey = _builder_7.toString();
-                      }
-                      if ((refAttribute instanceof EntityMockObjectFunction)) {
-                        StringConcatenation _builder_8 = new StringConcatenation();
-                        _builder_8.append(sourceKey, "");
-                        _builder_8.append(".");
-                        String _name_9 = ((EntityMockObjectFunction) refAttribute).getName();
-                        _builder_8.append(_name_9, "");
-                        sourceKey = _builder_8.toString();
-                      }
-                      StringConcatenation _builder_9 = new StringConcatenation();
-                      _builder_9.append("generateAttribute(\"");
-                      LEntityAttribute _attributeRef = ((EntityMockAttributeByObject)attribute).getAttributeRef();
-                      String _name_10 = _attributeRef.getName();
-                      _builder_9.append(_name_10, "");
-                      _builder_9.append("\", \"");
-                      _builder_9.append(sourceKey, "");
-                      _builder_9.append("\");");
-                      _builder_9.newLineIfNotEmpty();
-                      it.append(_builder_9);
-                    }
-                  }
-                  if (!_matched) {
-                    if (attribute instanceof EntityMockAttributeFiller) {
-                      _matched=true;
-                      PropertyFillerType type = ((EntityMockAttributeFiller)attribute).getFillerType();
-                      boolean _matched_1 = false;
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerDateFuture) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateDateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", 0 ,");
-                          int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
-                          _builder_1.append(_dateFutureYears, "");
-                          _builder_1.append(");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerDatePast) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateDateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", -");
-                          int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
-                          _builder_1.append(_datePastYears, "");
-                          _builder_1.append(", 0);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerDateRange) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateDateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
-                          _builder_1.append(_dateBeginYears, "");
-                          _builder_1.append(", ");
-                          int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
-                          _builder_1.append(_dateEndYears, "");
-                          _builder_1.append(");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerBoolean) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateBooleanAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerSignedDoubleRange) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
-                          _builder_1.append(_beginRange, "");
-                          String beginRange = _builder_1.toString();
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
-                          _builder_2.append(_endRange, "");
-                          String endRange = _builder_2.toString();
-                          LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
-                          boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                          if (_notEquals) {
-                            StringConcatenation _builder_3 = new StringConcatenation();
-                            _builder_3.append("get_\"");
-                            LEntityAttribute _beginRangeRef_1 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
-                            String _name_2 = _beginRangeRef_1.getName();
-                            _builder_3.append(_name_2, "");
-                            _builder_3.append("\"()");
-                            beginRange = _builder_3.toString();
-                          }
-                          LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
-                          boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                          if (_notEquals_1) {
-                            StringConcatenation _builder_4 = new StringConcatenation();
-                            _builder_4.append("get_\"");
-                            LEntityAttribute _endRangeRef_1 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
-                            String _name_3 = _endRangeRef_1.getName();
-                            _builder_4.append(_name_3, "");
-                            _builder_4.append("\"()");
-                            endRange = _builder_4.toString();
-                          }
-                          StringConcatenation _builder_5 = new StringConcatenation();
-                          _builder_5.append("generateSignedAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_4 = _attributeRef.getName();
-                          _builder_5.append(_name_4, "");
-                          _builder_5.append("\", ");
-                          int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
-                          _builder_5.append(_decimals, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(beginRange, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(endRange, "");
-                          _builder_5.append(", ");
-                          double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
-                          _builder_5.append(_rounded, "");
-                          _builder_5.append(");");
-                          _builder_5.newLineIfNotEmpty();
-                          it.append(_builder_5);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerSignedDoubleRandom) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_3 = _attributeRef_1.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("_items);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerUnsignedDoubleRange) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
-                          _builder_1.append(_beginRange, "");
-                          String beginRange = _builder_1.toString();
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
-                          _builder_2.append(_endRange, "");
-                          String endRange = _builder_2.toString();
-                          LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
-                          boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                          if (_notEquals) {
-                            StringConcatenation _builder_3 = new StringConcatenation();
-                            _builder_3.append("(double)get_\"");
-                            LEntityAttribute _beginRangeRef_1 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
-                            String _name_2 = _beginRangeRef_1.getName();
-                            _builder_3.append(_name_2, "");
-                            _builder_3.append("\"()");
-                            beginRange = _builder_3.toString();
-                          }
-                          LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
-                          boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                          if (_notEquals_1) {
-                            StringConcatenation _builder_4 = new StringConcatenation();
-                            _builder_4.append("(double)get_\"");
-                            LEntityAttribute _endRangeRef_1 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
-                            String _name_3 = _endRangeRef_1.getName();
-                            _builder_4.append(_name_3, "");
-                            _builder_4.append("\"()");
-                            endRange = _builder_4.toString();
-                          }
-                          StringConcatenation _builder_5 = new StringConcatenation();
-                          _builder_5.append("generateUnsignedAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_4 = _attributeRef.getName();
-                          _builder_5.append(_name_4, "");
-                          _builder_5.append("\", ");
-                          int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
-                          _builder_5.append(_decimals, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(beginRange, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(endRange, "");
-                          _builder_5.append(", ");
-                          double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
-                          _builder_5.append(_rounded, "");
-                          _builder_5.append(");");
-                          _builder_5.newLineIfNotEmpty();
-                          it.append(_builder_5);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerUnsignedDoubleRandom) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_3 = _attributeRef_1.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("_items);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerSignedIntegerRange) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
-                          _builder_1.append(_beginRange, "");
-                          String beginRange = _builder_1.toString();
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
-                          _builder_2.append(_endRange, "");
-                          String endRange = _builder_2.toString();
-                          LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
-                          boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                          if (_notEquals) {
-                            StringConcatenation _builder_3 = new StringConcatenation();
-                            _builder_3.append("(int)get_\"");
-                            LEntityAttribute _beginRangeRef_1 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
-                            String _name_2 = _beginRangeRef_1.getName();
-                            _builder_3.append(_name_2, "");
-                            _builder_3.append("\"()");
-                            beginRange = _builder_3.toString();
-                          }
-                          LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
-                          boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                          if (_notEquals_1) {
-                            StringConcatenation _builder_4 = new StringConcatenation();
-                            _builder_4.append("(int)get_\"");
-                            LEntityAttribute _endRangeRef_1 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
-                            String _name_3 = _endRangeRef_1.getName();
-                            _builder_4.append(_name_3, "");
-                            _builder_4.append("\"()");
-                            endRange = _builder_4.toString();
-                          }
-                          StringConcatenation _builder_5 = new StringConcatenation();
-                          _builder_5.append("generateSignedAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_4 = _attributeRef.getName();
-                          _builder_5.append(_name_4, "");
-                          _builder_5.append("\", ");
-                          _builder_5.append(beginRange, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(endRange, "");
-                          _builder_5.append(", ");
-                          int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
-                          _builder_5.append(_rounded, "");
-                          _builder_5.append(");");
-                          _builder_5.newLineIfNotEmpty();
-                          it.append(_builder_5);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerSignedIntegerRandom) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_3 = _attributeRef_1.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("_items);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerUnsignedIntegerRange) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
-                          _builder_1.append(_beginRange, "");
-                          String beginRange = _builder_1.toString();
-                          StringConcatenation _builder_2 = new StringConcatenation();
-                          int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
-                          _builder_2.append(_endRange, "");
-                          String endRange = _builder_2.toString();
-                          LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
-                          boolean _notEquals = (!Objects.equal(_beginRangeRef, null));
-                          if (_notEquals) {
-                            StringConcatenation _builder_3 = new StringConcatenation();
-                            _builder_3.append("(int)get_\"");
-                            LEntityAttribute _beginRangeRef_1 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
-                            String _name_2 = _beginRangeRef_1.getName();
-                            _builder_3.append(_name_2, "");
-                            _builder_3.append("\"()");
-                            beginRange = _builder_3.toString();
-                          }
-                          LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
-                          boolean _notEquals_1 = (!Objects.equal(_endRangeRef, null));
-                          if (_notEquals_1) {
-                            StringConcatenation _builder_4 = new StringConcatenation();
-                            _builder_4.append("(int)get_\"");
-                            LEntityAttribute _endRangeRef_1 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
-                            String _name_3 = _endRangeRef_1.getName();
-                            _builder_4.append(_name_3, "");
-                            _builder_4.append("\"()");
-                            endRange = _builder_4.toString();
-                          }
-                          StringConcatenation _builder_5 = new StringConcatenation();
-                          _builder_5.append("generateUnsignedAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_4 = _attributeRef.getName();
-                          _builder_5.append(_name_4, "");
-                          _builder_5.append("\", ");
-                          _builder_5.append(beginRange, "");
-                          _builder_5.append(", ");
-                          _builder_5.append(endRange, "");
-                          _builder_5.append(", ");
-                          int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
-                          _builder_5.append(_rounded, "");
-                          _builder_5.append(");");
-                          _builder_5.newLineIfNotEmpty();
-                          it.append(_builder_5);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerUnsignedIntegerRandom) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_3 = _attributeRef_1.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("_items);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerTextRandom) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_3 = _attributeRef_1.getName();
-                          _builder_1.append(_name_3, "");
-                          _builder_1.append("_items);");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerTextParagraphs) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateParagraphsAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          int _count = ((PropertyFillerTextParagraphs)type).getCount();
-                          _builder_1.append(_count, "");
-                          _builder_1.append(");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerTextSentences) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateSentencesAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          int _count = ((PropertyFillerTextSentences)type).getCount();
-                          _builder_1.append(_count, "");
-                          _builder_1.append(");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                      if (!_matched_1) {
-                        if (type instanceof PropertyFillerTextWords) {
-                          _matched_1=true;
-                          StringConcatenation _builder_1 = new StringConcatenation();
-                          _builder_1.append("generateWordsAttribute(\"");
-                          LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                          String _name_2 = _attributeRef.getName();
-                          _builder_1.append(_name_2, "");
-                          _builder_1.append("\", ");
-                          int _count = ((PropertyFillerTextWords)type).getCount();
-                          _builder_1.append(_count, "");
-                          _builder_1.append(");");
-                          _builder_1.newLineIfNotEmpty();
-                          it.append(_builder_1);
-                        }
-                      }
-                    }
-                  }
-                  if (!_matched) {
-                    if (attribute instanceof EntityMockAttributeByReference) {
-                      _matched=true;
-                      EntityMockEntity _mockedEntity = ((EntityMockAttributeByReference)attribute).getMockedEntity();
-                      boolean _equals = Objects.equal(_mockedEntity, null);
-                      if (_equals) {
-                        StringConcatenation _builder_1 = new StringConcatenation();
-                        _builder_1.append("generateAttribute(\"");
-                        LEntityReference _attributeRef = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        String _name_2 = _attributeRef.getName();
-                        _builder_1.append(_name_2, "");
-                        _builder_1.append("\", ");
-                        LEntityReference _attributeRef_1 = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        LEntity _type = _attributeRef_1.getType();
-                        String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(_type);
-                        _builder_1.append(_dtoFQNForLEntity, "");
-                        _builder_1.append(".class, ");
-                        int _optionalFor = ((EntityMockAttributeByReference)attribute).getOptionalFor();
-                        _builder_1.append((((double) _optionalFor) / 100.0), "");
-                        _builder_1.append(");");
-                        _builder_1.newLineIfNotEmpty();
-                        it.append(_builder_1);
-                      } else {
-                        StringConcatenation _builder_2 = new StringConcatenation();
-                        _builder_2.append("generateAttribute(\"");
-                        LEntityReference _attributeRef_2 = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        String _name_3 = _attributeRef_2.getName();
-                        _builder_2.append(_name_3, "");
-                        _builder_2.append("\", \"");
-                        EntityMockEntity _mockedEntity_1 = ((EntityMockAttributeByReference)attribute).getMockedEntity();
-                        String _name_4 = _mockedEntity_1.getName();
-                        _builder_2.append(_name_4, "");
-                        _builder_2.append("\", ");
-                        int _optionalFor_1 = ((EntityMockAttributeByReference)attribute).getOptionalFor();
-                        _builder_2.append((((double) _optionalFor_1) / 100.0), "");
-                        _builder_2.append(");");
-                        _builder_2.newLineIfNotEmpty();
-                        it.append(_builder_2);
-                      }
-                    }
-                  }
-                }
-                EList<EntityMockEntityFunction> _calculations = mockEntity.getCalculations();
-                for (final EntityMockEntityFunction calculation : _calculations) {
-                  {
-                    String doc = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(calculation);
-                    boolean _and = false;
-                    if (!(doc instanceof String)) {
-                      _and = false;
-                    } else {
-                      String _trim = doc.trim();
-                      boolean _isEmpty = _trim.isEmpty();
-                      boolean _not = (!_isEmpty);
-                      _and = _not;
-                    }
-                    if (_and) {
-                      StringConcatenation _builder_1 = new StringConcatenation();
-                      _builder_1.append("/** ");
-                      _builder_1.append(doc, "");
-                      _builder_1.append(" */");
-                      _builder_1.newLineIfNotEmpty();
-                      it.append(_builder_1);
-                    }
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    String paramString = _builder_2.toString();
-                    EList<EntityMockEntityFunctionParameter> _params = calculation.getParams();
-                    for (final EntityMockEntityFunctionParameter param : _params) {
-                      {
-                        boolean _isEmpty_1 = paramString.isEmpty();
-                        boolean _not_1 = (!_isEmpty_1);
-                        if (_not_1) {
-                          StringConcatenation _builder_3 = new StringConcatenation();
-                          _builder_3.append(paramString, "");
-                          _builder_3.append(",");
-                          paramString = _builder_3.toString();
-                        }
-                        LEntityAttribute _attributeRef = param.getAttributeRef();
-                        boolean _notEquals = (!Objects.equal(_attributeRef, null));
-                        if (_notEquals) {
-                          StringConcatenation _builder_4 = new StringConcatenation();
-                          _builder_4.append(paramString, "");
-                          _builder_4.append("(");
-                          JvmTypeReference _jvmType = EntityMockDSLJvmModelInferrer.this.getJvmType(param);
-                          String _identifier = _jvmType.getIdentifier();
-                          _builder_4.append(_identifier, "");
-                          _builder_4.append(")getAttribute(\"");
-                          String _paramName = EntityMockDSLJvmModelInferrer.this.getParamName(param, ".");
-                          _builder_4.append(_paramName, "");
-                          _builder_4.append("\")");
-                          paramString = _builder_4.toString();
-                        } else {
-                          boolean _isReferenceOnExistingDto = EntityMockDSLJvmModelInferrer.this.isReferenceOnExistingDto(param);
-                          if (_isReferenceOnExistingDto) {
-                            StringConcatenation _builder_5 = new StringConcatenation();
-                            _builder_5.append(paramString, "");
-                            _builder_5.append("(");
-                            JvmTypeReference _jvmType_1 = EntityMockDSLJvmModelInferrer.this.getJvmType(param);
-                            String _identifier_1 = _jvmType_1.getIdentifier();
-                            _builder_5.append(_identifier_1, "");
-                            _builder_5.append(")((");
-                            EList<LEntityReference> _referencePaths = param.getReferencePaths();
-                            LEntityReference _get = _referencePaths.get(0);
-                            LEntity _type = _get.getType();
-                            String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(_type);
-                            _builder_5.append(_dtoFQNForLEntity, "");
-                            _builder_5.append(")getAttribute(\"");
-                            EList<LEntityReference> _referencePaths_1 = param.getReferencePaths();
-                            LEntityReference _get_1 = _referencePaths_1.get(0);
-                            String _name_2 = _get_1.getName();
-                            _builder_5.append(_name_2, "");
-                            _builder_5.append("\", mockDataGenerator, persistenceUnit)).get");
-                            LEntityAttribute _referenceRef = param.getReferenceRef();
-                            String _name_3 = _referenceRef.getName();
-                            String _firstUpper = StringExtensions.toFirstUpper(_name_3);
-                            _builder_5.append(_firstUpper, "");
-                            _builder_5.append("()");
-                            paramString = _builder_5.toString();
-                          } else {
-                            StringConcatenation _builder_6 = new StringConcatenation();
-                            _builder_6.append(paramString, "");
-                            _builder_6.append("(");
-                            JvmTypeReference _jvmType_2 = EntityMockDSLJvmModelInferrer.this.getJvmType(param);
-                            String _identifier_2 = _jvmType_2.getIdentifier();
-                            _builder_6.append(_identifier_2, "");
-                            _builder_6.append(")getAttribute(\"");
-                            String _paramName_1 = EntityMockDSLJvmModelInferrer.this.getParamName(param, ".");
-                            _builder_6.append(_paramName_1, "");
-                            _builder_6.append("\", mockDataGenerator, persistenceUnit)");
-                            paramString = _builder_6.toString();
-                          }
-                        }
-                      }
-                    }
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append("try {");
-                    _builder_3.newLine();
-                    _builder_3.append("\t");
-                    _builder_3.append("setFixAttribute(\"");
-                    LEntityAttribute _attributeRef = calculation.getAttributeRef();
-                    String _name_2 = _attributeRef.getName();
-                    _builder_3.append(_name_2, "\t");
-                    _builder_3.append("\", calculate_");
-                    LEntityAttribute _attributeRef_1 = calculation.getAttributeRef();
-                    String _name_3 = _attributeRef_1.getName();
-                    _builder_3.append(_name_3, "\t");
-                    _builder_3.append("(");
-                    _builder_3.append(paramString, "\t");
-                    _builder_3.append("));");
-                    _builder_3.newLineIfNotEmpty();
-                    _builder_3.append("}");
-                    _builder_3.newLine();
-                    _builder_3.append("catch (NullPointerException npe) {}");
-                    _builder_3.newLine();
-                    _builder_3.append("catch (Exception e) {");
-                    _builder_3.newLine();
-                    _builder_3.append("    ");
-                    _builder_3.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                    _builder_3.newLine();
-                    _builder_3.append("}");
-                    _builder_3.newLine();
-                    it.append(_builder_3);
-                  }
-                }
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
+          this._jvmTypesBuilder.setInitializer(it_1, _function_5);
+          this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(template));
+          it_1.setVisibility(JvmVisibility.PRIVATE);
+          it_1.setStatic(true);
         };
-        JvmOperation _method_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_6.toString(), _typeRef_6, _function_7);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, _method_3);
-        EntityMockResource _byResource_3 = mockEntity.getByResource();
-        boolean _equals = Objects.equal(_byResource_3, null);
-        if (_equals) {
-          EList<JvmMember> _members_8 = it.getMembers();
-          StringConcatenation _builder_7 = new StringConcatenation();
-          _builder_7.append("generateEntity");
-          JvmTypeReference _typeRef_7 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
-          final Procedure1<JvmOperation> _function_8 = new Procedure1<JvmOperation>() {
-            public void apply(final JvmOperation it) {
-              it.setVisibility(JvmVisibility.PUBLIC);
-              EList<JvmFormalParameter> _parameters = it.getParameters();
-              JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Object.class);
-              JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(mockEntity, "dataRow", _typeRef);
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-              it.setFinal(true);
-              final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-                public void apply(final ITreeAppendable it) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("reset();");
-                  _builder.newLine();
-                  it.append(_builder);
-                  LEntityAttribute _iterator = mockEntity.getIterator();
-                  boolean _notEquals = (!Objects.equal(_iterator, null));
-                  if (_notEquals) {
-                    StringConcatenation _builder_1 = new StringConcatenation();
-                    _builder_1.append("setFixAttribute(\"");
-                    LEntityAttribute _iterator_1 = mockEntity.getIterator();
-                    String _name = _iterator_1.getName();
-                    _builder_1.append(_name, "");
-                    _builder_1.append("\", dataRow);");
-                    _builder_1.newLineIfNotEmpty();
-                    it.append(_builder_1);
-                  }
+        JvmField _field_1 = this._jvmTypesBuilder.toField(model, _builder_1.toString(), 
+          this._typeReferenceBuilder.typeRef(ABaseMockObject.class), _function_4);
+        this._jvmTypesBuilder.<JvmField>operator_add(_members_3, _field_1);
+      }
+      EList<IEntityMockAttribute> _attributes = mockEntity.getAttributes();
+      for (final IEntityMockAttribute attribute : _attributes) {
+        boolean _matched = false;
+        if (attribute instanceof EntityMockAttributeByObject) {
+          _matched=true;
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockAttributeFiller) {
+            _matched=true;
+            PropertyFillerType type = ((EntityMockAttributeFiller)attribute).getFillerType();
+            boolean _matched_1 = false;
+            if (type instanceof PropertyFillerTextRandom) {
+              _matched_1=true;
+              final List<String> items = new ArrayList<String>();
+              EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
+              for (final String item : _items) {
+                StringConcatenation _builder_2 = new StringConcatenation();
+                _builder_2.append("\"");
+                _builder_2.append(item);
+                _builder_2.append("\"");
+                items.add(_builder_2.toString());
+              }
+              EList<JvmMember> _members_4 = it.getMembers();
+              StringConcatenation _builder_3 = new StringConcatenation();
+              String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
+              _builder_3.append(_name_2);
+              _builder_3.append("_items");
+              final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
+                final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+                  StringConcatenation _builder_4 = new StringConcatenation();
+                  _builder_4.append("{");
+                  String _join = StringUtils.join(items, ",");
+                  _builder_4.append(_join);
+                  _builder_4.append("}");
+                  it_2.append(_builder_4);
+                };
+                this._jvmTypesBuilder.setInitializer(it_1, _function_6);
+                this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                it_1.setVisibility(JvmVisibility.PRIVATE);
+                it_1.setStatic(true);
+              };
+              JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
+                this._typeReferenceBuilder.typeRef(Object[].class), _function_5);
+              this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerSignedDoubleRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
+                for (final Double item : _items) {
                   StringConcatenation _builder_2 = new StringConcatenation();
-                  String _entityDtoFQN = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                  _builder_2.append(_entityDtoFQN, "");
-                  _builder_2.append(" internal = new ");
-                  String _entityDtoFQN_1 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                  _builder_2.append(_entityDtoFQN_1, "");
-                  _builder_2.append("();");
-                  _builder_2.newLineIfNotEmpty();
-                  _builder_2.append("entity = internal;");
-                  _builder_2.newLine();
-                  _builder_2.append("generateData();");
-                  _builder_2.newLine();
-                  _builder_2.append("mockDataGenerator.addDtoMockData(internal, mockData);");
-                  _builder_2.newLine();
-                  _builder_2.append("try {");
-                  _builder_2.newLine();
-                  it.append(_builder_2);
-                  EList<IEntityMockAttribute> _attributes = mockEntity.getAttributes();
-                  for (final IEntityMockAttribute attribute : _attributes) {
-                    boolean _matched = false;
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockAttributeByObject) {
-                        _matched=true;
-                        StringConcatenation _builder_3 = new StringConcatenation();
-                        _builder_3.append("internal.set");
-                        LEntityAttribute _attributeRef = ((EntityMockAttributeByObject)attribute).getAttributeRef();
-                        String _name_1 = _attributeRef.getName();
-                        String _capitalize = WordUtils.capitalize(_name_1);
-                        _builder_3.append(_capitalize, "");
-                        _builder_3.append("(");
-                        LEntityAttribute _attributeRef_1 = ((EntityMockAttributeByObject)attribute).getAttributeRef();
-                        StringConcatenation _builder_4 = new StringConcatenation();
-                        _builder_4.append("mockData.get(\"");
-                        LEntityAttribute _attributeRef_2 = ((EntityMockAttributeByObject)attribute).getAttributeRef();
-                        String _name_2 = _attributeRef_2.getName();
-                        _builder_4.append(_name_2, "");
-                        _builder_4.append("\")");
-                        String _baseMockDataTypeCasting = EntityMockDSLJvmModelInferrer.this.baseMockDataTypeCasting(_attributeRef_1, _builder_4.toString());
-                        _builder_3.append(_baseMockDataTypeCasting, "");
-                        _builder_3.append(");");
-                        _builder_3.newLineIfNotEmpty();
-                        it.append(_builder_3);
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockAttributeFiller) {
-                        _matched=true;
-                        StringConcatenation _builder_3 = new StringConcatenation();
-                        _builder_3.append("internal.set");
-                        LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                        String _name_1 = _attributeRef.getName();
-                        String _capitalize = WordUtils.capitalize(_name_1);
-                        _builder_3.append(_capitalize, "");
-                        _builder_3.append("(");
-                        LEntityAttribute _attributeRef_1 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                        StringConcatenation _builder_4 = new StringConcatenation();
-                        _builder_4.append("mockData.get(\"");
-                        LEntityAttribute _attributeRef_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef();
-                        String _name_2 = _attributeRef_2.getName();
-                        _builder_4.append(_name_2, "");
-                        _builder_4.append("\")");
-                        String _baseMockDataTypeCasting = EntityMockDSLJvmModelInferrer.this.baseMockDataTypeCasting(_attributeRef_1, _builder_4.toString());
-                        _builder_3.append(_baseMockDataTypeCasting, "");
-                        _builder_3.append(");");
-                        _builder_3.newLineIfNotEmpty();
-                        it.append(_builder_3);
-                      }
-                    }
-                    if (!_matched) {
-                      if (attribute instanceof EntityMockAttributeByReference) {
-                        _matched=true;
-                        StringConcatenation _builder_3 = new StringConcatenation();
-                        _builder_3.append("internal.set");
-                        LEntityReference _attributeRef = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        String _name_1 = _attributeRef.getName();
-                        String _capitalize = WordUtils.capitalize(_name_1);
-                        _builder_3.append(_capitalize, "");
-                        _builder_3.append("((");
-                        LEntityReference _attributeRef_1 = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        LEntity _type = _attributeRef_1.getType();
-                        String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(_type);
-                        _builder_3.append(_dtoFQNForLEntity, "");
-                        _builder_3.append(")mockData.get(\"");
-                        LEntityReference _attributeRef_2 = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-                        String _name_2 = _attributeRef_2.getName();
-                        _builder_3.append(_name_2, "");
-                        _builder_3.append("\"));");
-                        _builder_3.newLineIfNotEmpty();
-                        it.append(_builder_3);
-                      }
-                    }
-                  }
-                  EList<EntityMockEntityFunction> _calculations = mockEntity.getCalculations();
-                  for (final EntityMockEntityFunction calculation : _calculations) {
-                    StringConcatenation _builder_3 = new StringConcatenation();
-                    _builder_3.append("internal.set");
-                    LEntityAttribute _attributeRef = calculation.getAttributeRef();
-                    String _name_1 = _attributeRef.getName();
-                    String _capitalize = WordUtils.capitalize(_name_1);
-                    _builder_3.append(_capitalize, "");
-                    _builder_3.append("(");
-                    LEntityAttribute _attributeRef_1 = calculation.getAttributeRef();
-                    StringConcatenation _builder_4 = new StringConcatenation();
-                    _builder_4.append("mockData.get(\"");
-                    LEntityAttribute _attributeRef_2 = calculation.getAttributeRef();
-                    String _name_2 = _attributeRef_2.getName();
-                    _builder_4.append(_name_2, "");
-                    _builder_4.append("\")");
-                    String _baseMockDataTypeCasting = EntityMockDSLJvmModelInferrer.this.baseMockDataTypeCasting(_attributeRef_1, _builder_4.toString());
-                    _builder_3.append(_baseMockDataTypeCasting, "");
-                    _builder_3.append(");");
-                    _builder_3.newLineIfNotEmpty();
-                    it.append(_builder_3);
-                  }
-                  StringConcatenation _builder_5 = new StringConcatenation();
-                  _builder_5.append("}");
-                  _builder_5.newLine();
-                  _builder_5.append("catch (Exception e) {");
-                  _builder_5.newLine();
-                  _builder_5.append("    ");
-                  _builder_5.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                  _builder_5.newLine();
-                  _builder_5.append("}");
-                  _builder_5.newLine();
-                  _builder_5.append("return entity;");
-                  it.append(_builder_5);
+                  _builder_2.append(item);
+                  items.add(_builder_2.toString());
                 }
-              };
-              EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+                EList<JvmMember> _members_4 = it.getMembers();
+                StringConcatenation _builder_3 = new StringConcatenation();
+                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
+                _builder_3.append(_name_2);
+                _builder_3.append("_items");
+                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_4.append(_join);
+                    _builder_4.append("}");
+                    it_2.append(_builder_4);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
+                  this._typeReferenceBuilder.typeRef(double[].class), _function_5);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
+              }
             }
-          };
-          JvmOperation _method_4 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_7.toString(), _typeRef_7, _function_8);
-          EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, _method_4);
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerUnsignedDoubleRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
+                for (final Double item : _items) {
+                  StringConcatenation _builder_2 = new StringConcatenation();
+                  _builder_2.append(item);
+                  items.add(_builder_2.toString());
+                }
+                EList<JvmMember> _members_4 = it.getMembers();
+                StringConcatenation _builder_3 = new StringConcatenation();
+                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
+                _builder_3.append(_name_2);
+                _builder_3.append("_items");
+                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_4.append(_join);
+                    _builder_4.append("}");
+                    it_2.append(_builder_4);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
+                  this._typeReferenceBuilder.typeRef(double[].class), _function_5);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
+              }
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerSignedIntegerRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
+                for (final Integer item : _items) {
+                  StringConcatenation _builder_2 = new StringConcatenation();
+                  _builder_2.append(item);
+                  items.add(_builder_2.toString());
+                }
+                EList<JvmMember> _members_4 = it.getMembers();
+                StringConcatenation _builder_3 = new StringConcatenation();
+                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
+                _builder_3.append(_name_2);
+                _builder_3.append("_items");
+                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_4.append(_join);
+                    _builder_4.append("}");
+                    it_2.append(_builder_4);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
+                  this._typeReferenceBuilder.typeRef(int[].class), _function_5);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
+              }
+            }
+            if (!_matched_1) {
+              if (type instanceof PropertyFillerUnsignedIntegerRandom) {
+                _matched_1=true;
+                final List<String> items = new ArrayList<String>();
+                EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
+                for (final Integer item : _items) {
+                  StringConcatenation _builder_2 = new StringConcatenation();
+                  _builder_2.append(item);
+                  items.add(_builder_2.toString());
+                }
+                EList<JvmMember> _members_4 = it.getMembers();
+                StringConcatenation _builder_3 = new StringConcatenation();
+                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
+                _builder_3.append(_name_2);
+                _builder_3.append("_items");
+                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
+                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+                    StringConcatenation _builder_4 = new StringConcatenation();
+                    _builder_4.append("{");
+                    String _join = StringUtils.join(items, ",");
+                    _builder_4.append(_join);
+                    _builder_4.append("}");
+                    it_2.append(_builder_4);
+                  };
+                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
+                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
+                  it_1.setVisibility(JvmVisibility.PRIVATE);
+                  it_1.setStatic(true);
+                };
+                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
+                  this._typeReferenceBuilder.typeRef(int[].class), _function_5);
+                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
+              }
+            }
+          }
+        }
+        if (!_matched) {
+          if (attribute instanceof EntityMockAttributeByReference) {
+            _matched=true;
+          }
         }
       }
+      EntityMockResource _byResource_1 = mockEntity.getByResource();
+      boolean _tripleNotEquals_1 = (_byResource_1 != null);
+      if (_tripleNotEquals_1) {
+        EList<JvmMember> _members_4 = it.getMembers();
+        StringConcatenation _builder_2 = new StringConcatenation();
+        _builder_2.append("getDataRows");
+        final Procedure1<JvmOperation> _function_5 = (JvmOperation it_1) -> {
+          it_1.setVisibility(JvmVisibility.PUBLIC);
+          it_1.setFinal(true);
+          final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+            StringConcatenation _builder_3 = new StringConcatenation();
+            _builder_3.append("return ");
+            String _name_2 = mockEntity.getByResource().getName();
+            _builder_3.append(_name_2);
+            _builder_3.append("_resource.getDataRows();");
+            it_2.append(_builder_3);
+          };
+          this._jvmTypesBuilder.setBody(it_1, _function_6);
+        };
+        JvmOperation _method = this._jvmTypesBuilder.toMethod(model, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Set.class), _function_5);
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method);
+        EList<JvmMember> _members_5 = it.getMembers();
+        StringConcatenation _builder_3 = new StringConcatenation();
+        _builder_3.append("generateEntity");
+        final Procedure1<JvmOperation> _function_6 = (JvmOperation it_1) -> {
+          it_1.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmFormalParameter> _parameters = it_1.getParameters();
+          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(model, "dataRow", this._typeReferenceBuilder.typeRef(Object.class));
+          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+          it_1.setFinal(true);
+          final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_2) -> {
+            StringConcatenation _builder_4 = new StringConcatenation();
+            _builder_4.append("reset();");
+            _builder_4.newLine();
+            String _entityDtoFQN = this.entityDtoFQN(mockEntity);
+            _builder_4.append(_entityDtoFQN);
+            _builder_4.append(" internal = new ");
+            String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
+            _builder_4.append(_entityDtoFQN_1);
+            _builder_4.append("();");
+            _builder_4.newLineIfNotEmpty();
+            _builder_4.append("entity = internal;");
+            _builder_4.newLine();
+            _builder_4.append("generateData();");
+            _builder_4.newLine();
+            _builder_4.append("try {");
+            _builder_4.newLine();
+            it_2.append(_builder_4);
+            EList<EntityMockByResourceAttribute> _byResourceAttributes = mockEntity.getByResourceAttributes();
+            for (final EntityMockByResourceAttribute attribute_1 : _byResourceAttributes) {
+              StringConcatenation _builder_5 = new StringConcatenation();
+              _builder_5.append("internal.set");
+              String _capitalize = WordUtils.capitalize(attribute_1.getAttributeRef().getName());
+              _builder_5.append(_capitalize);
+              _builder_5.append("(");
+              LEntityAttribute _attributeRef = attribute_1.getAttributeRef();
+              StringConcatenation _builder_6 = new StringConcatenation();
+              String _name_2 = mockEntity.getByResource().getName();
+              _builder_6.append(_name_2);
+              _builder_6.append("_resource.getAttribute(dataRow.toString(), \"");
+              String _name_3 = attribute_1.getResourceAttribute().getName();
+              _builder_6.append(_name_3);
+              _builder_6.append("\")");
+              String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_6.toString());
+              _builder_5.append(_baseMockDataTypeCasting);
+              _builder_5.append(");");
+              _builder_5.newLineIfNotEmpty();
+              it_2.append(_builder_5);
+            }
+            StringConcatenation _builder_7 = new StringConcatenation();
+            _builder_7.append("}");
+            _builder_7.newLine();
+            _builder_7.append("catch (Exception e) {");
+            _builder_7.newLine();
+            _builder_7.append("    ");
+            _builder_7.append("log.error(e.getLocalizedMessage()+e.getCause());");
+            _builder_7.newLine();
+            _builder_7.append("}");
+            _builder_7.newLine();
+            _builder_7.append("return entity;");
+            it_2.append(_builder_7);
+          };
+          this._jvmTypesBuilder.setBody(it_1, _function_7);
+        };
+        JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(model, _builder_3.toString(), this._typeReferenceBuilder.typeRef(Object.class), _function_6);
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_1);
+      }
+      EList<EntityMockEntityFunction> _calculations = mockEntity.getCalculations();
+      for (final EntityMockEntityFunction calculation : _calculations) {
+        EList<JvmMember> _members_6 = it.getMembers();
+        StringConcatenation _builder_4 = new StringConcatenation();
+        _builder_4.append("calculate_");
+        String _name_2 = calculation.getAttributeRef().getName();
+        _builder_4.append(_name_2);
+        final Procedure1<JvmOperation> _function_7 = (JvmOperation it_1) -> {
+          it_1.setVisibility(JvmVisibility.PROTECTED);
+          EList<EntityMockEntityFunctionParameter> _params = calculation.getParams();
+          for (final EntityMockEntityFunctionParameter param : _params) {
+            EList<JvmFormalParameter> _parameters = it_1.getParameters();
+            JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(param, this.getParamName(param, "__"), this.getJvmType(param));
+            this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+          }
+          it_1.setFinal(true);
+          this._jvmTypesBuilder.setBody(it_1, calculation.getBody());
+        };
+        JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(model, _builder_4.toString(), 
+          this.jvmTypeRef(calculation.getAttributeRef()), _function_7);
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, _method_2);
+      }
+      EList<JvmMember> _members_7 = it.getMembers();
+      StringConcatenation _builder_5 = new StringConcatenation();
+      _builder_5.append("generateDataRow");
+      final Procedure1<JvmOperation> _function_8 = (JvmOperation it_1) -> {
+        it_1.setVisibility(JvmVisibility.PROTECTED);
+        it_1.setFinal(true);
+        final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_2) -> {
+          EList<EntityMockTemplate> _templates_1 = mockEntity.getTemplates();
+          for (final EntityMockTemplate template_1 : _templates_1) {
+            StringConcatenation _builder_6 = new StringConcatenation();
+            _builder_6.append("generateAttribute(\"");
+            String _name_3 = template_1.getName();
+            _builder_6.append(_name_3);
+            _builder_6.append("\", ");
+            String _name_4 = template_1.getName();
+            _builder_6.append(_name_4);
+            _builder_6.append("_template);");
+            _builder_6.newLineIfNotEmpty();
+            it_2.append(_builder_6);
+          }
+          EList<IEntityMockAttribute> _attributes_1 = mockEntity.getAttributes();
+          for (final IEntityMockAttribute attribute_1 : _attributes_1) {
+            boolean _matched_1 = false;
+            if (attribute_1 instanceof EntityMockAttributeByObject) {
+              _matched_1=true;
+              String sourceKey = ((EntityMockAttributeByObject)attribute_1).getReference().getTemplate().getName();
+              EList<EntityMockObjectEmbed> _embedded = ((EntityMockAttributeByObject)attribute_1).getReference().getEmbedded();
+              for (final EntityMockObjectEmbed embed : _embedded) {
+                StringConcatenation _builder_7 = new StringConcatenation();
+                _builder_7.append(sourceKey);
+                _builder_7.append(".");
+                String _name_5 = embed.getName();
+                _builder_7.append(_name_5);
+                sourceKey = _builder_7.toString();
+              }
+              final IEntityMockObjectUsable refAttribute = ((EntityMockAttributeByObject)attribute_1).getReference().getAttribute();
+              if ((refAttribute instanceof EntityMockObjectEnum)) {
+                StringConcatenation _builder_8 = new StringConcatenation();
+                _builder_8.append(sourceKey);
+                _builder_8.append(".");
+                String _name_6 = ((EntityMockObjectEnum) refAttribute).getName();
+                _builder_8.append(_name_6);
+                sourceKey = _builder_8.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectPlainValue)) {
+                StringConcatenation _builder_9 = new StringConcatenation();
+                _builder_9.append(sourceKey);
+                _builder_9.append(".");
+                String _name_7 = ((EntityMockObjectPlainValue) refAttribute).getName();
+                _builder_9.append(_name_7);
+                sourceKey = _builder_9.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectResourceValue)) {
+                StringConcatenation _builder_10 = new StringConcatenation();
+                _builder_10.append(sourceKey);
+                _builder_10.append(".");
+                String _name_8 = ((EntityMockObjectResourceValue) refAttribute).getName();
+                _builder_10.append(_name_8);
+                sourceKey = _builder_10.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectArrayValue)) {
+                StringConcatenation _builder_11 = new StringConcatenation();
+                _builder_11.append(sourceKey);
+                _builder_11.append(".");
+                String _name_9 = ((EntityMockObjectArrayValue) refAttribute).getName();
+                _builder_11.append(_name_9);
+                sourceKey = _builder_11.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectEmbed)) {
+                StringConcatenation _builder_12 = new StringConcatenation();
+                _builder_12.append(sourceKey);
+                _builder_12.append(".");
+                String _name_10 = ((EntityMockObjectEmbed) refAttribute).getName();
+                _builder_12.append(_name_10);
+                sourceKey = _builder_12.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectFill)) {
+                StringConcatenation _builder_13 = new StringConcatenation();
+                _builder_13.append(sourceKey);
+                _builder_13.append(".");
+                String _name_11 = ((EntityMockObjectFill) refAttribute).getName();
+                _builder_13.append(_name_11);
+                sourceKey = _builder_13.toString();
+              }
+              if ((refAttribute instanceof EntityMockObjectFunction)) {
+                StringConcatenation _builder_14 = new StringConcatenation();
+                _builder_14.append(sourceKey);
+                _builder_14.append(".");
+                String _name_12 = ((EntityMockObjectFunction) refAttribute).getName();
+                _builder_14.append(_name_12);
+                sourceKey = _builder_14.toString();
+              }
+              StringConcatenation _builder_15 = new StringConcatenation();
+              _builder_15.append("generateAttribute(\"");
+              String _name_13 = ((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName();
+              _builder_15.append(_name_13);
+              _builder_15.append("\", \"");
+              _builder_15.append(sourceKey);
+              _builder_15.append("\");");
+              _builder_15.newLineIfNotEmpty();
+              it_2.append(_builder_15);
+            }
+            if (!_matched_1) {
+              if (attribute_1 instanceof EntityMockAttributeFiller) {
+                _matched_1=true;
+                PropertyFillerType type = ((EntityMockAttributeFiller)attribute_1).getFillerType();
+                boolean _matched_2 = false;
+                if (type instanceof PropertyFillerDateFuture) {
+                  _matched_2=true;
+                  StringConcatenation _builder_7 = new StringConcatenation();
+                  _builder_7.append("generateDateAttribute(\"");
+                  String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                  _builder_7.append(_name_5);
+                  _builder_7.append("\", 0 ,");
+                  int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
+                  _builder_7.append(_dateFutureYears);
+                  _builder_7.append(");");
+                  _builder_7.newLineIfNotEmpty();
+                  it_2.append(_builder_7);
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerDatePast) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateDateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", -");
+                    int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
+                    _builder_7.append(_datePastYears);
+                    _builder_7.append(", 0);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerDateRange) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateDateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
+                    _builder_7.append(_dateBeginYears);
+                    _builder_7.append(", ");
+                    int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
+                    _builder_7.append(_dateEndYears);
+                    _builder_7.append(");");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerBoolean) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateBooleanAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\");");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerSignedDoubleRange) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
+                    _builder_7.append(_beginRange);
+                    String beginRange = _builder_7.toString();
+                    StringConcatenation _builder_8 = new StringConcatenation();
+                    double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
+                    _builder_8.append(_endRange);
+                    String endRange = _builder_8.toString();
+                    LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
+                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
+                    if (_tripleNotEquals_2) {
+                      StringConcatenation _builder_9 = new StringConcatenation();
+                      _builder_9.append("get_\"");
+                      String _name_5 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef().getName();
+                      _builder_9.append(_name_5);
+                      _builder_9.append("\"()");
+                      beginRange = _builder_9.toString();
+                    }
+                    LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
+                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
+                    if (_tripleNotEquals_3) {
+                      StringConcatenation _builder_10 = new StringConcatenation();
+                      _builder_10.append("get_\"");
+                      String _name_6 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef().getName();
+                      _builder_10.append(_name_6);
+                      _builder_10.append("\"()");
+                      endRange = _builder_10.toString();
+                    }
+                    StringConcatenation _builder_11 = new StringConcatenation();
+                    _builder_11.append("generateSignedAttribute(\"");
+                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_11.append(_name_7);
+                    _builder_11.append("\", ");
+                    int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
+                    _builder_11.append(_decimals);
+                    _builder_11.append(", ");
+                    _builder_11.append(beginRange);
+                    _builder_11.append(", ");
+                    _builder_11.append(endRange);
+                    _builder_11.append(", ");
+                    double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
+                    _builder_11.append(_rounded);
+                    _builder_11.append(");");
+                    _builder_11.newLineIfNotEmpty();
+                    it_2.append(_builder_11);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerSignedDoubleRandom) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_6);
+                    _builder_7.append("_items);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerUnsignedDoubleRange) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
+                    _builder_7.append(_beginRange);
+                    String beginRange = _builder_7.toString();
+                    StringConcatenation _builder_8 = new StringConcatenation();
+                    double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
+                    _builder_8.append(_endRange);
+                    String endRange = _builder_8.toString();
+                    LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
+                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
+                    if (_tripleNotEquals_2) {
+                      StringConcatenation _builder_9 = new StringConcatenation();
+                      _builder_9.append("(double)get_\"");
+                      String _name_5 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef().getName();
+                      _builder_9.append(_name_5);
+                      _builder_9.append("\"()");
+                      beginRange = _builder_9.toString();
+                    }
+                    LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
+                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
+                    if (_tripleNotEquals_3) {
+                      StringConcatenation _builder_10 = new StringConcatenation();
+                      _builder_10.append("(double)get_\"");
+                      String _name_6 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef().getName();
+                      _builder_10.append(_name_6);
+                      _builder_10.append("\"()");
+                      endRange = _builder_10.toString();
+                    }
+                    StringConcatenation _builder_11 = new StringConcatenation();
+                    _builder_11.append("generateUnsignedAttribute(\"");
+                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_11.append(_name_7);
+                    _builder_11.append("\", ");
+                    int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
+                    _builder_11.append(_decimals);
+                    _builder_11.append(", ");
+                    _builder_11.append(beginRange);
+                    _builder_11.append(", ");
+                    _builder_11.append(endRange);
+                    _builder_11.append(", ");
+                    double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
+                    _builder_11.append(_rounded);
+                    _builder_11.append(");");
+                    _builder_11.newLineIfNotEmpty();
+                    it_2.append(_builder_11);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerUnsignedDoubleRandom) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_6);
+                    _builder_7.append("_items);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerSignedIntegerRange) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
+                    _builder_7.append(_beginRange);
+                    String beginRange = _builder_7.toString();
+                    StringConcatenation _builder_8 = new StringConcatenation();
+                    int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
+                    _builder_8.append(_endRange);
+                    String endRange = _builder_8.toString();
+                    LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
+                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
+                    if (_tripleNotEquals_2) {
+                      StringConcatenation _builder_9 = new StringConcatenation();
+                      _builder_9.append("(int)get_\"");
+                      String _name_5 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef().getName();
+                      _builder_9.append(_name_5);
+                      _builder_9.append("\"()");
+                      beginRange = _builder_9.toString();
+                    }
+                    LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
+                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
+                    if (_tripleNotEquals_3) {
+                      StringConcatenation _builder_10 = new StringConcatenation();
+                      _builder_10.append("(int)get_\"");
+                      String _name_6 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef().getName();
+                      _builder_10.append(_name_6);
+                      _builder_10.append("\"()");
+                      endRange = _builder_10.toString();
+                    }
+                    StringConcatenation _builder_11 = new StringConcatenation();
+                    _builder_11.append("generateSignedAttribute(\"");
+                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_11.append(_name_7);
+                    _builder_11.append("\", ");
+                    _builder_11.append(beginRange);
+                    _builder_11.append(", ");
+                    _builder_11.append(endRange);
+                    _builder_11.append(", ");
+                    int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
+                    _builder_11.append(_rounded);
+                    _builder_11.append(");");
+                    _builder_11.newLineIfNotEmpty();
+                    it_2.append(_builder_11);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerSignedIntegerRandom) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_6);
+                    _builder_7.append("_items);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerUnsignedIntegerRange) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
+                    _builder_7.append(_beginRange);
+                    String beginRange = _builder_7.toString();
+                    StringConcatenation _builder_8 = new StringConcatenation();
+                    int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
+                    _builder_8.append(_endRange);
+                    String endRange = _builder_8.toString();
+                    LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
+                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
+                    if (_tripleNotEquals_2) {
+                      StringConcatenation _builder_9 = new StringConcatenation();
+                      _builder_9.append("(int)get_\"");
+                      String _name_5 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef().getName();
+                      _builder_9.append(_name_5);
+                      _builder_9.append("\"()");
+                      beginRange = _builder_9.toString();
+                    }
+                    LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
+                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
+                    if (_tripleNotEquals_3) {
+                      StringConcatenation _builder_10 = new StringConcatenation();
+                      _builder_10.append("(int)get_\"");
+                      String _name_6 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef().getName();
+                      _builder_10.append(_name_6);
+                      _builder_10.append("\"()");
+                      endRange = _builder_10.toString();
+                    }
+                    StringConcatenation _builder_11 = new StringConcatenation();
+                    _builder_11.append("generateUnsignedAttribute(\"");
+                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_11.append(_name_7);
+                    _builder_11.append("\", ");
+                    _builder_11.append(beginRange);
+                    _builder_11.append(", ");
+                    _builder_11.append(endRange);
+                    _builder_11.append(", ");
+                    int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
+                    _builder_11.append(_rounded);
+                    _builder_11.append(");");
+                    _builder_11.newLineIfNotEmpty();
+                    it_2.append(_builder_11);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerUnsignedIntegerRandom) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_6);
+                    _builder_7.append("_items);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerTextRandom) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_6);
+                    _builder_7.append("_items);");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerTextParagraphs) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateParagraphsAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    int _count = ((PropertyFillerTextParagraphs)type).getCount();
+                    _builder_7.append(_count);
+                    _builder_7.append(");");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerTextSentences) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateSentencesAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    int _count = ((PropertyFillerTextSentences)type).getCount();
+                    _builder_7.append(_count);
+                    _builder_7.append(");");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+                if (!_matched_2) {
+                  if (type instanceof PropertyFillerTextWords) {
+                    _matched_2=true;
+                    StringConcatenation _builder_7 = new StringConcatenation();
+                    _builder_7.append("generateWordsAttribute(\"");
+                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                    _builder_7.append(_name_5);
+                    _builder_7.append("\", ");
+                    int _count = ((PropertyFillerTextWords)type).getCount();
+                    _builder_7.append(_count);
+                    _builder_7.append(");");
+                    _builder_7.newLineIfNotEmpty();
+                    it_2.append(_builder_7);
+                  }
+                }
+              }
+            }
+            if (!_matched_1) {
+              if (attribute_1 instanceof EntityMockAttributeByReference) {
+                _matched_1=true;
+                EntityMockEntity _mockedEntity = ((EntityMockAttributeByReference)attribute_1).getMockedEntity();
+                boolean _tripleEquals = (_mockedEntity == null);
+                if (_tripleEquals) {
+                  StringConcatenation _builder_7 = new StringConcatenation();
+                  _builder_7.append("generateAttribute(\"");
+                  String _name_5 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
+                  _builder_7.append(_name_5);
+                  _builder_7.append("\", ");
+                  String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getType());
+                  _builder_7.append(_dtoFQNForLEntity);
+                  _builder_7.append(".class, ");
+                  int _optionalFor = ((EntityMockAttributeByReference)attribute_1).getOptionalFor();
+                  double _divide = (((double) _optionalFor) / 100.0);
+                  _builder_7.append(_divide);
+                  _builder_7.append(");");
+                  _builder_7.newLineIfNotEmpty();
+                  it_2.append(_builder_7);
+                } else {
+                  StringConcatenation _builder_8 = new StringConcatenation();
+                  _builder_8.append("generateAttribute(\"");
+                  String _name_6 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
+                  _builder_8.append(_name_6);
+                  _builder_8.append("\", \"");
+                  String _name_7 = ((EntityMockAttributeByReference)attribute_1).getMockedEntity().getName();
+                  _builder_8.append(_name_7);
+                  _builder_8.append("\", ");
+                  int _optionalFor_1 = ((EntityMockAttributeByReference)attribute_1).getOptionalFor();
+                  double _divide_1 = (((double) _optionalFor_1) / 100.0);
+                  _builder_8.append(_divide_1);
+                  _builder_8.append(");");
+                  _builder_8.newLineIfNotEmpty();
+                  it_2.append(_builder_8);
+                }
+              }
+            }
+          }
+          EList<EntityMockEntityFunction> _calculations_1 = mockEntity.getCalculations();
+          for (final EntityMockEntityFunction calculation_1 : _calculations_1) {
+            {
+              String doc = this._jvmTypesBuilder.getDocumentation(calculation_1);
+              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
+                StringConcatenation _builder_7 = new StringConcatenation();
+                _builder_7.append("/** ");
+                _builder_7.append(doc);
+                _builder_7.append(" */");
+                _builder_7.newLineIfNotEmpty();
+                it_2.append(_builder_7);
+              }
+              StringConcatenation _builder_8 = new StringConcatenation();
+              String paramString = _builder_8.toString();
+              EList<EntityMockEntityFunctionParameter> _params = calculation_1.getParams();
+              for (final EntityMockEntityFunctionParameter param : _params) {
+                {
+                  boolean _isEmpty = paramString.isEmpty();
+                  boolean _not = (!_isEmpty);
+                  if (_not) {
+                    StringConcatenation _builder_9 = new StringConcatenation();
+                    _builder_9.append(paramString);
+                    _builder_9.append(",");
+                    paramString = _builder_9.toString();
+                  }
+                  LEntityAttribute _attributeRef = param.getAttributeRef();
+                  boolean _tripleNotEquals_2 = (_attributeRef != null);
+                  if (_tripleNotEquals_2) {
+                    StringConcatenation _builder_10 = new StringConcatenation();
+                    _builder_10.append(paramString);
+                    _builder_10.append("(");
+                    String _identifier = this.getJvmType(param).getIdentifier();
+                    _builder_10.append(_identifier);
+                    _builder_10.append(")getAttribute(\"");
+                    String _paramName = this.getParamName(param, ".");
+                    _builder_10.append(_paramName);
+                    _builder_10.append("\")");
+                    paramString = _builder_10.toString();
+                  } else {
+                    boolean _isReferenceOnExistingDto = this.isReferenceOnExistingDto(param);
+                    if (_isReferenceOnExistingDto) {
+                      StringConcatenation _builder_11 = new StringConcatenation();
+                      _builder_11.append(paramString);
+                      _builder_11.append("(");
+                      String _identifier_1 = this.getJvmType(param).getIdentifier();
+                      _builder_11.append(_identifier_1);
+                      _builder_11.append(")((");
+                      String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(param.getNestedAttribute().getReference().getType());
+                      _builder_11.append(_dtoFQNForLEntity);
+                      _builder_11.append(")getAttribute(\"");
+                      String _name_5 = param.getNestedAttribute().getAttribute().getName();
+                      _builder_11.append(_name_5);
+                      _builder_11.append("\", mockDataGenerator, persistenceUnit)).get");
+                      String _firstUpper = StringExtensions.toFirstUpper(param.getNestedAttribute().getReference().getName());
+                      _builder_11.append(_firstUpper);
+                      _builder_11.append("()");
+                      paramString = _builder_11.toString();
+                    } else {
+                      StringConcatenation _builder_12 = new StringConcatenation();
+                      _builder_12.append(paramString);
+                      _builder_12.append("(");
+                      String _identifier_2 = this.getJvmType(param).getIdentifier();
+                      _builder_12.append(_identifier_2);
+                      _builder_12.append(")getAttribute(\"");
+                      String _paramName_1 = this.getParamName(param, ".");
+                      _builder_12.append(_paramName_1);
+                      _builder_12.append("\", mockDataGenerator, persistenceUnit)");
+                      paramString = _builder_12.toString();
+                    }
+                  }
+                }
+              }
+              StringConcatenation _builder_9 = new StringConcatenation();
+              _builder_9.append("try {");
+              _builder_9.newLine();
+              _builder_9.append("\t");
+              _builder_9.append("setFixAttribute(\"");
+              String _name_5 = calculation_1.getAttributeRef().getName();
+              _builder_9.append(_name_5, "\t");
+              _builder_9.append("\", calculate_");
+              String _name_6 = calculation_1.getAttributeRef().getName();
+              _builder_9.append(_name_6, "\t");
+              _builder_9.append("(");
+              _builder_9.append(paramString, "\t");
+              _builder_9.append("));");
+              _builder_9.newLineIfNotEmpty();
+              _builder_9.append("}");
+              _builder_9.newLine();
+              _builder_9.append("catch (NullPointerException npe) {}");
+              _builder_9.newLine();
+              _builder_9.append("catch (Exception e) {");
+              _builder_9.newLine();
+              _builder_9.append("    ");
+              _builder_9.append("log.error(e.getLocalizedMessage()+e.getCause());");
+              _builder_9.newLine();
+              _builder_9.append("}");
+              _builder_9.newLine();
+              it_2.append(_builder_9);
+            }
+          }
+        };
+        this._jvmTypesBuilder.setBody(it_1, _function_9);
+      };
+      JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(model, _builder_5.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_8);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, _method_3);
+      EntityMockResource _byResource_2 = mockEntity.getByResource();
+      boolean _tripleEquals = (_byResource_2 == null);
+      if (_tripleEquals) {
+        EList<JvmMember> _members_8 = it.getMembers();
+        StringConcatenation _builder_6 = new StringConcatenation();
+        _builder_6.append("generateEntity");
+        final Procedure1<JvmOperation> _function_9 = (JvmOperation it_1) -> {
+          it_1.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmFormalParameter> _parameters = it_1.getParameters();
+          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mockEntity, "dataRow", this._typeReferenceBuilder.typeRef(Object.class));
+          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+          it_1.setFinal(true);
+          final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_2) -> {
+            StringConcatenation _builder_7 = new StringConcatenation();
+            _builder_7.append("reset();");
+            _builder_7.newLine();
+            it_2.append(_builder_7);
+            LEntityAttribute _iterator = mockEntity.getIterator();
+            boolean _tripleNotEquals_2 = (_iterator != null);
+            if (_tripleNotEquals_2) {
+              StringConcatenation _builder_8 = new StringConcatenation();
+              _builder_8.append("setFixAttribute(\"");
+              String _name_3 = mockEntity.getIterator().getName();
+              _builder_8.append(_name_3);
+              _builder_8.append("\", dataRow);");
+              _builder_8.newLineIfNotEmpty();
+              it_2.append(_builder_8);
+            }
+            StringConcatenation _builder_9 = new StringConcatenation();
+            String _entityDtoFQN = this.entityDtoFQN(mockEntity);
+            _builder_9.append(_entityDtoFQN);
+            _builder_9.append(" internal = new ");
+            String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
+            _builder_9.append(_entityDtoFQN_1);
+            _builder_9.append("();");
+            _builder_9.newLineIfNotEmpty();
+            _builder_9.append("entity = internal;");
+            _builder_9.newLine();
+            _builder_9.append("generateData();");
+            _builder_9.newLine();
+            _builder_9.append("mockDataGenerator.addDtoMockData(internal, getMockData());");
+            _builder_9.newLine();
+            _builder_9.append("try {");
+            _builder_9.newLine();
+            it_2.append(_builder_9);
+            EList<IEntityMockAttribute> _attributes_1 = mockEntity.getAttributes();
+            for (final IEntityMockAttribute attribute_1 : _attributes_1) {
+              boolean _matched_1 = false;
+              if (attribute_1 instanceof EntityMockAttributeByObject) {
+                _matched_1=true;
+                StringConcatenation _builder_10 = new StringConcatenation();
+                _builder_10.append("\t");
+                _builder_10.append("internal.set");
+                String _capitalize = WordUtils.capitalize(((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName());
+                _builder_10.append(_capitalize, "\t");
+                _builder_10.append("(");
+                LEntityAttribute _attributeRef = ((EntityMockAttributeByObject)attribute_1).getAttributeRef();
+                StringConcatenation _builder_11 = new StringConcatenation();
+                _builder_11.append("getMockData().get(\"");
+                String _name_4 = ((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName();
+                _builder_11.append(_name_4);
+                _builder_11.append("\")");
+                String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
+                _builder_10.append(_baseMockDataTypeCasting, "\t");
+                _builder_10.append(");");
+                _builder_10.newLineIfNotEmpty();
+                it_2.append(_builder_10);
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockAttributeFiller) {
+                  _matched_1=true;
+                  StringConcatenation _builder_10 = new StringConcatenation();
+                  _builder_10.append("\t");
+                  _builder_10.append("internal.set");
+                  String _capitalize = WordUtils.capitalize(((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName());
+                  _builder_10.append(_capitalize, "\t");
+                  _builder_10.append("(");
+                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute_1).getAttributeRef();
+                  StringConcatenation _builder_11 = new StringConcatenation();
+                  _builder_11.append("getMockData().get(\"");
+                  String _name_4 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
+                  _builder_11.append(_name_4);
+                  _builder_11.append("\")");
+                  String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
+                  _builder_10.append(_baseMockDataTypeCasting, "\t");
+                  _builder_10.append(");");
+                  _builder_10.newLineIfNotEmpty();
+                  it_2.append(_builder_10);
+                }
+              }
+              if (!_matched_1) {
+                if (attribute_1 instanceof EntityMockAttributeByReference) {
+                  _matched_1=true;
+                  StringConcatenation _builder_10 = new StringConcatenation();
+                  _builder_10.append("\t");
+                  _builder_10.append("internal.set");
+                  String _capitalize = WordUtils.capitalize(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName());
+                  _builder_10.append(_capitalize, "\t");
+                  _builder_10.append("((");
+                  String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getType());
+                  _builder_10.append(_dtoFQNForLEntity, "\t");
+                  _builder_10.append(")getMockData().get(\"");
+                  String _name_4 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
+                  _builder_10.append(_name_4, "\t");
+                  _builder_10.append("\"));");
+                  _builder_10.newLineIfNotEmpty();
+                  it_2.append(_builder_10);
+                }
+              }
+            }
+            EList<EntityMockEntityFunction> _calculations_1 = mockEntity.getCalculations();
+            for (final EntityMockEntityFunction calculation_1 : _calculations_1) {
+              StringConcatenation _builder_10 = new StringConcatenation();
+              _builder_10.append("\t");
+              _builder_10.append("internal.set");
+              String _capitalize = WordUtils.capitalize(calculation_1.getAttributeRef().getName());
+              _builder_10.append(_capitalize, "\t");
+              _builder_10.append("(");
+              LEntityAttribute _attributeRef = calculation_1.getAttributeRef();
+              StringConcatenation _builder_11 = new StringConcatenation();
+              _builder_11.append("getMockData().get(\"");
+              String _name_4 = calculation_1.getAttributeRef().getName();
+              _builder_11.append(_name_4);
+              _builder_11.append("\")");
+              String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
+              _builder_10.append(_baseMockDataTypeCasting, "\t");
+              _builder_10.append(");");
+              _builder_10.newLineIfNotEmpty();
+              it_2.append(_builder_10);
+            }
+            StringConcatenation _builder_12 = new StringConcatenation();
+            _builder_12.append("}");
+            _builder_12.newLine();
+            _builder_12.append("catch (Exception e) {");
+            _builder_12.newLine();
+            _builder_12.append("    ");
+            _builder_12.append("log.error(e.getLocalizedMessage()+e.getCause());");
+            _builder_12.newLine();
+            _builder_12.append("}");
+            _builder_12.newLine();
+            _builder_12.append("return entity;");
+            it_2.append(_builder_12);
+          };
+          this._jvmTypesBuilder.setBody(it_1, _function_10);
+        };
+        JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(model, _builder_6.toString(), this._typeReferenceBuilder.typeRef(Object.class), _function_9);
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, _method_4);
+      }
     };
-    acceptor.<JvmGenericType>accept(_class, _function);
+    acceptor.<JvmGenericType>accept(mockClass, _function);
   }
   
   public boolean isReferenceOnExistingDto(final EntityMockEntityFunctionParameter param) {
-    EObject _eContainer = param.eContainer();
-    EObject _eContainer_1 = _eContainer.eContainer();
-    final EntityMockEntity entityMock = ((EntityMockEntity) _eContainer_1);
+    EObject _eContainer = param.eContainer().eContainer();
+    final EntityMockEntity entityMock = ((EntityMockEntity) _eContainer);
     EList<IEntityMockAttribute> _attributes = entityMock.getAttributes();
     for (final IEntityMockAttribute attribute : _attributes) {
       if ((attribute instanceof EntityMockAttributeByReference)) {
         EntityMockEntity _mockedEntity = ((EntityMockAttributeByReference)attribute).getMockedEntity();
-        boolean _equals = Objects.equal(_mockedEntity, null);
-        if (_equals) {
-          LEntityReference _attributeRef = ((EntityMockAttributeByReference)attribute).getAttributeRef();
-          LEntity _type = _attributeRef.getType();
-          LEntityAttribute _referenceRef = param.getReferenceRef();
-          EObject _eContainer_2 = _referenceRef.eContainer();
-          boolean _equals_1 = _type.equals(_eContainer_2);
-          if (_equals_1) {
+        boolean _tripleEquals = (_mockedEntity == null);
+        if (_tripleEquals) {
+          boolean _equals = ((EntityMockAttributeByReference)attribute).getAttributeRef().getType().equals(param.getNestedAttribute().getReference().eContainer());
+          if (_equals) {
             return true;
           }
         }
@@ -2857,13 +2609,11 @@
   
   public JvmTypeReference getJvmType(final EntityMockEntityFunctionParameter param) {
     LEntityAttribute _attributeRef = param.getAttributeRef();
-    boolean _notEquals = (!Objects.equal(_attributeRef, null));
-    if (_notEquals) {
-      LEntityAttribute _attributeRef_1 = param.getAttributeRef();
-      return this.jvmTypeRef(_attributeRef_1);
+    boolean _tripleNotEquals = (_attributeRef != null);
+    if (_tripleNotEquals) {
+      return this.jvmTypeRef(param.getAttributeRef());
     } else {
-      LEntityAttribute _referenceRef = param.getReferenceRef();
-      return _referenceRef.getTypeJvm();
+      return this.entityExtensions.toTypeReference(param.getNestedAttribute().getAttribute());
     }
   }
   
@@ -2871,28 +2621,22 @@
     StringConcatenation _builder = new StringConcatenation();
     String paramName = _builder.toString();
     LEntityAttribute _attributeRef = param.getAttributeRef();
-    boolean _notEquals = (!Objects.equal(_attributeRef, null));
-    if (_notEquals) {
+    boolean _tripleNotEquals = (_attributeRef != null);
+    if (_tripleNotEquals) {
       StringConcatenation _builder_1 = new StringConcatenation();
-      LEntityAttribute _attributeRef_1 = param.getAttributeRef();
-      String _name = _attributeRef_1.getName();
-      _builder_1.append(_name, "");
+      String _name = param.getAttributeRef().getName();
+      _builder_1.append(_name);
       paramName = _builder_1.toString();
     } else {
-      EList<LEntityReference> _referencePaths = param.getReferencePaths();
-      for (final LEntityReference referencePath : _referencePaths) {
-        StringConcatenation _builder_2 = new StringConcatenation();
-        _builder_2.append(paramName, "");
-        String _name_1 = referencePath.getName();
-        _builder_2.append(_name_1, "");
-        _builder_2.append(separator, "");
-        paramName = _builder_2.toString();
-      }
+      StringConcatenation _builder_2 = new StringConcatenation();
+      String _name_1 = param.getNestedAttribute().getReference().getName();
+      _builder_2.append(_name_1);
+      _builder_2.append(separator);
+      paramName = _builder_2.toString();
       StringConcatenation _builder_3 = new StringConcatenation();
-      _builder_3.append(paramName, "");
-      LEntityAttribute _referenceRef = param.getReferenceRef();
-      String _name_2 = _referenceRef.getName();
-      _builder_3.append(_name_2, "");
+      _builder_3.append(paramName);
+      String _name_2 = param.getNestedAttribute().getAttribute().getName();
+      _builder_3.append(_name_2);
       paramName = _builder_3.toString();
     }
     return paramName;
@@ -2940,9 +2684,9 @@
       StringConcatenation _builder = new StringConcatenation();
       LScalarType _type_1 = attribute.getType();
       String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(((LEnum) _type_1));
-      _builder.append(_dtoFQNForLEnum, "");
+      _builder.append(_dtoFQNForLEnum);
       _builder.append(".valueOf(");
-      _builder.append(getting, "");
+      _builder.append(getting);
       _builder.append(".toString())");
       return _builder.toString();
     }
@@ -2952,9 +2696,9 @@
       _builder_1.append("(");
       LScalarType _type_3 = attribute.getType();
       String _dtoFQNForLBean = EntityUtils.getDtoFQNForLBean(((LBean) _type_3));
-      _builder_1.append(_dtoFQNForLBean, "");
+      _builder_1.append(_dtoFQNForLBean);
       _builder_1.append(")(");
-      _builder_1.append(getting, "");
+      _builder_1.append(getting);
       _builder_1.append(")");
       return _builder_1.toString();
     }
@@ -2964,68 +2708,68 @@
         case BOOLEAN:
           StringConcatenation _builder_2 = new StringConcatenation();
           _builder_2.append("asBoolean(");
-          _builder_2.append(getting, "");
+          _builder_2.append(getting);
           _builder_2.append(")");
           return _builder_2.toString();
         case BYTE:
           StringConcatenation _builder_3 = new StringConcatenation();
           _builder_3.append("asByte(");
-          _builder_3.append(getting, "");
+          _builder_3.append(getting);
           _builder_3.append(")");
           return _builder_3.toString();
         case DATE:
           StringConcatenation _builder_4 = new StringConcatenation();
           _builder_4.append("asDate(");
-          _builder_4.append(getting, "");
+          _builder_4.append(getting);
           _builder_4.append(")");
           return _builder_4.toString();
         case FLOAT:
           StringConcatenation _builder_5 = new StringConcatenation();
           _builder_5.append("asFloat(");
-          _builder_5.append(getting, "");
+          _builder_5.append(getting);
           _builder_5.append(")");
           return _builder_5.toString();
         case DOUBLE:
           StringConcatenation _builder_6 = new StringConcatenation();
           _builder_6.append("asDouble(");
-          _builder_6.append(getting, "");
+          _builder_6.append(getting);
           _builder_6.append(")");
           return _builder_6.toString();
         case SHORT:
           StringConcatenation _builder_7 = new StringConcatenation();
           _builder_7.append("asShort(");
-          _builder_7.append(getting, "");
+          _builder_7.append(getting);
           _builder_7.append(")");
           return _builder_7.toString();
         case INTEGER:
           StringConcatenation _builder_8 = new StringConcatenation();
           _builder_8.append("asInt(");
-          _builder_8.append(getting, "");
+          _builder_8.append(getting);
           _builder_8.append(")");
           return _builder_8.toString();
         case LONG:
           StringConcatenation _builder_9 = new StringConcatenation();
           _builder_9.append("asLong(");
-          _builder_9.append(getting, "");
+          _builder_9.append(getting);
           _builder_9.append(")");
           return _builder_9.toString();
         case TIME:
           StringConcatenation _builder_10 = new StringConcatenation();
           _builder_10.append("asTime(");
-          _builder_10.append(getting, "");
+          _builder_10.append(getting);
           _builder_10.append(")");
           return _builder_10.toString();
         default:
           StringConcatenation _builder_11 = new StringConcatenation();
           _builder_11.append("asString(");
-          _builder_11.append(getting, "");
+          _builder_11.append(getting);
           _builder_11.append(")");
           return _builder_11.toString();
       }
     } else {
       StringConcatenation _builder_11 = new StringConcatenation();
       _builder_11.append("asString(");
-      _builder_11.append(getting, "");
+      _builder_11.append(getting);
       _builder_11.append(")");
       return _builder_11.toString();
     }
@@ -3054,10 +2798,7 @@
     }
     StringConcatenation _builder_3 = new StringConcatenation();
     _builder_3.append("\"");
-    int _year = date.getYear();
-    int _month = date.getMonth();
-    int _day = date.getDay();
-    String _format = String.format("%04d-%02d-%02d", Integer.valueOf(_year), Integer.valueOf(_month), Integer.valueOf(_day));
+    String _format = String.format("%04d-%02d-%02d", Integer.valueOf(date.getYear()), Integer.valueOf(date.getMonth()), Integer.valueOf(date.getDay()));
     String _plus = (_builder_3.toString() + _format);
     StringConcatenation _builder_4 = new StringConcatenation();
     _builder_4.append("\"");
@@ -3067,860 +2808,706 @@
   /**
    * generate the main mock data generator for the EntityMockPackage
    */
-  public void generateMockDataGenerator(final EntityMockModel model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockPackage pckg) {
-    StringConcatenation _builder = new StringConcatenation();
-    String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-    _builder.append(_entityMockName, "");
-    _builder.append(".");
-    _builder.append(EntityMockDSLJvmModelInferrer.ENTITY_MOCK_GENERATOR, "");
-    JvmGenericType _class = this._jvmTypesBuilder.toClass(model, _builder.toString());
-    final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
-      public void apply(final JvmGenericType it) {
-        EList<JvmTypeReference> _superTypes = it.getSuperTypes();
-        JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
-        it.setFinal(true);
-        JvmField field = null;
-        JvmTypeReference _typeRef_1 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Logger.class);
-        final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
-          public void apply(final JvmField it) {
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("LoggerFactory.getLogger(");
-                String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-                _builder.append(_entityMockName, "");
-                _builder.append(".");
-                _builder.append(EntityMockDSLJvmModelInferrer.ENTITY_MOCK_GENERATOR, "");
-                _builder.append(".class)");
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
+  public void generateMockDataGenerator(final EntityMock mock, final IJvmDeclaredTypeAcceptor acceptor) {
+    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(mock, this.entityMockName(mock));
+    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
+      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(mock));
+      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Component.class);
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(IEntityMockDataGenerator.class);
+      this._commonUtils.addAnnAttr(annotationRef, mock, "service", ((JvmTypeReference) _typeRef));
+      this._commonUtils.addAnnAttr(annotationRef, mock, "immediate", Boolean.valueOf(true));
+      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
+      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
+      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
+      JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class);
+      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef_1);
+      it.setFinal(true);
+      JvmField field = null;
+      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
+        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("LoggerFactory.getLogger(\"mock\")");
+          it_2.append(_builder);
+        };
+        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
+      };
+      field = this._jvmTypesBuilder.toField(mock, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
+      field.setFinal(true);
+      field.setStatic(true);
+      EList<JvmMember> _members = it.getMembers();
+      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+      EList<JvmMember> _members_1 = it.getMembers();
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("getRunWithPriority");
+      final Procedure1<JvmOperation> _function_2 = (JvmOperation it_1) -> {
+        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
+        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
+        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
+        final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
+          int count = IEntityMockDataGenerator.DEFAULT_PRIORITY;
+          int _runPriority = mock.getRunPriority();
+          boolean _greaterThan = (_runPriority > 0);
+          if (_greaterThan) {
+            count = mock.getRunPriority();
+          }
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("return ");
+          _builder_1.append(count);
+          _builder_1.append(";");
+          _builder_1.newLineIfNotEmpty();
+          it_2.append(_builder_1);
+        };
+        this._jvmTypesBuilder.setBody(it_1, _function_3);
+      };
+      JvmOperation _method = this._jvmTypesBuilder.toMethod(mock, _builder.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_2);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method);
+      EList<JvmMember> _members_2 = it.getMembers();
+      StringConcatenation _builder_1 = new StringConcatenation();
+      _builder_1.append("getDataInterchangeSteps");
+      final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
+        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
+        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
+        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
+        final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
+          int count = 0;
+          RunningDataInterchanges _datainterchanges = mock.getDatainterchanges();
+          boolean _tripleNotEquals = (_datainterchanges != null);
+          if (_tripleNotEquals) {
+            count = mock.getDatainterchanges().getDatainterchanges().size();
+          }
+          StringConcatenation _builder_2 = new StringConcatenation();
+          _builder_2.append("return ");
+          _builder_2.append(count);
+          _builder_2.append(";");
+          _builder_2.newLineIfNotEmpty();
+          it_2.append(_builder_2);
+        };
+        this._jvmTypesBuilder.setBody(it_1, _function_4);
+      };
+      JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(mock, _builder_1.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_3);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_1);
+      EList<JvmMember> _members_3 = it.getMembers();
+      StringConcatenation _builder_2 = new StringConcatenation();
+      _builder_2.append("getEntityMockSteps");
+      final Procedure1<JvmOperation> _function_4 = (JvmOperation it_1) -> {
+        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
+        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
+        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
+        final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
+          int count = 0;
+          EntityMockEntities _entities = mock.getEntities();
+          boolean _tripleNotEquals = (_entities != null);
+          if (_tripleNotEquals) {
+            count = mock.getEntities().getEntities().size();
+          }
+          StringConcatenation _builder_3 = new StringConcatenation();
+          _builder_3.append("return ");
+          _builder_3.append(count);
+          _builder_3.append(";");
+          _builder_3.newLineIfNotEmpty();
+          it_2.append(_builder_3);
+        };
+        this._jvmTypesBuilder.setBody(it_1, _function_5);
+      };
+      JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(mock, _builder_2.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_4);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_2);
+      EList<JvmMember> _members_4 = it.getMembers();
+      StringConcatenation _builder_3 = new StringConcatenation();
+      _builder_3.append("runDataInterchanges");
+      final Procedure1<JvmOperation> _function_5 = (JvmOperation it_1) -> {
+        EList<JvmFormalParameter> _parameters = it_1.getParameters();
+        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mock, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        EList<JvmFormalParameter> _parameters_1 = it_1.getParameters();
+        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(mock, "dataInterchange", this._typeReferenceBuilder.typeRef(IDataInterchange.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
+        EList<JvmFormalParameter> _parameters_2 = it_1.getParameters();
+        JvmFormalParameter _parameter_2 = this._jvmTypesBuilder.toParameter(mock, "eventDispatcher", this._typeReferenceBuilder.typeRef(IEventDispatcher.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_2, _parameter_2);
+        EList<JvmFormalParameter> _parameters_3 = it_1.getParameters();
+        JvmFormalParameter _parameter_3 = this._jvmTypesBuilder.toParameter(mock, "blobService", this._typeReferenceBuilder.typeRef(IBlobService.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_3, _parameter_3);
+        EList<JvmFormalParameter> _parameters_4 = it_1.getParameters();
+        JvmFormalParameter _parameter_4 = this._jvmTypesBuilder.toParameter(mock, "entityMockDbFiller", this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_4, _parameter_4);
+        final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
+          RunningDataInterchanges _datainterchanges = mock.getDatainterchanges();
+          boolean _tripleNotEquals = (_datainterchanges != null);
+          if (_tripleNotEquals) {
+            EList<RunningDataInterchange> _datainterchanges_1 = mock.getDatainterchanges().getDatainterchanges();
+            for (final RunningDataInterchange runDatainterchange : _datainterchanges_1) {
+              StringConcatenation _builder_4 = new StringConcatenation();
+              _builder_4.append("try {");
+              _builder_4.newLine();
+              _builder_4.append("\t");
+              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
+              String _name = runDatainterchange.getDatainterchangeRef().getName();
+              _builder_4.append(_name, "\t");
+              _builder_4.append("\", 1, 0.3);");
+              _builder_4.newLineIfNotEmpty();
+              _builder_4.append("\t");
+              String _basicRunConfiguration = this._dataDSLJvmModelInferrer.getBasicRunConfiguration(runDatainterchange.getDatainterchangeRef(), true, runDatainterchange.getFileURL(), "import");
+              _builder_4.append(_basicRunConfiguration, "\t");
+              _builder_4.newLineIfNotEmpty();
+              _builder_4.append("\t");
+              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
+              String _name_1 = runDatainterchange.getDatainterchangeRef().getName();
+              _builder_4.append(_name_1, "\t");
+              _builder_4.append("\", 0, 0.4);");
+              _builder_4.newLineIfNotEmpty();
+              _builder_4.append("\t");
+              String _defaultVariableName = this._dataDSLJvmModelInferrer.getDefaultVariableName(runDatainterchange.getDatainterchangeRef());
+              _builder_4.append(_defaultVariableName, "\t");
+              _builder_4.append(".run(entityMockDbFiller);");
+              _builder_4.newLineIfNotEmpty();
+              _builder_4.append("\t");
+              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
+              String _name_2 = runDatainterchange.getDatainterchangeRef().getName();
+              _builder_4.append(_name_2, "\t");
+              _builder_4.append("\", 0, 0.9);");
+              _builder_4.newLineIfNotEmpty();
+              _builder_4.append("} ");
+              _builder_4.newLine();
+              _builder_4.append("catch (Exception e) {");
+              _builder_4.newLine();
+              _builder_4.append("\t");
+              _builder_4.append("log.error(e.getLocalizedMessage()+e.getCause());");
+              _builder_4.newLine();
+              _builder_4.append("}");
+              _builder_4.newLine();
+              it_2.append(_builder_4);
+            }
           }
         };
-        JvmField _field = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(model, "log", _typeRef_1, _function);
-        field = _field;
-        field.setFinal(true);
-        field.setStatic(true);
-        EList<JvmMember> _members = it.getMembers();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
-        EList<JvmMember> _members_1 = it.getMembers();
-        StringConcatenation _builder = new StringConcatenation();
-        _builder.append("getRunWithPriority");
-        JvmTypeReference _typeRef_2 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int.class);
-        final Procedure1<JvmOperation> _function_1 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            EList<JvmAnnotationReference> _annotations = it.getAnnotations();
-            JvmAnnotationReference _annotation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toAnnotation(pckg, Override.class);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotation);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                int count = IEntityMockDataGenerator.DEFAULT_PRIORITY;
-                int _runPriority = pckg.getRunPriority();
-                boolean _greaterThan = (_runPriority > 0);
-                if (_greaterThan) {
-                  int _runPriority_1 = pckg.getRunPriority();
-                  count = _runPriority_1;
-                }
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("return ");
-                _builder.append(count, "");
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+        this._jvmTypesBuilder.setBody(it_1, _function_6);
+      };
+      JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(mock, _builder_3.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_5);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method_3);
+      EList<JvmMember> _members_5 = it.getMembers();
+      StringConcatenation _builder_4 = new StringConcatenation();
+      _builder_4.append("getMockData");
+      final Procedure1<JvmOperation> _function_6 = (JvmOperation it_1) -> {
+        EList<JvmFormalParameter> _parameters = it_1.getParameters();
+        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mock, "entityMockDbFiller", this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+        EList<JvmFormalParameter> _parameters_1 = it_1.getParameters();
+        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(mock, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
+        EList<JvmFormalParameter> _parameters_2 = it_1.getParameters();
+        JvmFormalParameter _parameter_2 = this._jvmTypesBuilder.toParameter(mock, "blobService", this._typeReferenceBuilder.typeRef(IBlobService.class));
+        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_2, _parameter_2);
+        final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_2) -> {
+          StringConcatenation _builder_5 = new StringConcatenation();
+          _builder_5.append("initialize();");
+          _builder_5.newLine();
+          it_2.append(_builder_5);
+          ArrayList<EntityMockEntity> mockEntitiesDone = new ArrayList<EntityMockEntity>();
+          ArrayList<EntityMockEntity> mockEntitiesToDo = new ArrayList<EntityMockEntity>();
+          EntityMockEntities _entities = mock.getEntities();
+          EList<EntityMockEntity> _entities_1 = null;
+          if (_entities!=null) {
+            _entities_1=_entities.getEntities();
           }
-        };
-        JvmOperation _method = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(model, _builder.toString(), _typeRef_2, _function_1);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method);
-        EList<JvmMember> _members_2 = it.getMembers();
-        StringConcatenation _builder_1 = new StringConcatenation();
-        _builder_1.append("getDataInterchangeSteps");
-        JvmTypeReference _typeRef_3 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int.class);
-        final Procedure1<JvmOperation> _function_2 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            EList<JvmAnnotationReference> _annotations = it.getAnnotations();
-            JvmAnnotationReference _annotation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toAnnotation(pckg, Override.class);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotation);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                int count = 0;
-                RunningDataInterchanges _datainterchanges = pckg.getDatainterchanges();
-                boolean _notEquals = (!Objects.equal(_datainterchanges, null));
-                if (_notEquals) {
-                  RunningDataInterchanges _datainterchanges_1 = pckg.getDatainterchanges();
-                  EList<RunningDataInterchange> _datainterchanges_2 = _datainterchanges_1.getDatainterchanges();
-                  int _size = _datainterchanges_2.size();
-                  count = _size;
-                }
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("return ");
-                _builder.append(count, "");
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
-        };
-        JvmOperation _method_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(model, _builder_1.toString(), _typeRef_3, _function_2);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_1);
-        EList<JvmMember> _members_3 = it.getMembers();
-        StringConcatenation _builder_2 = new StringConcatenation();
-        _builder_2.append("getEntityMockSteps");
-        JvmTypeReference _typeRef_4 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(int.class);
-        final Procedure1<JvmOperation> _function_3 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            EList<JvmAnnotationReference> _annotations = it.getAnnotations();
-            JvmAnnotationReference _annotation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toAnnotation(pckg, Override.class);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotation);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                int count = 0;
-                EntityMockEntities _entities = pckg.getEntities();
-                boolean _notEquals = (!Objects.equal(_entities, null));
-                if (_notEquals) {
-                  EntityMockEntities _entities_1 = pckg.getEntities();
-                  EList<EntityMockEntity> _entities_2 = _entities_1.getEntities();
-                  int _size = _entities_2.size();
-                  count = _size;
-                }
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("return ");
-                _builder.append(count, "");
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-                it.append(_builder);
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
-        };
-        JvmOperation _method_2 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(model, _builder_2.toString(), _typeRef_4, _function_3);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_2);
-        EList<JvmMember> _members_4 = it.getMembers();
-        StringConcatenation _builder_3 = new StringConcatenation();
-        _builder_3.append("runDataInterchanges");
-        JvmTypeReference _typeRef_5 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Void.TYPE);
-        final Procedure1<JvmOperation> _function_4 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            EList<JvmFormalParameter> _parameters = it.getParameters();
-            JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IPersistenceService.class);
-            JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(pckg, "persistenceService", _typeRef);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-            EList<JvmFormalParameter> _parameters_1 = it.getParameters();
-            JvmTypeReference _typeRef_1 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class);
-            JvmFormalParameter _parameter_1 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(pckg, "entityMockDbFiller", _typeRef_1);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                RunningDataInterchanges _datainterchanges = pckg.getDatainterchanges();
-                boolean _notEquals = (!Objects.equal(_datainterchanges, null));
-                if (_notEquals) {
-                  RunningDataInterchanges _datainterchanges_1 = pckg.getDatainterchanges();
-                  EList<RunningDataInterchange> _datainterchanges_2 = _datainterchanges_1.getDatainterchanges();
-                  for (final RunningDataInterchange runDatainterchange : _datainterchanges_2) {
-                    StringConcatenation _builder = new StringConcatenation();
-                    _builder.append("try {");
-                    _builder.newLine();
-                    _builder.append("\t");
-                    _builder.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
-                    DataInterchange _datainterchangeRef = runDatainterchange.getDatainterchangeRef();
-                    String _name = _datainterchangeRef.getName();
-                    _builder.append(_name, "\t");
-                    _builder.append("\", 1, 0.3);");
-                    _builder.newLineIfNotEmpty();
-                    _builder.append("\t");
-                    DataInterchange _datainterchangeRef_1 = runDatainterchange.getDatainterchangeRef();
-                    String _fileURL = runDatainterchange.getFileURL();
-                    String _basicRunConfiguration = EntityMockDSLJvmModelInferrer.this._dataDSLJvmModelInferrer.getBasicRunConfiguration(_datainterchangeRef_1, true, _fileURL);
-                    _builder.append(_basicRunConfiguration, "\t");
-                    _builder.newLineIfNotEmpty();
-                    _builder.append("\t");
-                    _builder.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
-                    DataInterchange _datainterchangeRef_2 = runDatainterchange.getDatainterchangeRef();
-                    String _name_1 = _datainterchangeRef_2.getName();
-                    _builder.append(_name_1, "\t");
-                    _builder.append("\", 0, 0.4);");
-                    _builder.newLineIfNotEmpty();
-                    _builder.append("\t");
-                    DataInterchange _datainterchangeRef_3 = runDatainterchange.getDatainterchangeRef();
-                    String _defaultVariableName = EntityMockDSLJvmModelInferrer.this._dataDSLJvmModelInferrer.getDefaultVariableName(_datainterchangeRef_3);
-                    _builder.append(_defaultVariableName, "\t");
-                    _builder.append(".run(entityMockDbFiller);");
-                    _builder.newLineIfNotEmpty();
-                    _builder.append("\t");
-                    _builder.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
-                    DataInterchange _datainterchangeRef_4 = runDatainterchange.getDatainterchangeRef();
-                    String _name_2 = _datainterchangeRef_4.getName();
-                    _builder.append(_name_2, "\t");
-                    _builder.append("\", 0, 0.9);");
-                    _builder.newLineIfNotEmpty();
-                    _builder.append("} ");
-                    _builder.newLine();
-                    _builder.append("catch (Exception e) {");
-                    _builder.newLine();
-                    _builder.append("\t");
-                    _builder.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                    _builder.newLine();
-                    _builder.append("}");
-                    _builder.newLine();
-                    it.append(_builder);
-                  }
-                }
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
-        };
-        JvmOperation _method_3 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(model, _builder_3.toString(), _typeRef_5, _function_4);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method_3);
-        EList<JvmMember> _members_5 = it.getMembers();
-        StringConcatenation _builder_4 = new StringConcatenation();
-        _builder_4.append("getMockData");
-        JvmTypeReference _typeRef_6 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Map.class);
-        final Procedure1<JvmOperation> _function_5 = new Procedure1<JvmOperation>() {
-          public void apply(final JvmOperation it) {
-            EList<JvmFormalParameter> _parameters = it.getParameters();
-            JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class);
-            JvmFormalParameter _parameter = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toParameter(pckg, "entityMockDbFiller", _typeRef);
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("initialize();");
-                _builder.newLine();
-                it.append(_builder);
-                ArrayList<EntityMockEntity> mockEntitiesDone = new ArrayList<EntityMockEntity>();
-                ArrayList<EntityMockEntity> mockEntitiesToDo = new ArrayList<EntityMockEntity>();
-                EntityMockEntities _entities = pckg.getEntities();
-                EList<EntityMockEntity> _entities_1 = null;
-                if (_entities!=null) {
-                  _entities_1=_entities.getEntities();
-                }
-                mockEntitiesToDo.addAll(_entities_1);
-                boolean breakTodo = false;
-                while (((!mockEntitiesToDo.isEmpty()) && (!breakTodo))) {
-                  {
-                    int handled = 0;
-                    Object[] mockEntitesStepping = mockEntitiesToDo.toArray();
-                    for (final Object mockEntityO : mockEntitesStepping) {
-                      {
-                        EntityMockEntity mockEntity = ((EntityMockEntity) mockEntityO);
-                        boolean _canBeHandled = EntityMockDSLJvmModelInferrer.this.canBeHandled(mockEntity, mockEntitiesDone);
-                        if (_canBeHandled) {
-                          handled++;
-                          IIterate _iterate = mockEntity.getIterate();
-                          if ((_iterate instanceof IntegerIterate)) {
-                            IIterate _iterate_1 = mockEntity.getIterate();
-                            IntegerIterate iterate = ((IntegerIterate) _iterate_1);
-                            StringConcatenation _builder_1 = new StringConcatenation();
-                            _builder_1.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_1.append(_entityMockName, "");
-                            _builder_1.append("\", 1, 0.3);");
-                            _builder_1.newLineIfNotEmpty();
-                            String _entityMockName_1 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_1.append(_entityMockName_1, "");
-                            _builder_1.append(" entity");
-                            String _name = mockEntity.getName();
-                            _builder_1.append(_name, "");
-                            _builder_1.append(" = new ");
-                            String _entityMockName_2 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_1.append(_entityMockName_2, "");
-                            _builder_1.append("(this);");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("Iterator<Integer> iterator");
-                            String _name_1 = mockEntity.getName();
-                            _builder_1.append(_name_1, "");
-                            _builder_1.append(" = new IntegerIterator(");
-                            int _from = iterate.getFrom();
-                            _builder_1.append(_from, "");
-                            _builder_1.append(", ");
-                            int _until = iterate.getUntil();
-                            _builder_1.append(_until, "");
-                            _builder_1.append(", ");
-                            int _step = iterate.getStep();
-                            _builder_1.append(_step, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("List list");
-                            String _name_2 = mockEntity.getName();
-                            _builder_1.append(_name_2, "");
-                            _builder_1.append(" = new ArrayList<");
-                            String _entityDtoFQN = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                            _builder_1.append(_entityDtoFQN, "");
-                            _builder_1.append(">();");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName_3 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_1.append(_entityMockName_3, "");
-                            _builder_1.append("\", 0, 0.6);");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("while (iterator");
-                            String _name_3 = mockEntity.getName();
-                            _builder_1.append(_name_3, "");
-                            _builder_1.append(".hasNext()) {");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("    ");
-                            _builder_1.append("list");
-                            String _name_4 = mockEntity.getName();
-                            _builder_1.append(_name_4, "    ");
-                            _builder_1.append(".add(entity");
-                            String _name_5 = mockEntity.getName();
-                            _builder_1.append(_name_5, "    ");
-                            _builder_1.append(".generateEntity(iterator");
-                            String _name_6 = mockEntity.getName();
-                            _builder_1.append(_name_6, "    ");
-                            _builder_1.append(".next()));");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("}");
-                            _builder_1.newLine();
-                            _builder_1.append("addMockObjects(\"");
-                            String _name_7 = mockEntity.getName();
-                            _builder_1.append(_name_7, "");
-                            _builder_1.append("\", ");
-                            String _entityDtoFQNClass = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQNClass(mockEntity);
-                            _builder_1.append(_entityDtoFQNClass, "");
-                            _builder_1.append(", \"");
-                            LEntity _entityRef = mockEntity.getEntityRef();
-                            String _persistenceUnit = _entityRef.getPersistenceUnit();
-                            _builder_1.append(_persistenceUnit, "");
-                            _builder_1.append("\", list");
-                            String _name_8 = mockEntity.getName();
-                            _builder_1.append(_name_8, "");
-                            _builder_1.append(");");
-                            _builder_1.newLineIfNotEmpty();
-                            _builder_1.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName_4 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_1.append(_entityMockName_4, "");
-                            _builder_1.append("\", 0, 0.9);");
-                            _builder_1.newLineIfNotEmpty();
-                            it.append(_builder_1);
-                          }
-                          IIterate _iterate_2 = mockEntity.getIterate();
-                          if ((_iterate_2 instanceof DateIterate)) {
-                            IIterate _iterate_3 = mockEntity.getIterate();
-                            DateIterate iterate_1 = ((DateIterate) _iterate_3);
-                            StringConcatenation _builder_2 = new StringConcatenation();
-                            _builder_2.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName_5 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_2.append(_entityMockName_5, "");
-                            _builder_2.append("\", 1, 0.3);");
-                            _builder_2.newLineIfNotEmpty();
-                            String _entityMockName_6 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_2.append(_entityMockName_6, "");
-                            _builder_2.append(" entity");
-                            String _name_9 = mockEntity.getName();
-                            _builder_2.append(_name_9, "");
-                            _builder_2.append(" = new ");
-                            String _entityMockName_7 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_2.append(_entityMockName_7, "");
-                            _builder_2.append("(this);");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("Iterator<Date> iterator");
-                            String _name_10 = mockEntity.getName();
-                            _builder_2.append(_name_10, "");
-                            _builder_2.append(" = new DateIterator(");
-                            org.eclipse.osbp.xtext.entitymock.Date _from_1 = iterate_1.getFrom();
-                            String _asString = EntityMockDSLJvmModelInferrer.this.asString(_from_1);
-                            _builder_2.append(_asString, "");
-                            _builder_2.append(", ");
-                            org.eclipse.osbp.xtext.entitymock.Date _until_1 = iterate_1.getUntil();
-                            String _asString_1 = EntityMockDSLJvmModelInferrer.this.asString(_until_1);
-                            _builder_2.append(_asString_1, "");
-                            _builder_2.append(", ");
-                            int _stepCount = iterate_1.getStepCount();
-                            _builder_2.append(_stepCount, "");
-                            _builder_2.append(", \"");
-                            EDateStepType _stepType = iterate_1.getStepType();
-                            _builder_2.append(_stepType, "");
-                            _builder_2.append("\");");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("List list");
-                            String _name_11 = mockEntity.getName();
-                            _builder_2.append(_name_11, "");
-                            _builder_2.append(" = new ArrayList<");
-                            String _entityDtoFQN_1 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                            _builder_2.append(_entityDtoFQN_1, "");
-                            _builder_2.append(">();");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName_8 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_2.append(_entityMockName_8, "");
-                            _builder_2.append("\", 0, 0.6);");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("while (iterator");
-                            String _name_12 = mockEntity.getName();
-                            _builder_2.append(_name_12, "");
-                            _builder_2.append(".hasNext()) {");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("    ");
-                            _builder_2.append("list");
-                            String _name_13 = mockEntity.getName();
-                            _builder_2.append(_name_13, "    ");
-                            _builder_2.append(".add(entity");
-                            String _name_14 = mockEntity.getName();
-                            _builder_2.append(_name_14, "    ");
-                            _builder_2.append(".generateEntity(iterator");
-                            String _name_15 = mockEntity.getName();
-                            _builder_2.append(_name_15, "    ");
-                            _builder_2.append(".next()));");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("}");
-                            _builder_2.newLine();
-                            _builder_2.append("addMockObjects(\"");
-                            String _name_16 = mockEntity.getName();
-                            _builder_2.append(_name_16, "");
-                            _builder_2.append("\", ");
-                            String _entityDtoFQNClass_1 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQNClass(mockEntity);
-                            _builder_2.append(_entityDtoFQNClass_1, "");
-                            _builder_2.append(", \"");
-                            LEntity _entityRef_1 = mockEntity.getEntityRef();
-                            String _persistenceUnit_1 = _entityRef_1.getPersistenceUnit();
-                            _builder_2.append(_persistenceUnit_1, "");
-                            _builder_2.append("\", list");
-                            String _name_17 = mockEntity.getName();
-                            _builder_2.append(_name_17, "");
-                            _builder_2.append(");");
-                            _builder_2.newLineIfNotEmpty();
-                            _builder_2.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                            String _entityMockName_9 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                            _builder_2.append(_entityMockName_9, "");
-                            _builder_2.append("\", 0, 0.9);");
-                            _builder_2.newLineIfNotEmpty();
-                            it.append(_builder_2);
-                          } else {
-                            EntityMockResource _byResource = mockEntity.getByResource();
-                            boolean _notEquals = (!Objects.equal(_byResource, null));
-                            if (_notEquals) {
-                              StringConcatenation _builder_3 = new StringConcatenation();
-                              _builder_3.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_10 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_3.append(_entityMockName_10, "");
-                              _builder_3.append("\", 1, 0.3);");
-                              _builder_3.newLineIfNotEmpty();
-                              String _entityMockName_11 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_3.append(_entityMockName_11, "");
-                              _builder_3.append(" entity");
-                              String _name_18 = mockEntity.getName();
-                              _builder_3.append(_name_18, "");
-                              _builder_3.append(" = new ");
-                              String _entityMockName_12 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_3.append(_entityMockName_12, "");
-                              _builder_3.append("(this);");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("List list");
-                              String _name_19 = mockEntity.getName();
-                              _builder_3.append(_name_19, "");
-                              _builder_3.append(" = new ArrayList<");
-                              String _entityDtoFQN_2 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                              _builder_3.append(_entityDtoFQN_2, "");
-                              _builder_3.append(">();");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("Iterator iterator");
-                              String _name_20 = mockEntity.getName();
-                              _builder_3.append(_name_20, "");
-                              _builder_3.append(" = entity");
-                              String _name_21 = mockEntity.getName();
-                              _builder_3.append(_name_21, "");
-                              _builder_3.append(".getDataRows().iterator();");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_13 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_3.append(_entityMockName_13, "");
-                              _builder_3.append("\", 0, 0.6);");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("while (iterator");
-                              String _name_22 = mockEntity.getName();
-                              _builder_3.append(_name_22, "");
-                              _builder_3.append(".hasNext()) {");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("    ");
-                              _builder_3.append("list");
-                              String _name_23 = mockEntity.getName();
-                              _builder_3.append(_name_23, "    ");
-                              _builder_3.append(".add(entity");
-                              String _name_24 = mockEntity.getName();
-                              _builder_3.append(_name_24, "    ");
-                              _builder_3.append(".generateEntity(iterator");
-                              String _name_25 = mockEntity.getName();
-                              _builder_3.append(_name_25, "    ");
-                              _builder_3.append(".next()));");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("}");
-                              _builder_3.newLine();
-                              _builder_3.append("addMockObjects(\"");
-                              String _name_26 = mockEntity.getName();
-                              _builder_3.append(_name_26, "");
-                              _builder_3.append("\", ");
-                              String _entityDtoFQNClass_2 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQNClass(mockEntity);
-                              _builder_3.append(_entityDtoFQNClass_2, "");
-                              _builder_3.append(", \"");
-                              LEntity _entityRef_2 = mockEntity.getEntityRef();
-                              String _persistenceUnit_2 = _entityRef_2.getPersistenceUnit();
-                              _builder_3.append(_persistenceUnit_2, "");
-                              _builder_3.append("\", list");
-                              String _name_27 = mockEntity.getName();
-                              _builder_3.append(_name_27, "");
-                              _builder_3.append(");");
-                              _builder_3.newLineIfNotEmpty();
-                              _builder_3.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_14 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_3.append(_entityMockName_14, "");
-                              _builder_3.append("\", 0, 0.9);");
-                              _builder_3.newLineIfNotEmpty();
-                              it.append(_builder_3);
-                              boolean _isCreateBlobMapping = mockEntity.isCreateBlobMapping();
-                              if (_isCreateBlobMapping) {
-                                StringConcatenation _builder_4 = new StringConcatenation();
-                                _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                                String _entityMockName_15 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                                _builder_4.append(_entityMockName_15, "");
-                                _builder_4.append("Blobs\", 0, 0.93);");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("List list");
-                                String _name_28 = mockEntity.getName();
-                                _builder_4.append(_name_28, "");
-                                _builder_4.append("Blobs = new ArrayList<org.eclipse.osbp.utils.blob.dtos.BlobDto>();");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("BlobTypingAPI ");
-                                String _name_29 = mockEntity.getName();
-                                _builder_4.append(_name_29, "");
-                                _builder_4.append("BlobTypingAPI = new BlobTypingAPI();");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("BlobUpload ");
-                                String _name_30 = mockEntity.getName();
-                                _builder_4.append(_name_30, "");
-                                _builder_4.append("BlobUpload = new BlobUpload();");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                                String _entityMockName_16 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                                _builder_4.append(_entityMockName_16, "");
-                                _builder_4.append("Blobs\", 0, 0.96);");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("for (Object list");
-                                String _name_31 = mockEntity.getName();
-                                _builder_4.append(_name_31, "");
-                                _builder_4.append("Object : list");
-                                String _name_32 = mockEntity.getName();
-                                _builder_4.append(_name_32, "");
-                                _builder_4.append(") {");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("    ");
-                                _builder_4.append("if  (list");
-                                String _name_33 = mockEntity.getName();
-                                _builder_4.append(_name_33, "    ");
-                                _builder_4.append("Object instanceof org.eclipse.osbp.utils.blob.dtos.BlobMappingDto) {");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("        ");
-                                _builder_4.append("org.eclipse.osbp.utils.blob.dtos.BlobMappingDto blobMappingDto = (org.eclipse.osbp.utils.blob.dtos.BlobMappingDto)list");
-                                String _name_34 = mockEntity.getName();
-                                _builder_4.append(_name_34, "        ");
-                                _builder_4.append("Object;");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("        ");
-                                _builder_4.append("try {");
-                                _builder_4.newLine();
-                                _builder_4.append("            ");
-                                _builder_4.append("InputStream inputStream = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(\"/resources/entitymock/\"+blobMappingDto.getFileName()));");
-                                _builder_4.newLine();
-                                _builder_4.append("            ");
-                                _builder_4.append("if  (inputStream != null) {");
-                                _builder_4.newLine();
-                                _builder_4.append("                ");
-                                _builder_4.append("List<org.eclipse.osbp.utils.blob.dtos.BlobDto> blobs = ");
-                                String _name_35 = mockEntity.getName();
-                                _builder_4.append(_name_35, "                ");
-                                _builder_4.append("BlobUpload.createBlobMappingBlobs(");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("                    ");
-                                _builder_4.append("inputStream,");
-                                _builder_4.newLine();
-                                _builder_4.append("                    ");
-                                String _name_36 = mockEntity.getName();
-                                _builder_4.append(_name_36, "                    ");
-                                _builder_4.append("BlobTypingAPI.getMimeTypeContentTypeById(blobMappingDto.getMimeTypeId()),");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("                    ");
-                                String _name_37 = mockEntity.getName();
-                                _builder_4.append(_name_37, "                    ");
-                                _builder_4.append("BlobTypingAPI,");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("                    ");
-                                _builder_4.append("blobMappingDto.getId()");
-                                _builder_4.newLine();
-                                _builder_4.append("                ");
-                                _builder_4.append(");");
-                                _builder_4.newLine();
-                                _builder_4.append("                ");
-                                _builder_4.append("blobMappingDto.setBlobsRef(blobs);");
-                                _builder_4.newLine();
-                                _builder_4.append("                ");
-                                _builder_4.append("for (org.eclipse.osbp.utils.blob.dtos.BlobDto blob : blobs) {");
-                                _builder_4.newLine();
-                                _builder_4.append("                    ");
-                                _builder_4.append("list");
-                                String _name_38 = mockEntity.getName();
-                                _builder_4.append(_name_38, "                    ");
-                                _builder_4.append("Blobs.add(blob);");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("                ");
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("            ");
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("        ");
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("        ");
-                                _builder_4.append("catch (Exception e) {");
-                                _builder_4.newLine();
-                                _builder_4.append("            ");
-                                _builder_4.append("log.error(e.getLocalizedMessage()+e.getCause());");
-                                _builder_4.newLine();
-                                _builder_4.append("        ");
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("    ");
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("}");
-                                _builder_4.newLine();
-                                _builder_4.append("addMockObjects(\"");
-                                String _name_39 = mockEntity.getName();
-                                _builder_4.append(_name_39, "");
-                                _builder_4.append("Blobs\", org.eclipse.osbp.utils.blob.dtos.BlobDto.class, \"blob\", list");
-                                String _name_40 = mockEntity.getName();
-                                _builder_4.append(_name_40, "");
-                                _builder_4.append("Blobs);");
-                                _builder_4.newLineIfNotEmpty();
-                                _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                                String _entityMockName_17 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                                _builder_4.append(_entityMockName_17, "");
-                                _builder_4.append("Blobs\", 0, 0.99);");
-                                _builder_4.newLineIfNotEmpty();
-                                it.append(_builder_4);
-                              }
-                            } else {
-                              StringConcatenation _builder_5 = new StringConcatenation();
-                              _builder_5.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_18 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_5.append(_entityMockName_18, "");
-                              _builder_5.append("\", 1, 0.3);");
-                              _builder_5.newLineIfNotEmpty();
-                              String _entityMockName_19 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_5.append(_entityMockName_19, "");
-                              _builder_5.append(" entity");
-                              String _name_41 = mockEntity.getName();
-                              _builder_5.append(_name_41, "");
-                              _builder_5.append(" = new ");
-                              String _entityMockName_20 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_5.append(_entityMockName_20, "");
-                              _builder_5.append("(this);");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("Iterator<Integer> iterator");
-                              String _name_42 = mockEntity.getName();
-                              _builder_5.append(_name_42, "");
-                              _builder_5.append(" = new IntegerIterator(1, fillerProvider.signedinteger(");
-                              int _minRows = mockEntity.getMinRows();
-                              _builder_5.append(_minRows, "");
-                              _builder_5.append(", ");
-                              int _maxRows = mockEntity.getMaxRows();
-                              _builder_5.append(_maxRows, "");
-                              _builder_5.append("));");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("List list");
-                              String _name_43 = mockEntity.getName();
-                              _builder_5.append(_name_43, "");
-                              _builder_5.append(" = new ArrayList<");
-                              String _entityDtoFQN_3 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQN(mockEntity);
-                              _builder_5.append(_entityDtoFQN_3, "");
-                              _builder_5.append(">();");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_21 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_5.append(_entityMockName_21, "");
-                              _builder_5.append("\", 0, 0.6);");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("while (iterator");
-                              String _name_44 = mockEntity.getName();
-                              _builder_5.append(_name_44, "");
-                              _builder_5.append(".hasNext()) {");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("    ");
-                              _builder_5.append("list");
-                              String _name_45 = mockEntity.getName();
-                              _builder_5.append(_name_45, "    ");
-                              _builder_5.append(".add(entity");
-                              String _name_46 = mockEntity.getName();
-                              _builder_5.append(_name_46, "    ");
-                              _builder_5.append(".generateEntity(iterator");
-                              String _name_47 = mockEntity.getName();
-                              _builder_5.append(_name_47, "    ");
-                              _builder_5.append(".next()));");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("}");
-                              _builder_5.newLine();
-                              _builder_5.append("addMockObjects(\"");
-                              String _name_48 = mockEntity.getName();
-                              _builder_5.append(_name_48, "");
-                              _builder_5.append("\", ");
-                              String _entityDtoFQNClass_3 = EntityMockDSLJvmModelInferrer.this.getEntityDtoFQNClass(mockEntity);
-                              _builder_5.append(_entityDtoFQNClass_3, "");
-                              _builder_5.append(", \"");
-                              LEntity _entityRef_3 = mockEntity.getEntityRef();
-                              String _persistenceUnit_3 = _entityRef_3.getPersistenceUnit();
-                              _builder_5.append(_persistenceUnit_3, "");
-                              _builder_5.append("\", list");
-                              String _name_49 = mockEntity.getName();
-                              _builder_5.append(_name_49, "");
-                              _builder_5.append(");");
-                              _builder_5.newLineIfNotEmpty();
-                              _builder_5.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
-                              String _entityMockName_22 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockEntity);
-                              _builder_5.append(_entityMockName_22, "");
-                              _builder_5.append("\", 0, 0.9);");
-                              _builder_5.newLineIfNotEmpty();
-                              it.append(_builder_5);
-                            }
-                          }
-                          mockEntitiesDone.add(((EntityMockEntity) mockEntity));
-                          mockEntitiesToDo.remove(mockEntity);
+          mockEntitiesToDo.addAll(_entities_1);
+          boolean breakTodo = false;
+          while (((!mockEntitiesToDo.isEmpty()) && (!breakTodo))) {
+            {
+              int handled = 0;
+              Object[] mockEntitesStepping = mockEntitiesToDo.toArray();
+              for (final Object mockEntityO : mockEntitesStepping) {
+                {
+                  EntityMockEntity mockEntity = ((EntityMockEntity) mockEntityO);
+                  boolean _canBeHandled = this.canBeHandled(mockEntity, mockEntitiesDone);
+                  if (_canBeHandled) {
+                    handled++;
+                    IIterate _iterate = mockEntity.getIterate();
+                    if ((_iterate instanceof IntegerIterate)) {
+                      IIterate _iterate_1 = mockEntity.getIterate();
+                      IntegerIterate iterate = ((IntegerIterate) _iterate_1);
+                      StringConcatenation _builder_6 = new StringConcatenation();
+                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName = this.entityMockName(mockEntity, mock);
+                      _builder_6.append(_entityMockName);
+                      _builder_6.append("\", 1, 0.3);");
+                      _builder_6.newLineIfNotEmpty();
+                      String _entityMockName_1 = this.entityMockName(mockEntity, mock);
+                      _builder_6.append(_entityMockName_1);
+                      _builder_6.append(" entity");
+                      String _name = mockEntity.getName();
+                      _builder_6.append(_name);
+                      _builder_6.append(" = new ");
+                      String _entityMockName_2 = this.entityMockName(mockEntity, mock);
+                      _builder_6.append(_entityMockName_2);
+                      _builder_6.append("(this);");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("Iterator<Integer> iterator");
+                      String _name_1 = mockEntity.getName();
+                      _builder_6.append(_name_1);
+                      _builder_6.append(" = new IntegerIterator(");
+                      int _from = iterate.getFrom();
+                      _builder_6.append(_from);
+                      _builder_6.append(", ");
+                      int _until = iterate.getUntil();
+                      _builder_6.append(_until);
+                      _builder_6.append(", ");
+                      int _step = iterate.getStep();
+                      _builder_6.append(_step);
+                      _builder_6.append(");");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("List list");
+                      String _name_2 = mockEntity.getName();
+                      _builder_6.append(_name_2);
+                      _builder_6.append(" = new ArrayList<");
+                      String _entityDtoFQN = this.entityDtoFQN(mockEntity);
+                      _builder_6.append(_entityDtoFQN);
+                      _builder_6.append(">();");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName_3 = this.entityMockName(mockEntity, mock);
+                      _builder_6.append(_entityMockName_3);
+                      _builder_6.append("\", 0, 0.6);");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("persistenceService.registerPersistenceUnit(entity");
+                      String _name_3 = mockEntity.getName();
+                      _builder_6.append(_name_3);
+                      _builder_6.append(".getPersistenceUnit(), ");
+                      String _entityFQN = this.entityFQN(mockEntity);
+                      _builder_6.append(_entityFQN);
+                      _builder_6.append(".class);");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("while (iterator");
+                      String _name_4 = mockEntity.getName();
+                      _builder_6.append(_name_4);
+                      _builder_6.append(".hasNext()) {");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("    ");
+                      _builder_6.append("list");
+                      String _name_5 = mockEntity.getName();
+                      _builder_6.append(_name_5, "    ");
+                      _builder_6.append(".add(entity");
+                      String _name_6 = mockEntity.getName();
+                      _builder_6.append(_name_6, "    ");
+                      _builder_6.append(".generateEntity(iterator");
+                      String _name_7 = mockEntity.getName();
+                      _builder_6.append(_name_7, "    ");
+                      _builder_6.append(".next()));");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("}");
+                      _builder_6.newLine();
+                      _builder_6.append("addMockObjects(\"");
+                      String _name_8 = mockEntity.getName();
+                      _builder_6.append(_name_8);
+                      _builder_6.append("\", ");
+                      String _entityDtoFQNClass = this.entityDtoFQNClass(mockEntity);
+                      _builder_6.append(_entityDtoFQNClass);
+                      _builder_6.append(", \"");
+                      String _persistenceUnit = mockEntity.getEntityRef().getPersistenceUnit();
+                      _builder_6.append(_persistenceUnit);
+                      _builder_6.append("\", list");
+                      String _name_9 = mockEntity.getName();
+                      _builder_6.append(_name_9);
+                      _builder_6.append(");");
+                      _builder_6.newLineIfNotEmpty();
+                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName_4 = this.entityMockName(mockEntity, mock);
+                      _builder_6.append(_entityMockName_4);
+                      _builder_6.append("\", 0, 0.9);");
+                      _builder_6.newLineIfNotEmpty();
+                      it_2.append(_builder_6);
+                    }
+                    IIterate _iterate_2 = mockEntity.getIterate();
+                    if ((_iterate_2 instanceof DateIterate)) {
+                      IIterate _iterate_3 = mockEntity.getIterate();
+                      DateIterate iterate_1 = ((DateIterate) _iterate_3);
+                      StringConcatenation _builder_7 = new StringConcatenation();
+                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName_5 = this.entityMockName(mockEntity, mock);
+                      _builder_7.append(_entityMockName_5);
+                      _builder_7.append("\", 1, 0.3);");
+                      _builder_7.newLineIfNotEmpty();
+                      String _entityMockName_6 = this.entityMockName(mockEntity, mock);
+                      _builder_7.append(_entityMockName_6);
+                      _builder_7.append(" entity");
+                      String _name_10 = mockEntity.getName();
+                      _builder_7.append(_name_10);
+                      _builder_7.append(" = new ");
+                      String _entityMockName_7 = this.entityMockName(mockEntity, mock);
+                      _builder_7.append(_entityMockName_7);
+                      _builder_7.append("(this);");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("Iterator<Date> iterator");
+                      String _name_11 = mockEntity.getName();
+                      _builder_7.append(_name_11);
+                      _builder_7.append(" = new DateIterator(");
+                      String _asString = this.asString(iterate_1.getFrom());
+                      _builder_7.append(_asString);
+                      _builder_7.append(", ");
+                      String _asString_1 = this.asString(iterate_1.getUntil());
+                      _builder_7.append(_asString_1);
+                      _builder_7.append(", ");
+                      int _stepCount = iterate_1.getStepCount();
+                      _builder_7.append(_stepCount);
+                      _builder_7.append(", \"");
+                      EDateStepType _stepType = iterate_1.getStepType();
+                      _builder_7.append(_stepType);
+                      _builder_7.append("\");");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("List list");
+                      String _name_12 = mockEntity.getName();
+                      _builder_7.append(_name_12);
+                      _builder_7.append(" = new ArrayList<");
+                      String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
+                      _builder_7.append(_entityDtoFQN_1);
+                      _builder_7.append(">();");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName_8 = this.entityMockName(mockEntity, mock);
+                      _builder_7.append(_entityMockName_8);
+                      _builder_7.append("\", 0, 0.6);");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("persistenceService.registerPersistenceUnit(entity");
+                      String _name_13 = mockEntity.getName();
+                      _builder_7.append(_name_13);
+                      _builder_7.append(".getPersistenceUnit(), ");
+                      String _entityFQN_1 = this.entityFQN(mockEntity);
+                      _builder_7.append(_entityFQN_1);
+                      _builder_7.append(".class);");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("while (iterator");
+                      String _name_14 = mockEntity.getName();
+                      _builder_7.append(_name_14);
+                      _builder_7.append(".hasNext()) {");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("    ");
+                      _builder_7.append("list");
+                      String _name_15 = mockEntity.getName();
+                      _builder_7.append(_name_15, "    ");
+                      _builder_7.append(".add(entity");
+                      String _name_16 = mockEntity.getName();
+                      _builder_7.append(_name_16, "    ");
+                      _builder_7.append(".generateEntity(iterator");
+                      String _name_17 = mockEntity.getName();
+                      _builder_7.append(_name_17, "    ");
+                      _builder_7.append(".next()));");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("}");
+                      _builder_7.newLine();
+                      _builder_7.append("addMockObjects(\"");
+                      String _name_18 = mockEntity.getName();
+                      _builder_7.append(_name_18);
+                      _builder_7.append("\", ");
+                      String _entityDtoFQNClass_1 = this.entityDtoFQNClass(mockEntity);
+                      _builder_7.append(_entityDtoFQNClass_1);
+                      _builder_7.append(", \"");
+                      String _persistenceUnit_1 = mockEntity.getEntityRef().getPersistenceUnit();
+                      _builder_7.append(_persistenceUnit_1);
+                      _builder_7.append("\", list");
+                      String _name_19 = mockEntity.getName();
+                      _builder_7.append(_name_19);
+                      _builder_7.append(");");
+                      _builder_7.newLineIfNotEmpty();
+                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                      String _entityMockName_9 = this.entityMockName(mockEntity, mock);
+                      _builder_7.append(_entityMockName_9);
+                      _builder_7.append("\", 0, 0.9);");
+                      _builder_7.newLineIfNotEmpty();
+                      it_2.append(_builder_7);
+                    } else {
+                      EntityMockResource _byResource = mockEntity.getByResource();
+                      boolean _tripleNotEquals = (_byResource != null);
+                      if (_tripleNotEquals) {
+                        StringConcatenation _builder_8 = new StringConcatenation();
+                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_10 = this.entityMockName(mockEntity, mock);
+                        _builder_8.append(_entityMockName_10);
+                        _builder_8.append("\", 1, 0.3);");
+                        _builder_8.newLineIfNotEmpty();
+                        String _entityMockName_11 = this.entityMockName(mockEntity, mock);
+                        _builder_8.append(_entityMockName_11);
+                        _builder_8.append(" entity");
+                        String _name_20 = mockEntity.getName();
+                        _builder_8.append(_name_20);
+                        _builder_8.append(" = new ");
+                        String _entityMockName_12 = this.entityMockName(mockEntity, mock);
+                        _builder_8.append(_entityMockName_12);
+                        _builder_8.append("(this);");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("List list");
+                        String _name_21 = mockEntity.getName();
+                        _builder_8.append(_name_21);
+                        _builder_8.append(" = new ArrayList<");
+                        String _entityDtoFQN_2 = this.entityDtoFQN(mockEntity);
+                        _builder_8.append(_entityDtoFQN_2);
+                        _builder_8.append(">();");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("Iterator iterator");
+                        String _name_22 = mockEntity.getName();
+                        _builder_8.append(_name_22);
+                        _builder_8.append(" = entity");
+                        String _name_23 = mockEntity.getName();
+                        _builder_8.append(_name_23);
+                        _builder_8.append(".getDataRows().iterator();");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_13 = this.entityMockName(mockEntity, mock);
+                        _builder_8.append(_entityMockName_13);
+                        _builder_8.append("\", 0, 0.6);");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("persistenceService.registerPersistenceUnit(entity");
+                        String _name_24 = mockEntity.getName();
+                        _builder_8.append(_name_24);
+                        _builder_8.append(".getPersistenceUnit(), ");
+                        String _entityFQN_2 = this.entityFQN(mockEntity);
+                        _builder_8.append(_entityFQN_2);
+                        _builder_8.append(".class);");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("while (iterator");
+                        String _name_25 = mockEntity.getName();
+                        _builder_8.append(_name_25);
+                        _builder_8.append(".hasNext()) {");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("    ");
+                        _builder_8.append("list");
+                        String _name_26 = mockEntity.getName();
+                        _builder_8.append(_name_26, "    ");
+                        _builder_8.append(".add(entity");
+                        String _name_27 = mockEntity.getName();
+                        _builder_8.append(_name_27, "    ");
+                        _builder_8.append(".generateEntity(iterator");
+                        String _name_28 = mockEntity.getName();
+                        _builder_8.append(_name_28, "    ");
+                        _builder_8.append(".next()));");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("}");
+                        _builder_8.newLine();
+                        _builder_8.append("addMockObjects(\"");
+                        String _name_29 = mockEntity.getName();
+                        _builder_8.append(_name_29);
+                        _builder_8.append("\", ");
+                        String _entityDtoFQNClass_2 = this.entityDtoFQNClass(mockEntity);
+                        _builder_8.append(_entityDtoFQNClass_2);
+                        _builder_8.append(", \"");
+                        String _persistenceUnit_2 = mockEntity.getEntityRef().getPersistenceUnit();
+                        _builder_8.append(_persistenceUnit_2);
+                        _builder_8.append("\", list");
+                        String _name_30 = mockEntity.getName();
+                        _builder_8.append(_name_30);
+                        _builder_8.append(");");
+                        _builder_8.newLineIfNotEmpty();
+                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_14 = this.entityMockName(mockEntity, mock);
+                        _builder_8.append(_entityMockName_14);
+                        _builder_8.append("\", 0, 0.9);");
+                        _builder_8.newLineIfNotEmpty();
+                        it_2.append(_builder_8);
+                        boolean _isCreateBlobMapping = mockEntity.isCreateBlobMapping();
+                        if (_isCreateBlobMapping) {
+                          StringConcatenation _builder_9 = new StringConcatenation();
+                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                          String _entityMockName_15 = this.entityMockName(mockEntity, mock);
+                          _builder_9.append(_entityMockName_15);
+                          _builder_9.append("Blobs\", 0, 0.93);");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("List list");
+                          String _name_31 = mockEntity.getName();
+                          _builder_9.append(_name_31);
+                          _builder_9.append("Blobs = new ArrayList<org.eclipse.osbp.blob.dtos.BlobDto>();");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                          String _entityMockName_16 = this.entityMockName(mockEntity, mock);
+                          _builder_9.append(_entityMockName_16);
+                          _builder_9.append("Blobs\", 0, 0.96);");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("for (Object list");
+                          String _name_32 = mockEntity.getName();
+                          _builder_9.append(_name_32);
+                          _builder_9.append("Object : list");
+                          String _name_33 = mockEntity.getName();
+                          _builder_9.append(_name_33);
+                          _builder_9.append(") {");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("    ");
+                          _builder_9.append("if  (list");
+                          String _name_34 = mockEntity.getName();
+                          _builder_9.append(_name_34, "    ");
+                          _builder_9.append("Object instanceof org.eclipse.osbp.blob.dtos.BlobMappingDto) {");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("        ");
+                          _builder_9.append("org.eclipse.osbp.blob.dtos.BlobMappingDto blobMappingDto = (org.eclipse.osbp.blob.dtos.BlobMappingDto)list");
+                          String _name_35 = mockEntity.getName();
+                          _builder_9.append(_name_35, "        ");
+                          _builder_9.append("Object;");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("        ");
+                          _builder_9.append("try {");
+                          _builder_9.newLine();
+                          _builder_9.append("            ");
+                          _builder_9.append("InputStream inputStream = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(\"/resources/entitymock/\"+blobMappingDto.getFileName()));");
+                          _builder_9.newLine();
+                          _builder_9.append("            ");
+                          _builder_9.append("if  (inputStream != null) {");
+                          _builder_9.newLine();
+                          _builder_9.append("                ");
+                          _builder_9.append("List<Object> blobs = blobService.createBlobMappingBlobs(inputStream, blobMappingDto.getMimeTypeId());");
+                          _builder_9.newLine();
+                          _builder_9.append("                ");
+                          _builder_9.append("for(Object obj:blobs) {");
+                          _builder_9.newLine();
+                          _builder_9.append("\t                ");
+                          _builder_9.append("blobMappingDto.addToBlobsRef((org.eclipse.osbp.blob.dtos.BlobDto)obj);");
+                          _builder_9.newLine();
+                          _builder_9.append("                    ");
+                          _builder_9.append("list");
+                          String _name_36 = mockEntity.getName();
+                          _builder_9.append(_name_36, "                    ");
+                          _builder_9.append("Blobs.add((org.eclipse.osbp.blob.dtos.BlobDto)obj);");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("                ");
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("            ");
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("        ");
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("        ");
+                          _builder_9.append("catch (Exception e) {");
+                          _builder_9.newLine();
+                          _builder_9.append("            ");
+                          _builder_9.append("log.error(e.getLocalizedMessage()+e.getCause());");
+                          _builder_9.newLine();
+                          _builder_9.append("        ");
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("    ");
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("}");
+                          _builder_9.newLine();
+                          _builder_9.append("addMockObjects(\"");
+                          String _name_37 = mockEntity.getName();
+                          _builder_9.append(_name_37);
+                          _builder_9.append("Blobs\", org.eclipse.osbp.blob.dtos.BlobDto.class, \"blob\", list");
+                          String _name_38 = mockEntity.getName();
+                          _builder_9.append(_name_38);
+                          _builder_9.append("Blobs);");
+                          _builder_9.newLineIfNotEmpty();
+                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                          String _entityMockName_17 = this.entityMockName(mockEntity, mock);
+                          _builder_9.append(_entityMockName_17);
+                          _builder_9.append("Blobs\", 0, 0.99);");
+                          _builder_9.newLineIfNotEmpty();
+                          it_2.append(_builder_9);
                         }
+                      } else {
+                        StringConcatenation _builder_10 = new StringConcatenation();
+                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_18 = this.entityMockName(mockEntity, mock);
+                        _builder_10.append(_entityMockName_18);
+                        _builder_10.append("\", 1, 0.3);");
+                        _builder_10.newLineIfNotEmpty();
+                        String _entityMockName_19 = this.entityMockName(mockEntity, mock);
+                        _builder_10.append(_entityMockName_19);
+                        _builder_10.append(" entity");
+                        String _name_39 = mockEntity.getName();
+                        _builder_10.append(_name_39);
+                        _builder_10.append(" = new ");
+                        String _entityMockName_20 = this.entityMockName(mockEntity, mock);
+                        _builder_10.append(_entityMockName_20);
+                        _builder_10.append("(this);");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("Iterator<Integer> iterator");
+                        String _name_40 = mockEntity.getName();
+                        _builder_10.append(_name_40);
+                        _builder_10.append(" = new IntegerIterator(1, getFillerProvider().signedinteger(");
+                        int _minRows = mockEntity.getMinRows();
+                        _builder_10.append(_minRows);
+                        _builder_10.append(", ");
+                        int _maxRows = mockEntity.getMaxRows();
+                        _builder_10.append(_maxRows);
+                        _builder_10.append("));");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("List list");
+                        String _name_41 = mockEntity.getName();
+                        _builder_10.append(_name_41);
+                        _builder_10.append(" = new ArrayList<");
+                        String _entityDtoFQN_3 = this.entityDtoFQN(mockEntity);
+                        _builder_10.append(_entityDtoFQN_3);
+                        _builder_10.append(">();");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_21 = this.entityMockName(mockEntity, mock);
+                        _builder_10.append(_entityMockName_21);
+                        _builder_10.append("\", 0, 0.6);");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("persistenceService.registerPersistenceUnit(entity");
+                        String _name_42 = mockEntity.getName();
+                        _builder_10.append(_name_42);
+                        _builder_10.append(".getPersistenceUnit(), ");
+                        String _entityFQN_3 = this.entityFQN(mockEntity);
+                        _builder_10.append(_entityFQN_3);
+                        _builder_10.append(".class);");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("while (iterator");
+                        String _name_43 = mockEntity.getName();
+                        _builder_10.append(_name_43);
+                        _builder_10.append(".hasNext()) {");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("    ");
+                        _builder_10.append("list");
+                        String _name_44 = mockEntity.getName();
+                        _builder_10.append(_name_44, "    ");
+                        _builder_10.append(".add(entity");
+                        String _name_45 = mockEntity.getName();
+                        _builder_10.append(_name_45, "    ");
+                        _builder_10.append(".generateEntity(iterator");
+                        String _name_46 = mockEntity.getName();
+                        _builder_10.append(_name_46, "    ");
+                        _builder_10.append(".next()));");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("}");
+                        _builder_10.newLine();
+                        _builder_10.append("addMockObjects(\"");
+                        String _name_47 = mockEntity.getName();
+                        _builder_10.append(_name_47);
+                        _builder_10.append("\", ");
+                        String _entityDtoFQNClass_3 = this.entityDtoFQNClass(mockEntity);
+                        _builder_10.append(_entityDtoFQNClass_3);
+                        _builder_10.append(", \"");
+                        String _persistenceUnit_3 = mockEntity.getEntityRef().getPersistenceUnit();
+                        _builder_10.append(_persistenceUnit_3);
+                        _builder_10.append("\", list");
+                        String _name_48 = mockEntity.getName();
+                        _builder_10.append(_name_48);
+                        _builder_10.append(");");
+                        _builder_10.newLineIfNotEmpty();
+                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
+                        String _entityMockName_22 = this.entityMockName(mockEntity, mock);
+                        _builder_10.append(_entityMockName_22);
+                        _builder_10.append("\", 0, 0.9);");
+                        _builder_10.newLineIfNotEmpty();
+                        it_2.append(_builder_10);
                       }
                     }
-                    breakTodo = (handled == 0);
+                    mockEntitiesDone.add(((EntityMockEntity) mockEntity));
+                    mockEntitiesToDo.remove(mockEntity);
                   }
                 }
-                StringConcatenation _builder_1 = new StringConcatenation();
-                _builder_1.append("return mockDataClassMap;");
-                it.append(_builder_1);
               }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
+              breakTodo = (handled == 0);
+            }
           }
+          StringConcatenation _builder_6 = new StringConcatenation();
+          _builder_6.append("return mockDataClassMap;");
+          it_2.append(_builder_6);
         };
-        JvmOperation _method_4 = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toMethod(pckg, _builder_4.toString(), _typeRef_6, _function_5);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_4);
-      }
+        this._jvmTypesBuilder.setBody(it_1, _function_7);
+      };
+      JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(mock, _builder_4.toString(), this._typeReferenceBuilder.typeRef(Map.class), _function_6);
+      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_4);
     };
-    acceptor.<JvmGenericType>accept(_class, _function);
-  }
-  
-  /**
-   * The dispatch method {@code infer} is called for each instance of the
-   * given element's type that is contained in a resource.
-   * 
-   * @param element
-   *            the model to create one or more
-   *            {@link JvmDeclaredType declared
-   *            types} from.
-   * @param acceptor
-   *            each created
-   *            {@link JvmDeclaredType type}
-   *            without a container should be passed to the acceptor in order
-   *            get attached to the current resource. The acceptor's
-   *            {@link IJvmDeclaredTypeAcceptor#accept(org.eclipse.xtext.common.types.JvmDeclaredType)
-   *            accept(..)} method takes the constructed empty type for the
-   *            pre-indexing phase. This one is further initialized in the
-   *            indexing phase using the closure you pass to the returned
-   *            {@link IPostIndexingInitializing#initializeLater(org.eclipse.xtext.xbase.lib.Procedures.Procedure1)
-   *            initializeLater(..)}.
-   * @param isPreIndexingPhase
-   *            whether the method is called in a pre-indexing phase, i.e.
-   *            when the global index is not yet fully updated. You must not
-   *            rely on linking using the index if isPreIndexingPhase is
-   *            <code>true</code>.
-   */
-  protected void _infer(final EntityMockModel model, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
-    EList<EntityMockPackage> _packages = model.getPackages();
-    final Consumer<EntityMockPackage> _function = new Consumer<EntityMockPackage>() {
-      public void accept(final EntityMockPackage pckg) {
-        EntityMockResources _resources = pckg.getResources();
-        EList<EntityMockResource> _resources_1 = null;
-        if (_resources!=null) {
-          _resources_1=_resources.getResources();
-        }
-        if (_resources_1!=null) {
-          final Consumer<EntityMockResource> _function = new Consumer<EntityMockResource>() {
-            public void accept(final EntityMockResource mockResource) {
-              try {
-                EntityMockDSLJvmModelInferrer.this.generateMockResource(model, acceptor, pckg, mockResource);
-              } catch (final Throwable _t) {
-                if (_t instanceof Exception) {
-                  final Exception e = (Exception)_t;
-                  e.printStackTrace();
-                } else {
-                  throw Exceptions.sneakyThrow(_t);
-                }
-              }
-            }
-          };
-          _resources_1.forEach(_function);
-        }
-        EntityMockObjects _objects = pckg.getObjects();
-        EList<EntityMockObject> _objects_1 = null;
-        if (_objects!=null) {
-          _objects_1=_objects.getObjects();
-        }
-        if (_objects_1!=null) {
-          final Consumer<EntityMockObject> _function_1 = new Consumer<EntityMockObject>() {
-            public void accept(final EntityMockObject mockObject) {
-              try {
-                EntityMockDSLJvmModelInferrer.this.generateMockObject(model, acceptor, pckg, mockObject);
-              } catch (final Throwable _t) {
-                if (_t instanceof Exception) {
-                  final Exception e = (Exception)_t;
-                  e.printStackTrace();
-                } else {
-                  throw Exceptions.sneakyThrow(_t);
-                }
-              }
-            }
-          };
-          _objects_1.forEach(_function_1);
-        }
-        EntityMockEntities _entities = pckg.getEntities();
-        EList<EntityMockEntity> _entities_1 = null;
-        if (_entities!=null) {
-          _entities_1=_entities.getEntities();
-        }
-        if (_entities_1!=null) {
-          final Consumer<EntityMockEntity> _function_2 = new Consumer<EntityMockEntity>() {
-            public void accept(final EntityMockEntity mockEntity) {
-              try {
-                EntityMockDSLJvmModelInferrer.this.generateMockEntity(model, acceptor, pckg, mockEntity);
-              } catch (final Throwable _t) {
-                if (_t instanceof Exception) {
-                  final Exception e = (Exception)_t;
-                  e.printStackTrace();
-                } else {
-                  throw Exceptions.sneakyThrow(_t);
-                }
-              }
-            }
-          };
-          _entities_1.forEach(_function_2);
-        }
-        try {
-          EntityMockDSLJvmModelInferrer.this.generateMockDataGenerator(model, acceptor, pckg);
-        } catch (final Throwable _t) {
-          if (_t instanceof Exception) {
-            final Exception e = (Exception)_t;
-            e.printStackTrace();
-          } else {
-            throw Exceptions.sneakyThrow(_t);
-          }
-        }
-      }
-    };
-    _packages.forEach(_function);
+    acceptor.<JvmGenericType>accept(mockClass, _function);
   }
   
   /**
@@ -3929,24 +3516,15 @@
    */
   public boolean canBeHandled(final EntityMockEntity mockEntityTodo, final ArrayList<EntityMockEntity> mockEntitiesDone) {
     EntityMockResource _byResource = mockEntityTodo.getByResource();
-    boolean _notEquals = (!Objects.equal(_byResource, null));
-    if (_notEquals) {
+    boolean _tripleNotEquals = (_byResource != null);
+    if (_tripleNotEquals) {
       return true;
     }
     EList<IEntityMockAttribute> _attributes = mockEntityTodo.getAttributes();
     for (final IEntityMockAttribute attribute : _attributes) {
       if ((attribute instanceof EntityMockAttributeByReference)) {
         EntityMockEntity referencedMockEntity = ((EntityMockAttributeByReference) attribute).getMockedEntity();
-        boolean _and = false;
-        boolean _notEquals_1 = (!Objects.equal(referencedMockEntity, null));
-        if (!_notEquals_1) {
-          _and = false;
-        } else {
-          boolean _contains = mockEntitiesDone.contains(referencedMockEntity);
-          boolean _not = (!_contains);
-          _and = _not;
-        }
-        if (_and) {
+        if (((referencedMockEntity != null) && (!mockEntitiesDone.contains(referencedMockEntity)))) {
           return false;
         }
       }
@@ -3957,124 +3535,93 @@
   /**
    * generate a mock object class
    */
-  public void generateMockResource(final EntityMockModel model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockPackage pckg, final EntityMockResource mockResource) {
-    StringConcatenation _builder = new StringConcatenation();
-    String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-    _builder.append(_entityMockName, "");
-    _builder.append(".");
-    String _entityMockName_1 = this.getEntityMockName(mockResource);
-    _builder.append(_entityMockName_1, "");
-    JvmGenericType _class = this._jvmTypesBuilder.toClass(model, _builder.toString());
-    final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() {
-      public void apply(final JvmGenericType it) {
-        EList<JvmTypeReference> _superTypes = it.getSuperTypes();
-        JvmTypeReference _typeRef = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(ABaseMockResource.class);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
-        StringConcatenation _builder = new StringConcatenation();
-        _builder.append("<b>This class was auto generated! Leave it unmodified to avoid unpredictable results!</b><br>");
-        _builder.newLine();
-        String _documentation = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.getDocumentation(mockResource);
-        _builder.append(_documentation, "");
-        _builder.newLineIfNotEmpty();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setDocumentation(it, _builder.toString());
-        it.setFinal(true);
-        JvmField field = null;
-        JvmTypeReference _typeRef_1 = EntityMockDSLJvmModelInferrer.this._typeReferenceBuilder.typeRef(Logger.class);
-        final Procedure1<JvmField> _function = new Procedure1<JvmField>() {
-          public void apply(final JvmField it) {
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                StringConcatenation _builder = new StringConcatenation();
-                _builder.append("LoggerFactory.getLogger(");
-                String _entityMockName = EntityMockDSLJvmModelInferrer.getEntityMockName(pckg);
-                _builder.append(_entityMockName, "");
-                _builder.append(".");
-                String _entityMockName_1 = EntityMockDSLJvmModelInferrer.this.getEntityMockName(mockResource);
-                _builder.append(_entityMockName_1, "");
-                _builder.append(".class)");
-                it.append(_builder);
+  public void generateMockResource(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockResource mockResource) {
+    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockResource, model));
+    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
+      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
+      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
+      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockResource.class);
+      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
+      JvmField field = null;
+      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
+        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("LoggerFactory.getLogger(\"mock\")");
+          it_2.append(_builder);
+        };
+        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
+      };
+      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
+      field.setFinal(true);
+      field.setStatic(true);
+      EList<JvmMember> _members = it.getMembers();
+      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+      EList<JvmMember> _members_1 = it.getMembers();
+      final Procedure1<JvmConstructor> _function_2 = (JvmConstructor it_1) -> {
+        final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
+          final List<String> attributes = new ArrayList<String>();
+          EList<EntityMockResourceAttribute> _attributes = mockResource.getAttributes();
+          for (final EntityMockResourceAttribute attribute : _attributes) {
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("\"");
+            String _name = attribute.getName();
+            _builder.append(_name);
+            _builder.append("\"");
+            attributes.add(_builder.toString());
+          }
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("setAttributes(");
+          String _join = StringUtils.join(attributes, ",");
+          _builder_1.append(_join);
+          _builder_1.append(");");
+          _builder_1.newLineIfNotEmpty();
+          it_2.append(_builder_1);
+          EList<EntityMockResourceDataRow> _datarows = mockResource.getDatarows();
+          for (final EntityMockResourceDataRow datarow : _datarows) {
+            {
+              final List<String> values = new ArrayList<String>();
+              StringConcatenation _builder_2 = new StringConcatenation();
+              _builder_2.append("\"");
+              String _name_1 = datarow.getName();
+              _builder_2.append(_name_1);
+              _builder_2.append("\"");
+              values.add(_builder_2.toString());
+              EList<String> _values = datarow.getValues();
+              for (final String value : _values) {
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("\"");
+                _builder_3.append(value);
+                _builder_3.append("\"");
+                values.add(_builder_3.toString());
               }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setInitializer(it, _function);
+              StringConcatenation _builder_4 = new StringConcatenation();
+              _builder_4.append("addDataRow(");
+              String _join_1 = StringUtils.join(values, ",");
+              _builder_4.append(_join_1);
+              _builder_4.append(");");
+              _builder_4.newLineIfNotEmpty();
+              it_2.append(_builder_4);
+            }
           }
         };
-        JvmField _field = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toField(model, "log", _typeRef_1, _function);
-        field = _field;
-        field.setFinal(true);
-        field.setStatic(true);
-        EList<JvmMember> _members = it.getMembers();
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
-        EList<JvmMember> _members_1 = it.getMembers();
-        final Procedure1<JvmConstructor> _function_1 = new Procedure1<JvmConstructor>() {
-          public void apply(final JvmConstructor it) {
-            final Procedure1<ITreeAppendable> _function = new Procedure1<ITreeAppendable>() {
-              public void apply(final ITreeAppendable it) {
-                final List<String> attributes = new ArrayList<String>();
-                EList<EntityMockResourceAttribute> _attributes = mockResource.getAttributes();
-                for (final EntityMockResourceAttribute attribute : _attributes) {
-                  StringConcatenation _builder = new StringConcatenation();
-                  _builder.append("\"");
-                  String _name = attribute.getName();
-                  _builder.append(_name, "");
-                  _builder.append("\"");
-                  attributes.add(_builder.toString());
-                }
-                StringConcatenation _builder_1 = new StringConcatenation();
-                _builder_1.append("setAttributes(");
-                String _join = StringUtils.join(attributes, ",");
-                _builder_1.append(_join, "");
-                _builder_1.append(");");
-                _builder_1.newLineIfNotEmpty();
-                it.append(_builder_1);
-                EList<EntityMockResourceDataRow> _datarows = mockResource.getDatarows();
-                for (final EntityMockResourceDataRow datarow : _datarows) {
-                  {
-                    final List<String> values = new ArrayList<String>();
-                    StringConcatenation _builder_2 = new StringConcatenation();
-                    _builder_2.append("\"");
-                    String _name_1 = datarow.getName();
-                    _builder_2.append(_name_1, "");
-                    _builder_2.append("\"");
-                    values.add(_builder_2.toString());
-                    EList<String> _values = datarow.getValues();
-                    for (final String value : _values) {
-                      StringConcatenation _builder_3 = new StringConcatenation();
-                      _builder_3.append("\"");
-                      _builder_3.append(value, "");
-                      _builder_3.append("\"");
-                      values.add(_builder_3.toString());
-                    }
-                    StringConcatenation _builder_4 = new StringConcatenation();
-                    _builder_4.append("addDataRow(");
-                    String _join_1 = StringUtils.join(values, ",");
-                    _builder_4.append(_join_1, "");
-                    _builder_4.append(");");
-                    _builder_4.newLineIfNotEmpty();
-                    it.append(_builder_4);
-                  }
-                }
-              }
-            };
-            EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.setBody(it, _function);
-          }
-        };
-        JvmConstructor _constructor = EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.toConstructor(pckg, _function_1);
-        EntityMockDSLJvmModelInferrer.this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_1, _constructor);
-      }
+        this._jvmTypesBuilder.setBody(it_1, _function_3);
+      };
+      JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(model, _function_2);
+      this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_1, _constructor);
     };
-    acceptor.<JvmGenericType>accept(_class, _function);
+    acceptor.<JvmGenericType>accept(mockClass, _function);
   }
   
-  public void infer(final EObject model, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
-    if (model instanceof EntityMockModel) {
-      _infer((EntityMockModel)model, acceptor, isPreIndexingPhase);
+  public void infer(final EObject mock, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
+    if (mock instanceof EntityMock) {
+      _infer((EntityMock)mock, acceptor, isPreIndexingPhase);
       return;
-    } else if (model != null) {
-      _infer(model, acceptor, isPreIndexingPhase);
+    } else if (mock != null) {
+      _infer(mock, acceptor, isPreIndexingPhase);
       return;
     } else {
       throw new IllegalArgumentException("Unhandled parameter types: " +
-        Arrays.<Object>asList(model, acceptor, isPreIndexingPhase).toString());
+        Arrays.<Object>asList(mock, acceptor, isPreIndexingPhase).toString());
     }
   }
 }
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/.gitignore
new file mode 100644
index 0000000..4f7d52e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLScopeProvider.java
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.java
index 6237cec..f13548c 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/scoping/EntityMockDSLScopeProvider.java
@@ -24,6 +24,7 @@
 import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
@@ -31,6 +32,7 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
 import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
+import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
 import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed;
@@ -41,13 +43,12 @@
 import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
 import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
-import org.eclipse.osbp.xtext.entitymock.EntityMockTemporary;
 import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
+import org.eclipse.osbp.xtext.entitymock.scoping.AbstractEntityMockDSLScopeProvider;
 import org.eclipse.xtext.resource.EObjectDescription;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.MapBasedScope;
-import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider;
 import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 import org.eclipse.xtext.xbase.lib.IterableExtensions;
 
@@ -58,166 +59,183 @@
  * on how and when to use it
  */
 @SuppressWarnings("all")
-public class EntityMockDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider {
+public class EntityMockDSLScopeProvider extends AbstractEntityMockDSLScopeProvider {
+  @Override
   public IScope getScope(final EObject context, final EReference reference) {
     IScope _xblockexpression = null;
     {
-      boolean _equals = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION);
-      if (_equals) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION)) {
         return this.getScope_MockObjectEnum(context);
       }
-      boolean _equals_1 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW);
-      if (_equals_1) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW)) {
         return this.getScope_MockObjectEnumValue(context);
       }
-      boolean _equals_2 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED);
-      if (_equals_2) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED)) {
         return this.getScope_MockObjectEmbed(context);
       }
-      boolean _equals_3 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE);
-      if (_equals_3) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE)) {
         return this.getScope_MockObjectAttribute(context);
       }
-      boolean _equals_4 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF);
-      if (_equals_4) {
-        return this.getLEntityAttributes(context);
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF)) {
+        return this.getEntityAttributes(context);
       }
-      boolean _equals_5 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY__ITERATOR);
-      if (_equals_5) {
-        return this.getLEntityAttributes(context);
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY__ITERATOR)) {
+        return this.getEntityAttributes(context);
       }
-      boolean _equals_6 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF);
-      if (_equals_6) {
-        return this.getLEntityAttributes(context);
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF)) {
+        return this.getEntityAttributes(context);
       }
-      boolean _equals_7 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF);
-      if (_equals_7) {
-        return this.getLEntityReferences(context);
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION__ATTRIBUTE_REF)) {
+        return this.getEntityAttributes(context);
       }
-      boolean _equals_8 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF);
-      if (_equals_8) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF)) {
+        return this.getNestedAttributes(context);
+      }
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE)) {
+        return this.getNestedAttributes(context);
+      }
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE)) {
+        return this.getNestedAttributesAttribute(context);
+      }
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE)) {
+        return this.getEntityReferences(context);
+      }
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF)) {
+        return this.getEntityReferences(context);
+      }
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF)) {
         boolean _matched = false;
-        if (!_matched) {
-          if (Objects.equal(context, EntityMockAttributeByObject.class)) {
-            _matched=true;
-            EObject _eContainer = context.eContainer();
-            ArrayList<IEObjectDescription> _entityAttributes = this.getEntityAttributes(((EntityMockEntity) _eContainer), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes);
-          }
+        if (context instanceof EntityMockAttributeByObject) {
+          _matched=true;
+          EObject _eContainer = ((EntityMockAttributeByObject)context).eContainer();
+          return MapBasedScope.createScope(IScope.NULLSCOPE, 
+            this.getEntityAttributes(((EntityMockEntity) _eContainer), null));
         }
         if (!_matched) {
-          if (Objects.equal(context, EntityMockEntity.class)) {
+          if (context instanceof EntityMockEntity) {
             _matched=true;
-            ArrayList<IEObjectDescription> _entityAttributes_1 = this.getEntityAttributes(((EntityMockEntity) context), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes_1);
+            return MapBasedScope.createScope(IScope.NULLSCOPE, 
+              this.getEntityAttributes(((EntityMockEntity) context), null));
           }
         }
       }
-      boolean _equals_9 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF);
-      if (_equals_9) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF)) {
         boolean _matched_1 = false;
-        if (!_matched_1) {
-          if (Objects.equal(context, EntityMockAttributeFiller.class)) {
-            _matched_1=true;
-            EObject _eContainer_1 = context.eContainer();
-            ArrayList<IEObjectDescription> _entityAttributes_2 = this.getEntityAttributes(((EntityMockEntity) _eContainer_1), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes_2);
-          }
+        if (context instanceof EntityMockAttributeFiller) {
+          _matched_1=true;
+          EObject _eContainer = ((EntityMockAttributeFiller)context).eContainer();
+          return MapBasedScope.createScope(IScope.NULLSCOPE, 
+            this.getEntityAttributes(((EntityMockEntity) _eContainer), null));
         }
         if (!_matched_1) {
-          if (Objects.equal(context, EntityMockEntities.class)) {
+          if (context instanceof EntityMockEntities) {
             _matched_1=true;
-            ArrayList<IEObjectDescription> _entityAttributes_3 = this.getEntityAttributes(((EntityMockEntities) context), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes_3);
+            return MapBasedScope.createScope(IScope.NULLSCOPE, 
+              this.getEntityAttributes(((EntityMockEntities) context), null));
           }
         }
       }
-      boolean _equals_10 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF);
-      if (_equals_10) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF)) {
         boolean _matched_2 = false;
-        if (!_matched_2) {
-          if (Objects.equal(context, EntityMockAttributeByReference.class)) {
-            _matched_2=true;
-            EObject _eContainer_2 = context.eContainer();
-            ArrayList<IEObjectDescription> _entityAttributes_4 = this.getEntityAttributes(((EntityMockEntity) _eContainer_2), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes_4);
-          }
+        if (context instanceof EntityMockAttributeByReference) {
+          _matched_2=true;
+          EObject _eContainer = ((EntityMockAttributeByReference)context).eContainer();
+          return MapBasedScope.createScope(IScope.NULLSCOPE, 
+            this.getEntityAttributes(((EntityMockEntity) _eContainer), null));
         }
         if (!_matched_2) {
-          if (Objects.equal(context, EntityMockEntities.class)) {
+          if (context instanceof EntityMockEntities) {
             _matched_2=true;
-            ArrayList<IEObjectDescription> _entityAttributes_5 = this.getEntityAttributes(((EntityMockEntities) context), null);
-            return MapBasedScope.createScope(IScope.NULLSCOPE, _entityAttributes_5);
+            return MapBasedScope.createScope(IScope.NULLSCOPE, 
+              this.getEntityAttributes(((EntityMockEntities) context), null));
           }
         }
       }
-      boolean _equals_11 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY);
-      if (_equals_11) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY)) {
         return this.getScope_MockAttributeReferencedMockedEntity(context);
       }
-      boolean _equals_12 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE);
-      if (_equals_12) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE)) {
         return this.getScope_MockAttributeResourceAttribute(context);
       }
-      boolean _equals_13 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE);
-      if (_equals_13) {
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE)) {
         return this.getScope_MockEntityResourceAttribute(context);
       }
-      boolean _equals_14 = Objects.equal(reference, EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF);
-      if (_equals_14) {
-        return this.getLEntityAttributes(context);
+      if ((reference == EntityMockDSLPackage.Literals.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF)) {
+        return this.getEntityAttributes(context);
       }
       _xblockexpression = super.getScope(context, reference);
     }
     return _xblockexpression;
   }
   
-  public LEntity getCCEntityRef(final EObject context) {
+  public LEntity getEntityRef(final EObject context) {
     EObject eObj = context;
-    while ((!(eObj instanceof EntityMockEntity))) {
-      EObject _eContainer = eObj.eContainer();
-      eObj = _eContainer;
+    while (((eObj != null) && (!(eObj instanceof EntityMockEntity)))) {
+      eObj = eObj.eContainer();
     }
-    boolean _notEquals = (!Objects.equal(eObj, null));
-    if (_notEquals) {
+    if ((eObj != null)) {
       return ((EntityMockEntity) eObj).getEntityRef();
     } else {
       return null;
     }
   }
   
-  public IScope getLEntityAttributes(final EObject context) {
+  public IScope getNestedAttributesAttribute(final EObject context) {
     ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
-    LEntity entity = this.getCCEntityRef(context);
-    boolean _notEquals = (!Objects.equal(entity, null));
-    if (_notEquals) {
-      List<LEntityAttribute> _allAttributes = entity.getAllAttributes();
-      for (final LEntityAttribute attr : _allAttributes) {
-        String _name = attr.getName();
-        boolean _notEquals_1 = (!Objects.equal(_name, null));
-        if (_notEquals_1) {
-          String _name_1 = attr.getName();
-          IEObjectDescription _create = EObjectDescription.create(_name_1, ((LEntityAttribute) attr));
-          result.add(_create);
+    LEntityReference reference = ((EntityMockEntityNestedAttribute) context).getReference();
+    if (((reference != null) && (!Objects.equal(reference.getType(), null)))) {
+      List<LEntityAttribute> _allAttributes = reference.getType().getAllAttributes();
+      for (final LEntityAttribute a : _allAttributes) {
+        result.add(EObjectDescription.create(a.getName(), a));
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getNestedAttributes(final EObject context) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    LEntity entity = this.getEntityRef(context);
+    if ((entity != null)) {
+      List<LEntityFeature> _allFeatures = entity.getAllFeatures();
+      for (final LEntityFeature f : _allFeatures) {
+        boolean _matched = false;
+        if (f instanceof LEntityAttribute) {
+          _matched=true;
+          result.add(EObjectDescription.create(((LEntityAttribute)f).getName(), f));
+        }
+        if (!_matched) {
+          if (f instanceof LEntityReference) {
+            _matched=true;
+            result.add(EObjectDescription.create(((LEntityReference)f).getName(), f));
+          }
         }
       }
     }
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
   }
   
-  public IScope getLEntityReferences(final EObject context) {
+  public IScope getEntityAttributes(final EObject context) {
     ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
-    LEntity entity = this.getCCEntityRef(context);
-    boolean _notEquals = (!Objects.equal(entity, null));
-    if (_notEquals) {
+    LEntity entity = this.getEntityRef(context);
+    if ((entity != null)) {
+      List<LEntityAttribute> _allAttributes = entity.getAllAttributes();
+      for (final LEntityAttribute attr : _allAttributes) {
+        result.add(EObjectDescription.create(attr.getName(), attr));
+      }
+    }
+    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
+  }
+  
+  public IScope getEntityReferences(final EObject context) {
+    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
+    LEntity entity = this.getEntityRef(context);
+    if ((entity != null)) {
       List<LEntityReference> _allReferences = entity.getAllReferences();
       for (final LEntityReference ref : _allReferences) {
         String _name = ref.getName();
-        boolean _notEquals_1 = (!Objects.equal(_name, null));
-        if (_notEquals_1) {
-          String _name_1 = ref.getName();
-          IEObjectDescription _create = EObjectDescription.create(_name_1, ((LEntityReference) ref));
-          result.add(_create);
+        boolean _tripleNotEquals = (_name != null);
+        if (_tripleNotEquals) {
+          result.add(EObjectDescription.create(ref.getName(), ((LEntityReference) ref)));
         }
       }
     }
@@ -229,17 +247,13 @@
    */
   public ArrayList<IEObjectDescription> getEntityAttributes(final EntityMockEntities mockEntities, final ArrayList<IEObjectDescription> result) {
     ArrayList<IEObjectDescription> iresult = result;
-    boolean _equals = Objects.equal(iresult, null);
-    if (_equals) {
-      ArrayList<IEObjectDescription> _newArrayList = CollectionLiterals.<IEObjectDescription>newArrayList();
-      iresult = _newArrayList;
+    if ((iresult == null)) {
+      iresult = CollectionLiterals.<IEObjectDescription>newArrayList();
     }
-    boolean _notEquals = (!Objects.equal(mockEntities, null));
-    if (_notEquals) {
+    if ((mockEntities != null)) {
       EList<EntityMockEntity> _entities = mockEntities.getEntities();
       for (final EntityMockEntity mockEntity : _entities) {
-        ArrayList<IEObjectDescription> _entityAttributes = this.getEntityAttributes(mockEntity, iresult);
-        iresult = _entityAttributes;
+        iresult = this.getEntityAttributes(mockEntity, iresult);
       }
     }
     return iresult;
@@ -250,16 +264,11 @@
    */
   public ArrayList<IEObjectDescription> getEntityAttributes(final EntityMockEntity mockEntity, final ArrayList<IEObjectDescription> result) {
     ArrayList<IEObjectDescription> iresult = result;
-    boolean _equals = Objects.equal(iresult, null);
-    if (_equals) {
-      ArrayList<IEObjectDescription> _newArrayList = CollectionLiterals.<IEObjectDescription>newArrayList();
-      iresult = _newArrayList;
+    if ((iresult == null)) {
+      iresult = CollectionLiterals.<IEObjectDescription>newArrayList();
     }
-    boolean _notEquals = (!Objects.equal(mockEntity, null));
-    if (_notEquals) {
-      LEntity _entityRef = mockEntity.getEntityRef();
-      ArrayList<IEObjectDescription> _entityAttributes = this.getEntityAttributes(_entityRef, iresult);
-      iresult = _entityAttributes;
+    if ((mockEntity != null)) {
+      iresult = this.getEntityAttributes(mockEntity.getEntityRef(), iresult);
     }
     return iresult;
   }
@@ -269,21 +278,16 @@
    */
   public ArrayList<IEObjectDescription> getEntityAttributes(final LEntity entity, final ArrayList<IEObjectDescription> result) {
     ArrayList<IEObjectDescription> iresult = result;
-    boolean _equals = Objects.equal(iresult, null);
-    if (_equals) {
-      ArrayList<IEObjectDescription> _newArrayList = CollectionLiterals.<IEObjectDescription>newArrayList();
-      iresult = _newArrayList;
+    if ((iresult == null)) {
+      iresult = CollectionLiterals.<IEObjectDescription>newArrayList();
     }
-    boolean _notEquals = (!Objects.equal(entity, null));
-    if (_notEquals) {
+    if ((entity != null)) {
       List<LEntityAttribute> _allAttributes = entity.getAllAttributes();
       for (final LEntityAttribute attribute : _allAttributes) {
         String _name = attribute.getName();
-        boolean _notEquals_1 = (!Objects.equal(_name, null));
-        if (_notEquals_1) {
-          String _name_1 = attribute.getName();
-          IEObjectDescription _create = EObjectDescription.create(_name_1, attribute);
-          iresult.add(_create);
+        boolean _tripleNotEquals = (_name != null);
+        if (_tripleNotEquals) {
+          iresult.add(EObjectDescription.create(attribute.getName(), attribute));
         }
       }
     }
@@ -291,27 +295,6 @@
   }
   
   /**
-   * get all available entity attributes contained in LEntity and return them as an IScope
-   */
-  public IScope getLEntity_attributeRef(final EObject context, final LEntity entity) {
-    ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
-    boolean _notEquals = (!Objects.equal(entity, null));
-    if (_notEquals) {
-      List<LEntityAttribute> _allAttributes = entity.getAllAttributes();
-      for (final LEntityAttribute attribute : _allAttributes) {
-        String _name = attribute.getName();
-        boolean _notEquals_1 = (!Objects.equal(_name, null));
-        if (_notEquals_1) {
-          String _name_1 = attribute.getName();
-          IEObjectDescription _create = EObjectDescription.create(_name_1, attribute);
-          result.add(_create);
-        }
-      }
-    }
-    return MapBasedScope.createScope(IScope.NULLSCOPE, result);
-  }
-  
-  /**
    * get all available mock objects and add them as an IScope
    */
   public IScope getScope_MockObjectEmbed(final EObject object) {
@@ -321,11 +304,9 @@
       emroa = ((EntityMockReferencedObjectAttribute)object);
     }
     if ((object instanceof EntityMockAttributeByObject)) {
-      EntityMockReferencedObjectAttribute _reference = ((EntityMockAttributeByObject)object).getReference();
-      emroa = _reference;
+      emroa = ((EntityMockAttributeByObject)object).getReference();
     }
-    EntityMockTemporary _temporary = emroa.getTemporary();
-    EntityMockObject mockObject = _temporary.getObject();
+    EntityMockObject mockObject = emroa.getTemplate().getObject();
     this.getScope_MockObjectRecursiveEmbed(result, mockObject);
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
   }
@@ -334,16 +315,12 @@
    * get all available mock objects recursively and add them to result
    */
   public void getScope_MockObjectRecursiveEmbed(final List<IEObjectDescription> result, final EntityMockObject mockObject) {
-    boolean _notEquals = (!Objects.equal(mockObject, null));
-    if (_notEquals) {
+    if ((mockObject != null)) {
       EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
       for (final IEntityMockObjectAttribute attribute : _attributes) {
         if ((attribute instanceof EntityMockObjectEmbed)) {
-          String _name = ((EntityMockObjectEmbed)attribute).getName();
-          IEObjectDescription _create = EObjectDescription.create(_name, attribute);
-          result.add(_create);
-          EntityMockObject _object = ((EntityMockObjectEmbed)attribute).getObject();
-          this.getScope_MockObjectRecursiveEmbed(result, _object);
+          result.add(EObjectDescription.create(((EntityMockObjectEmbed)attribute).getName(), attribute));
+          this.getScope_MockObjectRecursiveEmbed(result, ((EntityMockObjectEmbed)attribute).getObject());
         }
       }
     }
@@ -359,42 +336,32 @@
       emroa = ((EntityMockReferencedObjectAttribute)object);
     }
     if ((object instanceof EntityMockAttributeByObject)) {
-      EntityMockReferencedObjectAttribute _reference = ((EntityMockAttributeByObject)object).getReference();
-      emroa = _reference;
+      emroa = ((EntityMockAttributeByObject)object).getReference();
     }
-    EntityMockTemporary _temporary = emroa.getTemporary();
-    EntityMockObject mockObject = _temporary.getObject();
-    EList<EntityMockObjectEmbed> _embedded = emroa.getEmbedded();
-    boolean _isEmpty = _embedded.isEmpty();
+    EntityMockObject mockObject = emroa.getTemplate().getObject();
+    boolean _isEmpty = emroa.getEmbedded().isEmpty();
     boolean _not = (!_isEmpty);
     if (_not) {
-      EList<EntityMockObjectEmbed> _embedded_1 = emroa.getEmbedded();
-      EntityMockObjectEmbed _last = IterableExtensions.<EntityMockObjectEmbed>last(_embedded_1);
-      EntityMockObject _object = _last.getObject();
-      mockObject = _object;
+      mockObject = IterableExtensions.<EntityMockObjectEmbed>last(emroa.getEmbedded()).getObject();
     }
-    boolean _notEquals = (!Objects.equal(mockObject, null));
-    if (_notEquals) {
+    if ((mockObject != null)) {
       EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
       for (final EntityMockObjectEnum enumeration : _enumerations) {
-        String _name = ((EntityMockObjectEnum) enumeration).getName();
-        IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockObjectEnum) enumeration));
-        result.add(_create);
+        result.add(
+          EObjectDescription.create(((EntityMockObjectEnum) enumeration).getName(), ((EntityMockObjectEnum) enumeration)));
       }
       EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
       for (final IEntityMockObjectAttribute attribute : _attributes) {
         if ((attribute instanceof EntityMockObjectEmbed)) {
         } else {
-          String _name_1 = ((IEntityMockObjectAttribute) attribute).getName();
-          IEObjectDescription _create_1 = EObjectDescription.create(_name_1, ((IEntityMockObjectAttribute) attribute));
-          result.add(_create_1);
+          result.add(
+            EObjectDescription.create(((IEntityMockObjectAttribute) attribute).getName(), ((IEntityMockObjectAttribute) attribute)));
         }
       }
       EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
       for (final EntityMockObjectFunction calculation : _calculations) {
-        String _name_2 = ((EntityMockObjectFunction) calculation).getName();
-        IEObjectDescription _create_2 = EObjectDescription.create(_name_2, ((EntityMockObjectFunction) calculation));
-        result.add(_create_2);
+        result.add(
+          EObjectDescription.create(((EntityMockObjectFunction) calculation).getName(), ((EntityMockObjectFunction) calculation)));
       }
     }
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
@@ -409,9 +376,8 @@
     if ((mockObject instanceof EntityMockObject)) {
       EList<EntityMockObjectEnum> _enumerations = ((EntityMockObject)mockObject).getEnumerations();
       for (final EntityMockObjectEnum objectEnum : _enumerations) {
-        String _name = ((EntityMockObjectEnum) objectEnum).getName();
-        IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockObjectEnum) objectEnum));
-        result.add(_create);
+        result.add(
+          EObjectDescription.create(((EntityMockObjectEnum) objectEnum).getName(), ((EntityMockObjectEnum) objectEnum)));
       }
     }
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
@@ -423,31 +389,24 @@
   public IScope getScope_MockObjectEnumValue(final EObject object) {
     ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
     EObject mockValueItem = object;
-    while (((!(mockValueItem instanceof EntityMockObjectArrayValue)) && (!Objects.equal(mockValueItem, null)))) {
-      EObject _eContainer = mockValueItem.eContainer();
-      mockValueItem = _eContainer;
+    while (((!(mockValueItem instanceof EntityMockObjectArrayValue)) && (mockValueItem != null))) {
+      mockValueItem = mockValueItem.eContainer();
     }
     if ((mockValueItem instanceof EntityMockObjectArrayValue)) {
-      EntityMockObjectEnum _enumeration = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-      LEnum _usingResource = _enumeration.getUsingResource();
+      LEnum _usingResource = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
       if ((_usingResource instanceof EntityMockResource)) {
-        EntityMockObjectEnum _enumeration_1 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-        LEnum _usingResource_1 = _enumeration_1.getUsingResource();
+        LEnum _usingResource_1 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
         final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
         EList<EntityMockResourceDataRow> _datarows = resource.getDatarows();
         for (final EntityMockResourceDataRow datarow : _datarows) {
-          String _name = ((EntityMockResourceDataRow) datarow).getName();
-          IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockResourceDataRow) datarow));
-          result.add(_create);
+          result.add(
+            EObjectDescription.create(((EntityMockResourceDataRow) datarow).getName(), ((EntityMockResourceDataRow) datarow)));
         }
       } else {
-        EntityMockObjectEnum _enumeration_2 = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration();
-        final LEnum lenum = _enumeration_2.getUsingResource();
+        final LEnum lenum = ((EntityMockObjectArrayValue)mockValueItem).getEnumeration().getUsingResource();
         EList<LEnumLiteral> _literals = lenum.getLiterals();
         for (final LEnumLiteral datarow_1 : _literals) {
-          String _name_1 = datarow_1.getName();
-          IEObjectDescription _create_1 = EObjectDescription.create(_name_1, datarow_1);
-          result.add(_create_1);
+          result.add(EObjectDescription.create(datarow_1.getName(), datarow_1));
         }
       }
     }
@@ -463,26 +422,20 @@
     if ((object instanceof EntityMockAttributeByReference)) {
       attributeByReference = ((EntityMockAttributeByReference)object);
     }
-    boolean _notEquals = (!Objects.equal(attributeByReference, null));
-    if (_notEquals) {
-      LEntityReference _attributeRef = attributeByReference.getAttributeRef();
-      LEntity requested_entityRef = _attributeRef.getType();
-      boolean _notEquals_1 = (!Objects.equal(requested_entityRef, null));
-      if (_notEquals_1) {
+    if ((attributeByReference != null)) {
+      LEntity requested_entityRef = attributeByReference.getAttributeRef().getType();
+      if ((requested_entityRef != null)) {
         EObject mockEntities = object.eContainer();
         while (((!(mockEntities instanceof EntityMockEntities)) && (!Objects.equal(mockEntities, null)))) {
-          EObject _eContainer = mockEntities.eContainer();
-          mockEntities = _eContainer;
+          mockEntities = mockEntities.eContainer();
         }
         if ((mockEntities instanceof EntityMockEntities)) {
           EList<EntityMockEntity> _entities = ((EntityMockEntities)mockEntities).getEntities();
           for (final EntityMockEntity mockEntity : _entities) {
-            LEntity _entityRef = mockEntity.getEntityRef();
-            boolean _equals = requested_entityRef.equals(_entityRef);
+            boolean _equals = requested_entityRef.equals(mockEntity.getEntityRef());
             if (_equals) {
-              String _name = ((EntityMockEntity) mockEntity).getName();
-              IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockEntity) mockEntity));
-              result.add(_create);
+              result.add(
+                EObjectDescription.create(((EntityMockEntity) mockEntity).getName(), ((EntityMockEntity) mockEntity)));
             }
           }
         }
@@ -497,28 +450,22 @@
   public IScope getScope_MockAttributeResourceAttribute(final EObject object) {
     ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
     EObject objectResourceValue = object;
-    while (((!(objectResourceValue instanceof EntityMockObjectResourceValue)) && (!Objects.equal(objectResourceValue, null)))) {
-      EObject _eContainer = objectResourceValue.eContainer();
-      objectResourceValue = _eContainer;
+    while (((!(objectResourceValue instanceof EntityMockObjectResourceValue)) && (objectResourceValue != null))) {
+      objectResourceValue = objectResourceValue.eContainer();
     }
     if ((objectResourceValue instanceof EntityMockObjectResourceValue)) {
-      EntityMockObjectEnum _resourceEnum = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum();
-      LEnum _usingResource = _resourceEnum.getUsingResource();
+      LEnum _usingResource = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum().getUsingResource();
       if ((_usingResource instanceof EntityMockResource)) {
-        EntityMockObjectEnum _resourceEnum_1 = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum();
-        LEnum _usingResource_1 = _resourceEnum_1.getUsingResource();
+        LEnum _usingResource_1 = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum().getUsingResource();
         final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
         EList<EntityMockResourceAttribute> _attributes = resource.getAttributes();
         for (final EntityMockResourceAttribute attribute : _attributes) {
-          String _name = ((EntityMockResourceAttribute) attribute).getName();
-          IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockResourceAttribute) attribute));
-          result.add(_create);
+          result.add(
+            EObjectDescription.create(((EntityMockResourceAttribute) attribute).getName(), ((EntityMockResourceAttribute) attribute)));
         }
       } else {
-        EntityMockObjectEnum _resourceEnum_2 = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum();
-        final LEnum lenum = _resourceEnum_2.getUsingResource();
-        IEObjectDescription _create_1 = EObjectDescription.create("name", lenum);
-        result.add(_create_1);
+        final LEnum lenum = ((EntityMockObjectResourceValue)objectResourceValue).getResourceEnum().getUsingResource();
+        result.add(EObjectDescription.create("name", lenum));
       }
     }
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
@@ -530,17 +477,14 @@
   public IScope getScope_MockEntityResourceAttribute(final EObject object) {
     ArrayList<IEObjectDescription> result = CollectionLiterals.<IEObjectDescription>newArrayList();
     EObject mockEntity = object;
-    while (((!(mockEntity instanceof EntityMockEntity)) && (!Objects.equal(mockEntity, null)))) {
-      EObject _eContainer = mockEntity.eContainer();
-      mockEntity = _eContainer;
+    while (((!(mockEntity instanceof EntityMockEntity)) && (mockEntity != null))) {
+      mockEntity = mockEntity.eContainer();
     }
     if ((mockEntity instanceof EntityMockEntity)) {
-      EntityMockResource _byResource = ((EntityMockEntity)mockEntity).getByResource();
-      EList<EntityMockResourceAttribute> _attributes = _byResource.getAttributes();
+      EList<EntityMockResourceAttribute> _attributes = ((EntityMockEntity)mockEntity).getByResource().getAttributes();
       for (final EntityMockResourceAttribute attribute : _attributes) {
-        String _name = ((EntityMockResourceAttribute) attribute).getName();
-        IEObjectDescription _create = EObjectDescription.create(_name, ((EntityMockResourceAttribute) attribute));
-        result.add(_create);
+        result.add(
+          EObjectDescription.create(((EntityMockResourceAttribute) attribute).getName(), ((EntityMockResourceAttribute) attribute)));
       }
     }
     return MapBasedScope.createScope(IScope.NULLSCOPE, result);
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/.gitignore b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/.gitignore
new file mode 100644
index 0000000..b87600e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/.gitignore
@@ -0,0 +1 @@
+/EntityMockDSLValidator.java
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.java
index e0366c3..7d533fb 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/validation/EntityMockDSLValidator.java
@@ -14,7 +14,15 @@
  */
 package org.eclipse.osbp.xtext.entitymock.validation;
 
+import java.util.HashSet;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.xtext.entitymock.EntityMock;
+import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
+import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
 import org.eclipse.osbp.xtext.entitymock.validation.AbstractEntityMockDSLValidator;
+import org.eclipse.xtext.validation.Check;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 
 /**
  * Custom validation rules.
@@ -23,4 +31,29 @@
  */
 @SuppressWarnings("all")
 public class EntityMockDSLValidator extends AbstractEntityMockDSLValidator {
+  @Check
+  public void checkDuplicateElementId(final EntityMock mock) {
+    EObject eObj = mock.eContainer();
+    while ((!(eObj instanceof EntityMockPackage))) {
+      eObj = eObj.eContainer();
+    }
+    if ((eObj != null)) {
+      EntityMockPackage mockPackage = ((EntityMockPackage) eObj);
+      EntityMock _findDuplicateChartNames = this.findDuplicateChartNames(mockPackage.getMocks(), mock.getName());
+      boolean _tripleNotEquals = (_findDuplicateChartNames != null);
+      if (_tripleNotEquals) {
+        this.error("Duplicate name \'".concat(mock.getName()).concat("\'!"), EntityMockDSLPackage.Literals.ENTITY_MOCK__NAME);
+      }
+    }
+  }
+  
+  private EntityMock findDuplicateChartNames(final EList<EntityMock> mocks, final String mockName) {
+    HashSet<String> tempSet = CollectionLiterals.<String>newHashSet();
+    for (final EntityMock mock : mocks) {
+      if (((!tempSet.add(mock.getName())) && mock.getName().equals(mockName))) {
+        return mock;
+      }
+    }
+    return null;
+  }
 }
diff --git a/pom.xml b/pom.xml
index 23b7854..5896d77 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
         <module>org.eclipse.osbp.utils.entitymock.dbfill.ui</module>
         <module>org.eclipse.osbp.xtext.entitymock</module>
         <module>org.eclipse.osbp.xtext.entitymock.tests</module>
+        <module>org.eclipse.osbp.xtext.entitymock.ide</module>
         <module>org.eclipse.osbp.xtext.entitymock.ui</module>
         <module>org.eclipse.osbp.xtext.entitymock.feature</module>
         <!-- <module>org.eclipse.osbp.xtext.entitymock.p2</module> -->
@@ -109,4 +110,13 @@
             </plugins>
         </pluginManagement>
     </build>
+    <dependencies>
+		<dependency>
+			<groupId>org.eclipse.osbp.dependencies</groupId>
+			<artifactId>
+				org.eclipse.osbp.dependencies.bundle.activemq.all.osgi
+			</artifactId>
+			<version>5.14.5-SNAPSHOT</version>
+		</dependency>
+    </dependencies>
 </project>
